diff --git a/client/src/main/java/envoy/client/Main.java b/client/src/main/java/envoy/client/Main.java index 842e37d..d64d075 100644 --- a/client/src/main/java/envoy/client/Main.java +++ b/client/src/main/java/envoy/client/Main.java @@ -9,16 +9,17 @@ import envoy.client.ui.Startup; *
* To allow Maven shading, the main method has to be separated from the * {@link Startup} class which extends {@link Application}. - *
- * Project: envoy-client
- * File: Main.java
- * Created: 05.07.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
*/
public final class Main {
+ /**
+ * A funny debug switch put in by {@code delvh} to enable easy debugging.
+ *
+ * @since Envoy Client v0.2-beta
+ */
private static final boolean debug = false;
/**
diff --git a/client/src/main/java/envoy/client/data/Cache.java b/client/src/main/java/envoy/client/data/Cache.java
index 25b985e..e638f7b 100644
--- a/client/src/main/java/envoy/client/data/Cache.java
+++ b/client/src/main/java/envoy/client/data/Cache.java
@@ -1,20 +1,14 @@
package envoy.client.data;
import java.io.Serializable;
-import java.util.LinkedList;
-import java.util.Queue;
+import java.util.*;
import java.util.function.Consumer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.logging.*;
import envoy.util.EnvoyLog;
/**
* Stores elements in a queue to process them later.
- *
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: client
- * Project: envoy-client
* The managed objects are stored inside a folder in the local file system.
- *
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
* Usage example:
* Usage example:
- * Project: envoy-client
- * Project: client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * The default is
- *
- * Project: envoy-client
- * While it does work, it is not the most efficient algorithm possible.
- *
- * @param toRefresh the listView to refresh
- * @param
- * Project: envoy-client
* When a scene is loaded, the style sheet for the current theme is applied to
* it.
- *
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: client
* To create a group, a button is available that loads the
* {@link GroupCreationTab}.
- *
- * Project: envoy-client
- * Project: envoy-client
- * Project: client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-client
- * Project: client
- * Project: envoy-client
- * Project: client
- * Project: envoy-client
- * Project: envoy-client
- * Project: client
* (i.e. can get all {@code JComponents} (Swing) or {@code Nodes} (JavaFX) in a
* GUI class).
*
@@ -41,13 +36,11 @@ public final class ReflectionUtil {
return Arrays.stream(instance.getClass().getDeclaredFields()).filter(field -> typeToReturn.isAssignableFrom(field.getType())).map(field -> {
try {
field.setAccessible(true);
- final var value = field.get(instance);
- return value;
+ return typeToReturn.cast(field.get(instance));
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new RuntimeException(e);
}
- }).map(typeToReturn::cast);// field ->
- // typeToReturn.isAssignableFrom(field.getClass())).map(typeToReturn::cast);
+ });
}
/**
diff --git a/client/src/main/java/envoy/client/util/package-info.java b/client/src/main/java/envoy/client/util/package-info.java
index c6b342e..77db956 100644
--- a/client/src/main/java/envoy/client/util/package-info.java
+++ b/client/src/main/java/envoy/client/util/package-info.java
@@ -1,9 +1,5 @@
/**
* This package contains utility classes for use in envoy-client.
- *
- * Project: envoy-client
- * Project: envoy-common
- * Project: envoy-client
* All {@code ConfigItem}s are automatically mandatory.
- *
- * Project: envoy-clientChess
* If the authentication is performed with a token, the token is stored instead
* of the password.
- *
- * Project: envoy-common
* These can be: {@link ElementOperation#ADD} or
- * {@link ElementOperation#REMOVE}.
- * Project: envoy-common
- * Project: common
* Possible actions are adding or removing certain {@link User}s to or from a
* certain {@link Group}.
- *
- * Project: envoy-common
- * Project: envoy-client
* Currently set to 3.5 seconds.
*
* @since Envoy Common v0.2-beta
@@ -28,8 +25,8 @@ public final class IsTyping extends Event
- * Project: common
* a) the server of the name change of a user or a group.
* b) another user of this users name change.
*
- * Project: envoy-common
- * Project: envoy-common
- * Project: common
- * Project: envoy-common
- * Project: envoy-common
- * Project: envoy-common
- * Project: envoy-common
- * Project: envoy-client
- * Project: envoy-client
- * Project: envoy-server-standalone
- * Project: envoy-server-standalone
- * Project: server
- * Project: envoy-server-standalone
- * Project: envoy-server-standalone
- * Project: envoy-server
- * Project: envoy-server-standalone
- * Project: envoy-server-standalone
- * Project: envoy-server-standalone
- * File: Cache.java
- * Created: 6 Feb 2020
*
* @param
- * File: CacheMap.java
- * Created: 09.07.2020
- *
+ *
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
*/
@@ -23,7 +18,7 @@ public final class CacheMap implements Serializable {
/**
* Adds a cache to the map.
- *
+ *
* @param
- * File: Chat.java
- * Created: 19 Oct 2019
*
* @author Maximilian Käfer
* @author Leon Hofmeister
@@ -28,8 +21,9 @@ import envoy.event.MessageStatusChange;
*/
public class Chat implements Serializable {
- protected final Contact recipient;
- protected final List
- * File: ClientConfig.java
- * Created: 01.03.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/data/Context.java b/client/src/main/java/envoy/client/data/Context.java
index a692f2e..a022ac3 100644
--- a/client/src/main/java/envoy/client/data/Context.java
+++ b/client/src/main/java/envoy/client/data/Context.java
@@ -2,16 +2,11 @@ package envoy.client.data;
import javafx.stage.Stage;
-import envoy.client.net.Client;
-import envoy.client.net.WriteProxy;
+import envoy.client.net.*;
import envoy.client.ui.SceneContext;
/**
* Provides access to commonly used objects.
- *
- * File: Context.java
- * Created: 01.09.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/data/GroupChat.java b/client/src/main/java/envoy/client/data/GroupChat.java
index 39f5bd7..188709c 100644
--- a/client/src/main/java/envoy/client/data/GroupChat.java
+++ b/client/src/main/java/envoy/client/data/GroupChat.java
@@ -1,22 +1,15 @@
package envoy.client.data;
-import java.io.IOException;
import java.time.Instant;
import envoy.client.net.WriteProxy;
-import envoy.data.Contact;
-import envoy.data.GroupMessage;
+import envoy.data.*;
import envoy.data.Message.MessageStatus;
-import envoy.data.User;
import envoy.event.GroupMessageStatusChange;
/**
* Represents a chat between a user and a group
* as a list of messages.
- *
- * File: GroupChat.java
- * Created: 05.07.2020
*
* @author Maximilian Käfer
* @since Envoy Client v0.1-beta
@@ -38,7 +31,7 @@ public final class GroupChat extends Chat {
}
@Override
- public void read(WriteProxy writeProxy) throws IOException {
+ public void read(WriteProxy writeProxy) {
for (int i = messages.size() - 1; i >= 0; --i) {
final GroupMessage gmsg = (GroupMessage) messages.get(i);
if (gmsg.getSenderID() != sender.getID()) if (gmsg.getMemberStatuses().get(sender.getID()) == MessageStatus.READ) break;
diff --git a/client/src/main/java/envoy/client/data/LocalDB.java b/client/src/main/java/envoy/client/data/LocalDB.java
index 61e9988..0e0da55 100644
--- a/client/src/main/java/envoy/client/data/LocalDB.java
+++ b/client/src/main/java/envoy/client/data/LocalDB.java
@@ -5,10 +5,13 @@ import java.nio.channels.*;
import java.nio.file.StandardOpenOption;
import java.time.Instant;
import java.util.*;
-import java.util.logging.Level;
+import java.util.logging.*;
-import envoy.client.event.EnvoyCloseEvent;
+import javafx.collections.*;
+
+import envoy.client.event.*;
import envoy.data.*;
+import envoy.data.Message.MessageStatus;
import envoy.event.*;
import envoy.exception.EnvoyException;
import envoy.util.*;
@@ -22,10 +25,6 @@ import dev.kske.eventbus.EventListener;
* For message ID generation a {@link IDGenerator} is stored as well.
*
- * File: LocalDB.java
- * Created: 3 Feb 2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.3-alpha
@@ -33,12 +32,16 @@ import dev.kske.eventbus.EventListener;
public final class LocalDB implements EventListener {
// Data
- private User user;
- private Map
- * File: Settings.java
- * Created: 11 Nov 2019
*
* @author Leon Hofmeister
* @author Maximilian Käfer
@@ -92,6 +88,8 @@ public final class Settings implements EventListener {
new SettingsItem<>(new File(System.getProperty("user.home") + "/Downloads/"), "Download location",
"The location where files will be saved to"));
items.putIfAbsent("autoSaveDownloads", new SettingsItem<>(false, "Save without asking?", "Should downloads be saved without asking?"));
+ items.putIfAbsent("askForConfirmation",
+ new SettingsItem<>(true, "Ask for confirmation", "Will ask for confirmation before doing certain things"));
}
/**
@@ -182,6 +180,25 @@ public final class Settings implements EventListener {
*/
public void setHideOnClose(boolean hideOnClose) { ((SettingsItem
- * File: SettingsItem.java
- * Created: 23.12.2019
*
* @param
- * File: AudioPlayer.java
- * Created: 05.07.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/data/audio/AudioRecorder.java b/client/src/main/java/envoy/client/data/audio/AudioRecorder.java
index 251041a..38475ab 100644
--- a/client/src/main/java/envoy/client/data/audio/AudioRecorder.java
+++ b/client/src/main/java/envoy/client/data/audio/AudioRecorder.java
@@ -1,8 +1,7 @@
package envoy.client.data.audio;
import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
+import java.nio.file.*;
import javax.sound.sampled.*;
@@ -10,10 +9,6 @@ import envoy.exception.EnvoyException;
/**
* Records audio and exports it as a byte array.
- *
- * File: AudioRecorder.java
- * Created: 02.07.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/data/audio/package-info.java b/client/src/main/java/envoy/client/data/audio/package-info.java
index 3a172be..5e80e64 100644
--- a/client/src/main/java/envoy/client/data/audio/package-info.java
+++ b/client/src/main/java/envoy/client/data/audio/package-info.java
@@ -1,9 +1,5 @@
/**
* Contains classes related to recording and playing back audio clips.
- *
- * File: package-info.java
- * Created: 05.07.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/data/commands/OnCall.java b/client/src/main/java/envoy/client/data/commands/OnCall.java
index dc9c015..941b4fa 100644
--- a/client/src/main/java/envoy/client/data/commands/OnCall.java
+++ b/client/src/main/java/envoy/client/data/commands/OnCall.java
@@ -5,10 +5,6 @@ import java.util.function.Supplier;
/**
* This interface defines an action that should be performed when a system
* command gets called.
- *
- * File: OnCall.java
- * Created: 23.07.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/data/commands/SystemCommand.java b/client/src/main/java/envoy/client/data/commands/SystemCommand.java
index be13c83..a09bd69 100644
--- a/client/src/main/java/envoy/client/data/commands/SystemCommand.java
+++ b/client/src/main/java/envoy/client/data/commands/SystemCommand.java
@@ -1,10 +1,7 @@
package envoy.client.data.commands;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.function.Consumer;
-import java.util.function.Supplier;
+import java.util.*;
+import java.util.function.*;
/**
* This class is the base class of all {@code SystemCommands} and contains an
@@ -16,10 +13,6 @@ import java.util.function.Supplier;
* function. This approach has one limitation:
* Order matters! Changing the order of arguments will likely result in
* unexpected behavior.
- *
- * File: SystemCommand.java
- * Created: 16.07.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java b/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java
index 4d996f5..0768b5f 100644
--- a/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java
+++ b/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java
@@ -1,15 +1,10 @@
package envoy.client.data.commands;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
import java.util.function.Consumer;
/**
* This class acts as a builder for {@link SystemCommand}s.
- *
- * File: SystemCommandBuilder.java
- * Created: 23.07.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
@@ -22,6 +17,22 @@ public final class SystemCommandBuilder {
private String description;
private int relevance;
+ private final SystemCommandMap commandsMap;
+
+ /**
+ * Creates a new {@code SystemCommandsBuilder} without underlying
+ * {@link SystemCommandMap}.
+ *
+ * @since Envoy Client v0.2-beta
+ */
+ public SystemCommandBuilder() { this(null); }
+
+ /**
+ * @param commandsMap the map to use when calling build (optional)
+ * @since Envoy Client v0.2-beta
+ */
+ public SystemCommandBuilder(SystemCommandMap commandsMap) { this.commandsMap = commandsMap; }
+
/**
* @param numberOfArguments the numberOfArguments to set
* @return this {@code SystemCommandBuilder}
@@ -125,6 +136,7 @@ public final class SystemCommandBuilder {
/**
* Builds a {@code SystemCommand} based upon the previously entered data.
+ * Automatically adds the built object to the given map.
* At the end, this {@code SystemCommandBuilder} can be reset but must
* not be.
*
@@ -141,4 +153,78 @@ public final class SystemCommandBuilder {
if (reset) reset();
return sc;
}
+
+ /**
+ * Builds a {@code SystemCommand} based upon the previously entered data.
+ * Automatically adds the built object to the given map.
+ *
+ * @param command the command under which to store the SystemCommand in the
+ * {@link SystemCommandMap}
+ * @return the built {@code SystemCommand}
+ * @throws NullPointerException if no map has been assigned to this builder
+ * @since Envoy Client v0.2-beta
+ */
+ public SystemCommand build(String command) { return build(command, true); }
+
+ /**
+ * Builds a {@code SystemCommand} based upon the previously entered data.
+ * Automatically adds the built object to the given map.
+ * {@code SystemCommand#numberOfArguments} will be set to 0, regardless of the
+ * previous value.
+ * At the end, this {@code SystemCommandBuilder} will be reset.
+ *
+ * @param command the command under which to store the SystemCommand in the
+ * {@link SystemCommandMap}
+ * @return the built {@code SystemCommand}
+ * @throws NullPointerException if no map has been assigned to this builder
+ * @since Envoy Client v0.2-beta
+ */
+ public SystemCommand buildNoArg(String command) {
+ numberOfArguments = 0;
+ return build(command, true);
+ }
+
+ /**
+ * Builds a {@code SystemCommand} based upon the previously entered data.
+ * Automatically adds the built object to the given map.
+ * {@code SystemCommand#numberOfArguments} will be set to use the rest of the
+ * string as argument, regardless of the previous value.
+ * At the end, this {@code SystemCommandBuilder} will be reset.
+ *
+ * @param command the command under which to store the SystemCommand in the
+ * {@link SystemCommandMap}
+ * @return the built {@code SystemCommand}
+ * @throws NullPointerException if no map has been assigned to this builder
+ * @since Envoy Client v0.2-beta
+ */
+ public SystemCommand buildRemainingArg(String command) {
+ numberOfArguments = -1;
+ return build(command, true);
+ }
+
+ /**
+ * Builds a {@code SystemCommand} based upon the previously entered data.
+ * Automatically adds the built object to the given map.
+ * At the end, this {@code SystemCommandBuilder} can be reset but must
+ * not be.
+ *
+ * @param command the command under which to store the SystemCommand in the
+ * {@link SystemCommandMap}
+ * @param reset whether this {@code SystemCommandBuilder} should be reset
+ * afterwards.
+ * This can be useful if another command wants to execute
+ * something
+ * similar
+ * @return the built {@code SystemCommand}
+ * @throws NullPointerException if no map has been assigned to this builder
+ * @since Envoy Client v0.2-beta
+ */
+ public SystemCommand build(String command, boolean reset) {
+ final var sc = new SystemCommand(action, numberOfArguments, defaults, description);
+ sc.setRelevance(relevance);
+ if (commandsMap != null) commandsMap.add(command, sc);
+ else throw new NullPointerException("No map in SystemCommandsBuilder present");
+ if (reset) reset();
+ return sc;
+ }
}
diff --git a/client/src/main/java/envoy/client/data/commands/SystemCommandsMap.java b/client/src/main/java/envoy/client/data/commands/SystemCommandMap.java
similarity index 96%
rename from client/src/main/java/envoy/client/data/commands/SystemCommandsMap.java
rename to client/src/main/java/envoy/client/data/commands/SystemCommandMap.java
index 959e0dd..915807b 100644
--- a/client/src/main/java/envoy/client/data/commands/SystemCommandsMap.java
+++ b/client/src/main/java/envoy/client/data/commands/SystemCommandMap.java
@@ -10,21 +10,17 @@ import envoy.util.EnvoyLog;
/**
* This class stores all {@link SystemCommand}s used.
- *
- * File: SystemCommandsMap.java
- * Created: 17.07.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
*/
-public final class SystemCommandsMap {
+public final class SystemCommandMap {
private final Map
- * {@code SystemCommandsMap systemCommands = new SystemCommandsMap();}
+ * {@code SystemCommandMap systemCommands = new SystemCommandMap();}
* {@code Button button = new Button();}
* {@code systemCommands.add("example", text -> button.setText(text.get(0), 1);}
* {@code ....}
@@ -132,7 +128,7 @@ public final class SystemCommandsMap {
* map).
*
- * {@code SystemCommandsMap systemCommands = new SystemCommandsMap();}
+ * {@code SystemCommandMap systemCommands = new SystemCommandMap();}
* {@code Button button = new Button();}
* {@code systemCommands.add("example", (words)-> button.setText(words.get(0), 1);}
* {@code ....}
diff --git a/client/src/main/java/envoy/client/data/commands/package-info.java b/client/src/main/java/envoy/client/data/commands/package-info.java
index b3f2b4f..0be1b13 100644
--- a/client/src/main/java/envoy/client/data/commands/package-info.java
+++ b/client/src/main/java/envoy/client/data/commands/package-info.java
@@ -1,10 +1,6 @@
/**
* This package contains all classes that can be used as system commands.
* Every system command can be called using a specific syntax:"/<command>"
- *
- * File: package-info.java
- * Created: 16.07.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/event/BackEvent.java b/client/src/main/java/envoy/client/event/BackEvent.java
index 202e80f..ab40768 100644
--- a/client/src/main/java/envoy/client/event/BackEvent.java
+++ b/client/src/main/java/envoy/client/event/BackEvent.java
@@ -3,12 +3,8 @@ package envoy.client.event;
import envoy.event.Event.Valueless;
/**
- * This event serves the purpose to trigger the tab change to tab 0 in
+ * This event serves the purpose of triggering the tab change to tab 0 in
* {@link envoy.client.ui.controller.ChatScene}.
- *
- * File: BackEvent.java
- * Created: 23.08.2020
*
* @author Maximilian Käfer
* @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/event/EnvoyCloseEvent.java b/client/src/main/java/envoy/client/event/EnvoyCloseEvent.java
index cb9be17..dfe15ec 100644
--- a/client/src/main/java/envoy/client/event/EnvoyCloseEvent.java
+++ b/client/src/main/java/envoy/client/event/EnvoyCloseEvent.java
@@ -3,9 +3,9 @@ package envoy.client.event;
import envoy.event.Event.Valueless;
/**
- * This event will be sent once Envoy is really closed.
- * Its purpose is to forcefully stop other threads peacefully so that the VM can
- * shutdown too.
+ * This event notifies various Envoy components of the application being about
+ * to shut down. This allows the graceful closing of connections, persisting
+ * local data etc.
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/event/Logout.java b/client/src/main/java/envoy/client/event/Logout.java
new file mode 100644
index 0000000..098075b
--- /dev/null
+++ b/client/src/main/java/envoy/client/event/Logout.java
@@ -0,0 +1,14 @@
+package envoy.client.event;
+
+import envoy.event.Event.Valueless;
+
+/**
+ * Indicates that a logout has been requested.
+ *
+ * @author Leon Hofmeister
+ * @since Envoy Client v0.2-beta
+ */
+public final class Logout extends Valueless {
+
+ private static final long serialVersionUID = 1L;
+}
diff --git a/client/src/main/java/envoy/client/event/SendEvent.java b/client/src/main/java/envoy/client/event/SendEvent.java
deleted file mode 100644
index f93e1d6..0000000
--- a/client/src/main/java/envoy/client/event/SendEvent.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package envoy.client.event;
-
-import envoy.event.Event;
-
-/**
- * Project: envoy-client
- * File: SendEvent.java
- * Created: 11.02.2020
- *
- * @author: Maximilian Käfer
- * @since Envoy Client v0.3-alpha
- */
-public final class SendEvent extends Event
- * File: ThemeChangeEvent.java
- * Created: 15 Dec 2019
+ * Notifies UI components of a theme change.
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.2-alpha
diff --git a/client/src/main/java/envoy/client/helper/AlertHelper.java b/client/src/main/java/envoy/client/helper/AlertHelper.java
new file mode 100644
index 0000000..4c6e880
--- /dev/null
+++ b/client/src/main/java/envoy/client/helper/AlertHelper.java
@@ -0,0 +1,36 @@
+package envoy.client.helper;
+
+import javafx.scene.control.*;
+
+import envoy.client.data.Settings;
+
+/**
+ * Provides methods that are commonly used for alerts.
+ *
+ * @author Leon Hofmeister
+ * @since Envoy Client v0.2-beta
+ */
+public final class AlertHelper {
+
+ private AlertHelper() {}
+
+ /**
+ * Asks for a confirmation dialog if {@link Settings#isAskForConfirmation()}
+ * returns {@code true}.
+ * Immediately executes the action if no dialog was requested or the dialog was
+ * exited with a confirmation.
+ * Does nothing if the dialog was closed without clicking on OK.
+ *
+ * @param alert the (customized) alert to show. Should not be shown
+ * already
+ * @param action the action to perform in case of success
+ * @since Envoy Client v0.2-beta
+ */
+ public static void confirmAction(Alert alert, Runnable action) {
+ alert.setHeight(225);
+ alert.setWidth(400);
+ alert.setHeaderText("");
+ if (Settings.getInstance().isAskForConfirmation()) alert.showAndWait().filter(ButtonType.OK::equals).ifPresent(bu -> action.run());
+ else action.run();
+ }
+}
diff --git a/client/src/main/java/envoy/client/helper/ShutdownHelper.java b/client/src/main/java/envoy/client/helper/ShutdownHelper.java
new file mode 100644
index 0000000..7f6dd7e
--- /dev/null
+++ b/client/src/main/java/envoy/client/helper/ShutdownHelper.java
@@ -0,0 +1,57 @@
+package envoy.client.helper;
+
+import java.util.logging.Level;
+
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
+
+import envoy.client.data.*;
+import envoy.client.event.*;
+import envoy.client.ui.SceneContext.SceneInfo;
+import envoy.util.EnvoyLog;
+
+import dev.kske.eventbus.EventBus;
+
+/**
+ * Simplifies shutdown actions.
+ *
+ * @author Leon Hofmeister
+ * @since Envoy Client v0.2-beta
+ */
+public final class ShutdownHelper {
+
+ private ShutdownHelper() {}
+
+ /**
+ * Exits Envoy or minimizes it, depending on the current state of
+ * {@link Settings#isHideOnClose()}.
+ *
+ * @since Envoy Client v0.2-beta
+ */
+ public static void exit() {
+ if (Settings.getInstance().isHideOnClose()) Context.getInstance().getStage().setIconified(true);
+ else {
+ EventBus.getInstance().dispatch(new EnvoyCloseEvent());
+ System.exit(0);
+ }
+ }
+
+ /**
+ * Logs the current user out and reopens
+ * {@link envoy.client.ui.controller.LoginScene}.
+ *
+ * @since Envoy Client v0.2-beta
+ */
+ public static void logout() {
+ final var alert = new Alert(AlertType.CONFIRMATION);
+ alert.setTitle("Logout?");
+ alert.setContentText("Are you sure you want to log out?");
+
+ AlertHelper.confirmAction(alert, () -> {
+ EnvoyLog.getLogger(ShutdownHelper.class).log(Level.INFO, "A logout was requested");
+ EventBus.getInstance().dispatch(new EnvoyCloseEvent());
+ EventBus.getInstance().dispatch(new Logout());
+ Context.getInstance().getSceneContext().load(SceneInfo.LOGIN_SCENE);
+ });
+ }
+}
diff --git a/client/src/main/java/envoy/client/helper/package-info.java b/client/src/main/java/envoy/client/helper/package-info.java
new file mode 100644
index 0000000..5ce95cc
--- /dev/null
+++ b/client/src/main/java/envoy/client/helper/package-info.java
@@ -0,0 +1,9 @@
+/**
+ * Provides helper methods that reduce boilerplate code.
+ *
+ * @author Leon Hofmeister
+ * @author Kai S. K. Engelbert
+ * @author Maximilian Käfer
+ * @since Envoy Client v0.2-beta
+ */
+package envoy.client.helper;
diff --git a/client/src/main/java/envoy/client/net/Client.java b/client/src/main/java/envoy/client/net/Client.java
index f2987b3..0db43ef 100644
--- a/client/src/main/java/envoy/client/net/Client.java
+++ b/client/src/main/java/envoy/client/net/Client.java
@@ -6,22 +6,17 @@ import java.util.concurrent.TimeoutException;
import java.util.logging.*;
import envoy.client.data.*;
-import envoy.client.event.*;
+import envoy.client.event.EnvoyCloseEvent;
import envoy.data.*;
import envoy.event.*;
-import envoy.event.Event;
-import envoy.event.contact.*;
import envoy.util.*;
import dev.kske.eventbus.*;
+import dev.kske.eventbus.Event;
/**
* Establishes a connection to the server, performs a handshake and delivers
* certain objects to the server.
- *
- * File: Client.java
- * Created: 28 Sep 2019
*
* @author Kai S. K. Engelbart
* @author Maximilian Käfer
@@ -79,8 +74,6 @@ public final class Client implements EventListener, Closeable {
// authentication token
receiver.registerProcessor(User.class, sender -> this.sender = sender);
receiver.registerProcessors(cacheMap.getMap());
- receiver.registerProcessor(HandshakeRejection.class, evt -> { rejected = true; eventBus.dispatch(evt); });
- receiver.registerProcessor(NewAuthToken.class, eventBus::dispatch);
rejected = false;
@@ -107,7 +100,6 @@ public final class Client implements EventListener, Closeable {
}
online = true;
-
logger.log(Level.INFO, "Handshake completed.");
}
@@ -128,129 +120,86 @@ public final class Client implements EventListener, Closeable {
// Remove all processors as they are only used during the handshake
receiver.removeAllProcessors();
- // Process incoming messages
- final var receivedMessageProcessor = new ReceivedMessageProcessor();
- final var receivedGroupMessageProcessor = new ReceivedGroupMessageProcessor();
- final var messageStatusChangeProcessor = new MessageStatusChangeProcessor();
- final var groupMessageStatusChangeProcessor = new GroupMessageStatusChangeProcessor();
-
- receiver.registerProcessor(GroupMessage.class, receivedGroupMessageProcessor);
- receiver.registerProcessor(Message.class, receivedMessageProcessor);
- receiver.registerProcessor(MessageStatusChange.class, messageStatusChangeProcessor);
- receiver.registerProcessor(GroupMessageStatusChange.class, groupMessageStatusChangeProcessor);
-
// Relay cached messages and message status changes
- cacheMap.get(Message.class).setProcessor(receivedMessageProcessor);
- cacheMap.get(GroupMessage.class).setProcessor(receivedGroupMessageProcessor);
- cacheMap.get(MessageStatusChange.class).setProcessor(messageStatusChangeProcessor);
- cacheMap.get(GroupMessageStatusChange.class).setProcessor(groupMessageStatusChangeProcessor);
-
- // Process user status changes
- receiver.registerProcessor(UserStatusChange.class, eventBus::dispatch);
-
- // Process message ID generation
- receiver.registerProcessor(IDGenerator.class, localDB::setIDGenerator);
-
- // Process name changes
- receiver.registerProcessor(NameChange.class, evt -> { localDB.replaceContactName(evt); eventBus.dispatch(evt); });
-
- // Process contact searches
- receiver.registerProcessor(UserSearchResult.class, eventBus::dispatch);
-
- // Process contact operations
- receiver.registerProcessor(ContactOperation.class, eventBus::dispatch);
-
- // Process group size changes
- receiver.registerProcessor(GroupResize.class, evt -> { localDB.updateGroup(evt); eventBus.dispatch(evt); });
-
- // Process IsTyping events
- receiver.registerProcessor(IsTyping.class, eventBus::dispatch);
-
- // Process PasswordChangeResults
- receiver.registerProcessor(PasswordChangeResult.class, eventBus::dispatch);
-
- // Process ProfilePicChanges
- receiver.registerProcessor(ProfilePicChange.class, eventBus::dispatch);
-
- // Process requests to not send any more attachments as they will not be shown
- // to other users
- receiver.registerProcessor(NoAttachments.class, eventBus::dispatch);
-
- // Process group creation results - they might have been disabled on the server
- receiver.registerProcessor(GroupCreationResult.class, eventBus::dispatch);
+ cacheMap.get(Message.class).setProcessor(eventBus::dispatch);
+ cacheMap.get(GroupMessage.class).setProcessor(eventBus::dispatch);
+ cacheMap.get(MessageStatusChange.class).setProcessor(eventBus::dispatch);
+ cacheMap.get(GroupMessageStatusChange.class).setProcessor(eventBus::dispatch);
// Request a generator if none is present or the existing one is consumed
- if (!localDB.hasIDGenerator() || !localDB.getIDGenerator().hasNext()) requestIdGenerator();
+ if (!localDB.hasIDGenerator() || !localDB.getIDGenerator().hasNext()) requestIDGenerator();
// Relay caches
cacheMap.getMap().values().forEach(Cache::relay);
}
+ /**
+ * Sends an object to the server.
+ *
+ * @param obj the object to send
+ * @throws IllegalStateException if the client is not online
+ * @throws RuntimeException if the object serialization failed
+ * @since Envoy Client v0.2-beta
+ */
+ public void send(Serializable obj) throws IllegalStateException, RuntimeException {
+ checkOnline();
+ logger.log(Level.FINE, "Sending " + obj);
+ try {
+ SerializationUtils.writeBytesWithLength(obj, socket.getOutputStream());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
/**
* Sends a message to the server. The message's status will be incremented once
* it was delivered successfully.
*
* @param message the message to send
- * @throws IOException if the message does not reach the server
* @since Envoy Client v0.3-alpha
*/
- public void sendMessage(Message message) throws IOException {
- writeObject(message);
+ public void sendMessage(Message message) {
+ send(message);
message.nextStatus();
}
- /**
- * Sends an event to the server.
- *
- * @param evt the event to send
- * @throws IOException if the event did not reach the server
- */
- public void sendEvent(Event> evt) throws IOException { if (online) writeObject(evt); }
-
/**
* Requests a new {@link IDGenerator} from the server.
*
- * @throws IOException if the request does not reach the server
* @since Envoy Client v0.3-alpha
*/
- public void requestIdGenerator() throws IOException {
+ public void requestIDGenerator() {
logger.log(Level.INFO, "Requesting new id generator...");
- writeObject(new IDGeneratorRequest());
+ send(new IDGeneratorRequest());
}
- /**
- * Sends the value of a send event to the server.
- *
- * @param evt the send event to extract the value from
- * @since Envoy Client v0.2-beta
- */
- @dev.kske.eventbus.Event
- private void onSendEvent(SendEvent evt) {
- try {
- sendEvent(evt.get());
- } catch (final IOException e) {
- logger.log(Level.WARNING, "An error occurred when trying to send " + evt, e);
- }
- }
+ @Event(eventType = HandshakeRejection.class, priority = 1000)
+ private void onHandshakeRejection() { rejected = true; }
@Override
- @dev.kske.eventbus.Event(eventType = EnvoyCloseEvent.class, priority = 800)
+ @Event(eventType = EnvoyCloseEvent.class, priority = 800)
public void close() {
if (online) {
logger.log(Level.INFO, "Closing connection...");
try {
+
+ // The sender must be reset as otherwise the handshake is immediately closed
+ sender = null;
+ online = false;
socket.close();
- } catch (final IOException e) {}
+ } catch (final IOException e) {
+ logger.log(Level.WARNING, "Failed to close socket: ", e);
+ }
}
}
- private void writeObject(Object obj) throws IOException {
- checkOnline();
- logger.log(Level.FINE, "Sending " + obj);
- SerializationUtils.writeBytesWithLength(obj, socket.getOutputStream());
- }
-
- private void checkOnline() { if (!online) throw new IllegalStateException("Client is not online"); }
+ /**
+ * Ensured that the client is online.
+ *
+ * @throws IllegalStateException if the client is not online
+ * @since Envoy Client v0.3-alpha
+ */
+ private void checkOnline() throws IllegalStateException { if (!online) throw new IllegalStateException("Client is not online"); }
/**
* @return the {@link User} as which this client is logged in
@@ -268,6 +217,7 @@ public final class Client implements EventListener, Closeable {
/**
* @return the {@link Receiver} used by this {@link Client}
+ * @since v0.2-alpha
*/
public Receiver getReceiver() { return receiver; }
diff --git a/client/src/main/java/envoy/client/net/GroupMessageStatusChangeProcessor.java b/client/src/main/java/envoy/client/net/GroupMessageStatusChangeProcessor.java
deleted file mode 100644
index cd365d7..0000000
--- a/client/src/main/java/envoy/client/net/GroupMessageStatusChangeProcessor.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package envoy.client.net;
-
-import java.util.function.Consumer;
-import java.util.logging.Logger;
-
-import envoy.data.Message.MessageStatus;
-import envoy.event.GroupMessageStatusChange;
-import envoy.util.EnvoyLog;
-
-import dev.kske.eventbus.EventBus;
-
-/**
- * Project: envoy-client
- * File: GroupMessageStatusChangePocessor.java
- * Created: 03.07.2020
- *
- * @author Maximilian Käfer
- * @since Envoy Client v0.1-beta
- */
-public final class GroupMessageStatusChangeProcessor implements Consumer
- * File: MessageStatusChangeProcessor.java
- * Created: 4 Feb 2020
- *
- * @author Kai S. K. Engelbart
- * @since Envoy Client v0.3-alpha
- */
-public final class MessageStatusChangeProcessor implements Consumer
- * File: ReceivedGroupMessageProcessor.java
- * Created: 13.06.2020
- *
- * @author Maximilian Käfer
- * @since Envoy Client v0.1-beta
- */
-public final class ReceivedGroupMessageProcessor implements Consumer
- * File: ReceivedMessageProcessor.java
- * Created: 31.12.2019
- *
- * @author Kai S. K. Engelbart
- * @since Envoy Client v0.3-alpha
- */
-public final class ReceivedMessageProcessor implements Consumer
- * File: Receiver.java
- * Created: 30.12.2019
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.3-alpha
@@ -26,7 +24,8 @@ public final class Receiver extends Thread {
private final InputStream in;
private final Map
- * File: WriteProxy.java
- * Created: 6 Feb 2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.3-alpha
@@ -44,20 +37,12 @@ public final class WriteProxy {
// Initialize cache processors for messages and message status change events
localDB.getCacheMap().get(Message.class).setProcessor(msg -> {
- try {
- logger.log(Level.FINER, "Sending cached " + msg);
- client.sendMessage(msg);
- } catch (final IOException e) {
- logger.log(Level.SEVERE, "Could not send cached message: ", e);
- }
+ logger.log(Level.FINER, "Sending cached " + msg);
+ client.sendMessage(msg);
});
localDB.getCacheMap().get(MessageStatusChange.class).setProcessor(evt -> {
logger.log(Level.FINER, "Sending cached " + evt);
- try {
- client.sendEvent(evt);
- } catch (final IOException e) {
- logger.log(Level.SEVERE, "Could not send cached message status change event: ", e);
- }
+ client.send(evt);
});
}
@@ -74,10 +59,9 @@ public final class WriteProxy {
* inside the local database.
*
* @param message the message to send
- * @throws IOException if the message could not be sent
* @since Envoy Client v0.3-alpha
*/
- public void writeMessage(Message message) throws IOException {
+ public void writeMessage(Message message) {
if (client.isOnline()) client.sendMessage(message);
else localDB.getCacheMap().getApplicable(Message.class).accept(message);
}
@@ -87,11 +71,10 @@ public final class WriteProxy {
* event is cached inside the local database.
*
* @param evt the event to send
- * @throws IOException if the event could not be sent
* @since Envoy Client v0.3-alpha
*/
- public void writeMessageStatusChange(MessageStatusChange evt) throws IOException {
- if (client.isOnline()) client.sendEvent(evt);
+ public void writeMessageStatusChange(MessageStatusChange evt) {
+ if (client.isOnline()) client.send(evt);
else localDB.getCacheMap().getApplicable(MessageStatusChange.class).accept(evt);
}
}
diff --git a/client/src/main/java/envoy/client/ui/ClearableTextField.java b/client/src/main/java/envoy/client/ui/ClearableTextField.java
deleted file mode 100644
index 9568629..0000000
--- a/client/src/main/java/envoy/client/ui/ClearableTextField.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package envoy.client.ui;
-
-import javafx.beans.property.BooleanProperty;
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.StringProperty;
-import javafx.event.ActionEvent;
-import javafx.event.EventHandler;
-import javafx.scene.control.*;
-import javafx.scene.image.ImageView;
-import javafx.scene.layout.Background;
-import javafx.scene.layout.ColumnConstraints;
-import javafx.scene.layout.GridPane;
-
-/**
- * This class offers a text field that is automatically equipped with a clear
- * button.
- *
- * File: ClearableTextField.java
- * Created: 25.06.2020
- *
- * @author Leon Hofmeister
- * @since Envoy Client v0.1-beta
- */
-public final class ClearableTextField extends GridPane {
-
- private final TextField textField;
-
- private final Button clearButton;
-
- /**
- * Constructs a new {@code ClearableTextField} with no initial text and icon
- * size 16.
- *
- * @since Envoy Client v0.1-beta
- */
- public ClearableTextField() { this("", 16); }
-
- /**
- * Constructs a new {@code ClearableTextField} with initial text and a
- * predetermined icon size.
- *
- * @param text the text that should be displayed by default
- * @param size the size of the icon
- * @since Envoy Client v0.1-beta
- */
- public ClearableTextField(String text, int size) {
- // initializing the textField and the button
- textField = new TextField(text);
- clearButton = new Button("", new ImageView(IconUtil.loadIconThemeSensitive("clear_button", size)));
- clearButton.setOnAction(e -> textField.clear());
- clearButton.setFocusTraversable(false);
- clearButton.getStyleClass().clear();
- clearButton.setBackground(Background.EMPTY);
- // Adding the two elements to the GridPane
- add(textField, 0, 0, 2, 1);
- add(clearButton, 1, 0, 1, 1);
- // Setting the percent - widths of the two columns.
- // Used to locate the button on the right.
- final var columnConstraints = new ColumnConstraints();
- columnConstraints.setPercentWidth(90);
- getColumnConstraints().add(columnConstraints);
- final var columnConstraints2 = new ColumnConstraints();
- columnConstraints2.setPercentWidth(10);
- getColumnConstraints().add(columnConstraints2);
- }
-
- /**
- * @return the underlying {@code textField}
- * @since Envoy Client v0.1-beta
- */
- public TextField getTextField() { return textField; }
-
- /**
- * This method offers the freedom to perform custom actions when the
- * {@code clearButton} has been pressed.
- * e -> {clearableTextField.getTextField().clear();}
- *
- * @param onClearButtonAction the action that should be performed
- * @since Envoy Client v0.1-beta
- */
- public void setClearButtonListener(EventHandler
- * File: ListViewRefresh.java
- * Created: 16.07.2020
- *
- * @author Leon Hofmeister
- * @since Envoy Client v0.1-beta
- */
-public final class ListViewRefresh {
-
- private ListViewRefresh() {}
-
- /**
- * Deeply refreshes a {@code listview}, meaning it recomputes every single of
- * its {@link ListCell}s.
- *
- * File: Restorable.java
- * Created: 03.07.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/ui/SceneContext.java b/client/src/main/java/envoy/client/ui/SceneContext.java
index f26aaef..30a02cb 100644
--- a/client/src/main/java/envoy/client/ui/SceneContext.java
+++ b/client/src/main/java/envoy/client/ui/SceneContext.java
@@ -12,6 +12,7 @@ import javafx.stage.Stage;
import envoy.client.data.Settings;
import envoy.client.event.*;
+import envoy.client.helper.ShutdownHelper;
import envoy.util.EnvoyLog;
import dev.kske.eventbus.*;
@@ -23,10 +24,6 @@ import dev.kske.eventbus.*;
*
- * File: SceneContext.java
- * Created: 06.06.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
@@ -96,6 +93,7 @@ public final class SceneContext implements EventListener {
* @since Envoy Client v0.1-beta
*/
public void load(SceneInfo sceneInfo) {
+ EnvoyLog.getLogger(SceneContext.class).log(Level.FINER, "Loading scene " + sceneInfo);
loader.setRoot(null);
loader.setController(null);
@@ -107,18 +105,17 @@ public final class SceneContext implements EventListener {
sceneStack.push(scene);
stage.setScene(scene);
- // Adding the option to exit Linux-like with "Control" + "Q"
- scene.getAccelerators()
- .put(new KeyCodeCombination(KeyCode.Q, KeyCombination.CONTROL_DOWN),
- () -> {
- // Presumably no Settings are loaded in the login scene, hence Envoy is closed
- // directly
- if (sceneInfo != SceneInfo.LOGIN_SCENE && settings.isHideOnClose()) stage.setIconified(true);
- else {
- EventBus.getInstance().dispatch(new EnvoyCloseEvent());
- System.exit(0);
- }
- });
+ // Add the option to exit Linux-like with "Control" + "Q"
+ scene.getAccelerators().put(new KeyCodeCombination(KeyCode.Q, KeyCombination.CONTROL_DOWN), ShutdownHelper::exit);
+
+ // Add the option to logout using "Control"+"Shift"+"L" if not in login scene
+ if (sceneInfo != SceneInfo.LOGIN_SCENE) scene.getAccelerators()
+ .put(new KeyCodeCombination(KeyCode.L, KeyCombination.CONTROL_DOWN, KeyCombination.SHIFT_DOWN), ShutdownHelper::logout);
+
+ // Add the option to open the settings scene with "Control"+"S", if being in
+ // chat scene
+ if (sceneInfo.equals(SceneInfo.CHAT_SCENE))
+ scene.getAccelerators().put(new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN), () -> load(SceneInfo.SETTINGS_SCENE));
// The LoginScene is the only scene not intended to be resized
// As strange as it seems, this is needed as otherwise the LoginScene won't be
@@ -167,6 +164,12 @@ public final class SceneContext implements EventListener {
}
}
+ @Event(eventType = Logout.class, priority = 150)
+ private void onLogout() {
+ sceneStack.clear();
+ controllerStack.clear();
+ }
+
@Event(priority = 150, eventType = ThemeChangeEvent.class)
private void onThemeChange() { applyCSS(); }
diff --git a/client/src/main/java/envoy/client/ui/Startup.java b/client/src/main/java/envoy/client/ui/Startup.java
index 2e6b5d2..61ee954 100644
--- a/client/src/main/java/envoy/client/ui/Startup.java
+++ b/client/src/main/java/envoy/client/ui/Startup.java
@@ -11,24 +11,19 @@ import javafx.scene.control.Alert.AlertType;
import javafx.stage.Stage;
import envoy.client.data.*;
-import envoy.client.event.EnvoyCloseEvent;
+import envoy.client.helper.ShutdownHelper;
import envoy.client.net.Client;
import envoy.client.ui.SceneContext.SceneInfo;
import envoy.client.ui.controller.LoginScene;
+import envoy.client.util.IconUtil;
import envoy.data.*;
import envoy.data.User.UserStatus;
import envoy.event.*;
import envoy.exception.EnvoyException;
import envoy.util.EnvoyLog;
-import dev.kske.eventbus.EventBus;
-
/**
- * Handles application startup and shutdown.
- *
- * File: Startup.java
- * Created: 26.03.2020
+ * Handles application startup.
*
* @author Kai S. K. Engelbart
* @author Maximilian Käfer
@@ -58,6 +53,8 @@ public final class Startup extends Application {
*/
@Override
public void start(Stage stage) throws Exception {
+
+ // Initialize config and logger
try {
config.loadAll(Startup.class, "client.properties", getParameters().getRaw().toArray(new String[0]));
EnvoyLog.initialize(config);
@@ -70,7 +67,7 @@ public final class Startup extends Application {
// Initialize the local database
try {
- var localDBFile = new File(config.getHomeDirectory(), config.getServer());
+ final var localDBFile = new File(config.getHomeDirectory(), config.getServer());
logger.info("Initializing LocalDB at " + localDBFile);
localDB = new LocalDB(localDBFile);
} catch (IOException | EnvoyException e) {
@@ -117,7 +114,6 @@ public final class Startup extends Application {
cacheMap.put(MessageStatusChange.class, new Cache
- * File: StatusTrayIcon.java
- * Created: 3 Dec 2019
- *
* @author Kai S. K. Engelbart
* @since Envoy Client v0.2-alpha
*/
@@ -32,7 +30,7 @@ public final class StatusTrayIcon implements EventListener {
* A received {@link Message} is only displayed as a system tray notification if
* this variable is set to {@code true}.
*/
- private boolean displayMessages = false;
+ private boolean displayMessages;
/**
* @return {@code true} if the status tray icon is supported on this platform
@@ -56,7 +54,7 @@ public final class StatusTrayIcon implements EventListener {
final PopupMenu popup = new PopupMenu();
final MenuItem exitMenuItem = new MenuItem("Exit");
- exitMenuItem.addActionListener(evt -> { Platform.exit(); System.exit(0); });
+ exitMenuItem.addActionListener(evt -> ShutdownHelper.exit());
popup.add(exitMenuItem);
trayIcon.setPopupMenu(popup);
@@ -90,10 +88,10 @@ public final class StatusTrayIcon implements EventListener {
public void hide() { SystemTray.getSystemTray().remove(trayIcon); }
@Event
- private void onMessage(Message evt) {
+ private void onMessage(Message message) {
if (displayMessages) trayIcon.displayMessage(
- evt.hasAttachment() ? "New " + evt.getAttachment().getType().toString().toLowerCase() + " message received" : "New message received",
- evt.getText(),
+ message.hasAttachment() ? "New " + message.getAttachment().getType().toString().toLowerCase() + " message received" : "New message received",
+ message.getText(),
MessageType.INFO);
}
}
diff --git a/client/src/main/java/envoy/client/ui/AudioControl.java b/client/src/main/java/envoy/client/ui/control/AudioControl.java
similarity index 76%
rename from client/src/main/java/envoy/client/ui/AudioControl.java
rename to client/src/main/java/envoy/client/ui/control/AudioControl.java
index d82fd24..fc2263b 100644
--- a/client/src/main/java/envoy/client/ui/AudioControl.java
+++ b/client/src/main/java/envoy/client/ui/control/AudioControl.java
@@ -1,11 +1,9 @@
-package envoy.client.ui;
+package envoy.client.ui.control;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.logging.*;
-import javafx.scene.control.Alert;
+import javafx.scene.control.*;
import javafx.scene.control.Alert.AlertType;
-import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import envoy.client.data.audio.AudioPlayer;
@@ -14,10 +12,6 @@ import envoy.util.EnvoyLog;
/**
* Enables the play back of audio clips through a button.
- *
- * File: AudioControl.java
- * Created: 05.07.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/ui/listcell/ChatControl.java b/client/src/main/java/envoy/client/ui/control/ChatControl.java
similarity index 64%
rename from client/src/main/java/envoy/client/ui/listcell/ChatControl.java
rename to client/src/main/java/envoy/client/ui/control/ChatControl.java
index 402ef5d..eca5cb5 100644
--- a/client/src/main/java/envoy/client/ui/listcell/ChatControl.java
+++ b/client/src/main/java/envoy/client/ui/control/ChatControl.java
@@ -1,23 +1,17 @@
-package envoy.client.ui.listcell;
+package envoy.client.ui.control;
-import javafx.geometry.Insets;
-import javafx.geometry.Pos;
+import javafx.geometry.*;
import javafx.scene.control.Label;
-import javafx.scene.image.ImageView;
+import javafx.scene.image.*;
import javafx.scene.layout.*;
import javafx.scene.shape.Rectangle;
-import envoy.client.data.Chat;
-import envoy.client.ui.IconUtil;
-import envoy.data.Group;
+import envoy.client.data.*;
+import envoy.client.util.IconUtil;
/**
* Displays a chat using a contact control for the recipient and a label for the
* unread message count.
- *
- * File: ContactControl.java
- * Created: 01.07.2020
*
* @see ContactControl
* @author Leon Hofmeister
@@ -25,6 +19,9 @@ import envoy.data.Group;
*/
public final class ChatControl extends HBox {
+ private static final Image userIcon = IconUtil.loadIconThemeSensitive("user_icon", 32),
+ groupIcon = IconUtil.loadIconThemeSensitive("group_icon", 32);
+
/**
* @param chat the chat to display
* @since Envoy Client v0.1-beta
@@ -32,10 +29,9 @@ public final class ChatControl extends HBox {
public ChatControl(Chat chat) {
setAlignment(Pos.CENTER_LEFT);
setPadding(new Insets(0, 0, 3, 0));
- // profile pic
- ImageView contactProfilePic;
- if (chat.getRecipient() instanceof Group) contactProfilePic = new ImageView(IconUtil.loadIconThemeSensitive("group_icon", 32));
- else contactProfilePic = new ImageView(IconUtil.loadIconThemeSensitive("user_icon", 32));
+
+ // Profile picture
+ ImageView contactProfilePic = new ImageView(chat instanceof GroupChat ? groupIcon : userIcon);
final var clip = new Rectangle();
clip.setWidth(32);
clip.setHeight(32);
@@ -43,14 +39,17 @@ public final class ChatControl extends HBox {
clip.setArcWidth(32);
contactProfilePic.setClip(clip);
getChildren().add(contactProfilePic);
- // spacing
+
+ // Spacing
final var leftSpacing = new Region();
leftSpacing.setPrefSize(8, 0);
leftSpacing.setMinSize(8, 0);
leftSpacing.setMaxSize(8, 0);
getChildren().add(leftSpacing);
+
// Contact control
getChildren().add(new ContactControl(chat.getRecipient()));
+
// Unread messages
if (chat.getUnreadAmount() != 0) {
final var spacing = new Region();
@@ -58,12 +57,12 @@ public final class ChatControl extends HBox {
getChildren().add(spacing);
final var unreadMessagesLabel = new Label(Integer.toString(chat.getUnreadAmount()));
unreadMessagesLabel.setMinSize(15, 15);
- final var vBox2 = new VBox();
- vBox2.setAlignment(Pos.CENTER_RIGHT);
+ final var vbox = new VBox();
+ vbox.setAlignment(Pos.CENTER_RIGHT);
unreadMessagesLabel.setAlignment(Pos.CENTER);
unreadMessagesLabel.getStyleClass().add("unread-messages-amount");
- vBox2.getChildren().add(unreadMessagesLabel);
- getChildren().add(vBox2);
+ vbox.getChildren().add(unreadMessagesLabel);
+ getChildren().add(vbox);
}
getStyleClass().add("list-element");
}
diff --git a/client/src/main/java/envoy/client/ui/listcell/ContactControl.java b/client/src/main/java/envoy/client/ui/control/ContactControl.java
similarity index 81%
rename from client/src/main/java/envoy/client/ui/listcell/ContactControl.java
rename to client/src/main/java/envoy/client/ui/control/ContactControl.java
index f7a8999..8a85739 100644
--- a/client/src/main/java/envoy/client/ui/listcell/ContactControl.java
+++ b/client/src/main/java/envoy/client/ui/control/ContactControl.java
@@ -1,19 +1,14 @@
-package envoy.client.ui.listcell;
+package envoy.client.ui.control;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
-import envoy.data.Contact;
-import envoy.data.User;
+import envoy.data.*;
/**
* Displays information about a contact in two rows. The first row contains the
* name. The second row contains the online status (user) or the member count
* (group).
- *
- * File: ContactControl.java
- * Created: 13.07.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/ui/listcell/MessageControl.java b/client/src/main/java/envoy/client/ui/control/MessageControl.java
similarity index 88%
rename from client/src/main/java/envoy/client/ui/listcell/MessageControl.java
rename to client/src/main/java/envoy/client/ui/control/MessageControl.java
index ff4674e..11f5681 100644
--- a/client/src/main/java/envoy/client/ui/listcell/MessageControl.java
+++ b/client/src/main/java/envoy/client/ui/control/MessageControl.java
@@ -1,4 +1,4 @@
-package envoy.client.ui.listcell;
+package envoy.client.ui.control;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
@@ -6,37 +6,23 @@ import java.io.*;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.logging.*;
-import javafx.geometry.Insets;
-import javafx.geometry.Pos;
-import javafx.scene.control.ContextMenu;
-import javafx.scene.control.Label;
-import javafx.scene.control.MenuItem;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
+import javafx.geometry.*;
+import javafx.scene.control.*;
+import javafx.scene.image.*;
import javafx.scene.layout.*;
import javafx.stage.FileChooser;
-import envoy.client.data.Context;
-import envoy.client.data.LocalDB;
-import envoy.client.data.Settings;
-import envoy.client.ui.AudioControl;
-import envoy.client.ui.IconUtil;
-import envoy.client.ui.SceneContext;
-import envoy.data.GroupMessage;
-import envoy.data.Message;
+import envoy.client.data.*;
+import envoy.client.ui.*;
+import envoy.client.util.IconUtil;
+import envoy.data.*;
import envoy.data.Message.MessageStatus;
-import envoy.data.User;
import envoy.util.EnvoyLog;
/**
- * This class formats a single {@link Message} into a UI component.
- *
- * File: MessageControl.java
- * Created: 01.07.2020
+ * This class transforms a single {@link Message} into a UI component.
*
* @author Leon Hofmeister
* @author Maximilian Käfer
@@ -95,6 +81,7 @@ public final class MessageControl extends Label {
contextMenu.getItems().addAll(copyMenuItem, deleteMenuItem, forwardMenuItem, quoteMenuItem, infoMenuItem);
// Handling message attachment display
+ // TODO: Add missing attachment types
if (message.hasAttachment()) {
switch (message.getAttachment().getType()) {
case PICTURE:
diff --git a/client/src/main/java/envoy/client/ui/custom/ProfilePicImageView.java b/client/src/main/java/envoy/client/ui/control/ProfilePicImageView.java
similarity index 85%
rename from client/src/main/java/envoy/client/ui/custom/ProfilePicImageView.java
rename to client/src/main/java/envoy/client/ui/control/ProfilePicImageView.java
index 4708974..778b026 100644
--- a/client/src/main/java/envoy/client/ui/custom/ProfilePicImageView.java
+++ b/client/src/main/java/envoy/client/ui/control/ProfilePicImageView.java
@@ -1,15 +1,10 @@
-package envoy.client.ui.custom;
+package envoy.client.ui.control;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
+import javafx.scene.image.*;
import javafx.scene.shape.Rectangle;
/**
* Provides a set of convenience constructors for images that are displayed as profile pictures.
- *
- * File: ProfilePicImageView.java
- * Created: 30.07.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/ui/custom/TextInputContextMenu.java b/client/src/main/java/envoy/client/ui/control/TextInputContextMenu.java
similarity index 95%
rename from client/src/main/java/envoy/client/ui/custom/TextInputContextMenu.java
rename to client/src/main/java/envoy/client/ui/control/TextInputContextMenu.java
index 02b1889..9925f7d 100644
--- a/client/src/main/java/envoy/client/ui/custom/TextInputContextMenu.java
+++ b/client/src/main/java/envoy/client/ui/control/TextInputContextMenu.java
@@ -1,4 +1,4 @@
-package envoy.client.ui.custom;
+package envoy.client.ui.control;
import java.util.function.Consumer;
@@ -21,10 +21,6 @@ import javafx.scene.input.Clipboard;
*
- * File: TextInputContextMenu.java
- * Created: 20.09.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/ui/control/package-info.java b/client/src/main/java/envoy/client/ui/control/package-info.java
new file mode 100644
index 0000000..6a091d0
--- /dev/null
+++ b/client/src/main/java/envoy/client/ui/control/package-info.java
@@ -0,0 +1,9 @@
+/**
+ * Defines custom UI controls.
+ *
+ * @author Kai S. K. Engelbart
+ * @author Leon Hofmeister
+ * @author Maximilian Käfer
+ * @since Envoy Client v0.2-beta
+ */
+package envoy.client.ui.control;
diff --git a/client/src/main/java/envoy/client/ui/controller/ChatScene.java b/client/src/main/java/envoy/client/ui/controller/ChatScene.java
index 4ee5e38..0aa705d 100644
--- a/client/src/main/java/envoy/client/ui/controller/ChatScene.java
+++ b/client/src/main/java/envoy/client/ui/controller/ChatScene.java
@@ -11,7 +11,7 @@ import java.util.logging.*;
import javafx.animation.RotateTransition;
import javafx.application.Platform;
-import javafx.collections.*;
+import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.fxml.*;
import javafx.scene.control.*;
@@ -28,11 +28,13 @@ import envoy.client.data.*;
import envoy.client.data.audio.AudioRecorder;
import envoy.client.data.commands.*;
import envoy.client.event.*;
+import envoy.client.helper.ShutdownHelper;
import envoy.client.net.*;
import envoy.client.ui.*;
-import envoy.client.ui.custom.TextInputContextMenu;
+import envoy.client.ui.SceneContext.SceneInfo;
+import envoy.client.ui.control.*;
import envoy.client.ui.listcell.*;
-import envoy.client.util.ReflectionUtil;
+import envoy.client.util.*;
import envoy.data.*;
import envoy.data.Attachment.AttachmentType;
import envoy.data.Message.MessageStatus;
@@ -45,9 +47,7 @@ import dev.kske.eventbus.*;
import dev.kske.eventbus.Event;
/**
- * Project: envoy-client
- * File: ChatSceneController.java
- * Created: 26.03.2020
+ * Controller for the chat scene.
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
@@ -144,7 +144,7 @@ public final class ChatScene implements EventListener, Restorable {
private final WriteProxy writeProxy = context.getWriteProxy();
private final SceneContext sceneContext = context.getSceneContext();
private final AudioRecorder recorder = new AudioRecorder();
- private final SystemCommandsMap messageTextAreaCommands = new SystemCommandsMap();
+ private final SystemCommandMap messageTextAreaCommands = new SystemCommandMap();
private final Tooltip onlyIfOnlineTooltip = new Tooltip("You need to be online to do this");
private static Image DEFAULT_ATTACHMENT_VIEW_IMAGE = IconUtil.loadIconThemeSensitive("attachment_present", 20);
@@ -169,7 +169,8 @@ public final class ChatScene implements EventListener, Restorable {
messageList.setCellFactory(MessageListCell::new);
chatList.setCellFactory(new ListCellFactory<>(ChatControl::new));
- // JavaFX provides an internal way of populating the context menu of a textarea.
+ // JavaFX provides an internal way of populating the context menu of a text
+ // area.
// We, however, need additional functionality.
messageTextArea.setContextMenu(new TextInputContextMenu(messageTextArea, e -> checkKeyCombination(null)));
@@ -188,7 +189,7 @@ public final class ChatScene implements EventListener, Restorable {
clip.setArcWidth(43);
clientProfilePic.setClip(clip);
- chatList.setItems(chats = new FilteredList<>(FXCollections.observableList(localDB.getChats())));
+ chatList.setItems(chats = new FilteredList<>(localDB.getChats()));
contactLabel.setText(localDB.getUser().getName());
initializeSystemCommandsMap();
@@ -203,8 +204,8 @@ public final class ChatScene implements EventListener, Restorable {
Tooltip.uninstall(contactSpecificOnlineOperations, onlyIfOnlineTooltip);
contactSearchTab.setContent(new FXMLLoader().load(getClass().getResourceAsStream("/fxml/ContactSearchTab.fxml")));
groupCreationTab.setContent(new FXMLLoader().load(getClass().getResourceAsStream("/fxml/GroupCreationTab.fxml")));
- } catch (final IOException e2) {
- logger.log(Level.SEVERE, "An error occurred when attempting to load tabs: ", e2);
+ } catch (final IOException e) {
+ logger.log(Level.SEVERE, "An error occurred when attempting to load tabs: ", e);
}
else {
Tooltip.install(contactSpecificOnlineOperations, onlyIfOnlineTooltip);
@@ -230,12 +231,8 @@ public final class ChatScene implements EventListener, Restorable {
// Read current chat or increment unread amount
if (chat.equals(currentChat)) {
- try {
- currentChat.read(writeProxy);
- } catch (final IOException e) {
- logger.log(Level.WARNING, "Could not read current chat: ", e);
- }
- Platform.runLater(() -> { ListViewRefresh.deepRefresh(messageList); scrollToMessageListEnd(); });
+ currentChat.read(writeProxy);
+ Platform.runLater(this::scrollToMessageListEnd);
} else if (!ownMessage && message.getStatus() != MessageStatus.READ) chat.incrementUnreadAmount();
// Move chat with most recent unread messages to the top
@@ -250,33 +247,16 @@ public final class ChatScene implements EventListener, Restorable {
@Event
private void onMessageStatusChange(MessageStatusChange evt) {
- localDB.getMessage(evt.getID()).ifPresent(message -> {
- message.setStatus(evt.get());
- // Update UI if in current chat and the current user was the sender of the
- // message
- if (currentChat != null && message.getSenderID() == client.getSender().getID()) Platform.runLater(messageList::refresh);
- });
+
+ // Update UI if in current chat and the current user was the sender of the
+ // message
+ if (currentChat != null) localDB.getMessage(evt.getID())
+ .filter(msg -> msg.getSenderID() == client.getSender().getID())
+ .ifPresent(msg -> Platform.runLater(messageList::refresh));
}
- @Event
- private void onGroupMessageStatusChange(GroupMessageStatusChange evt) {
- localDB.getMessage(evt.getID()).ifPresent(groupMessage -> {
- ((GroupMessage) groupMessage).getMemberStatuses().replace(evt.getMemberID(), evt.get());
-
- // Update UI if in current chat
- if (currentChat != null && groupMessage.getRecipientID() == currentChat.getRecipient().getID()) Platform.runLater(messageList::refresh);
- });
- }
-
- @Event
- private void onUserStatusChange(UserStatusChange evt) {
- chats.getSource()
- .stream()
- .filter(c -> c.getRecipient().getID() == evt.getID())
- .findAny()
- .map(Chat::getRecipient)
- .ifPresent(u -> { ((User) u).setStatus(evt.get()); Platform.runLater(() -> ListViewRefresh.deepRefresh(chatList)); });
- }
+ @Event(eventType = UserStatusChange.class)
+ private void onUserStatusChange() { Platform.runLater(chatList::refresh); }
@Event
private void onContactOperation(ContactOperation operation) {
@@ -320,24 +300,42 @@ public final class ChatScene implements EventListener, Restorable {
clientProfilePic.setImage(IconUtil.loadIconThemeSensitive("user_icon", 43));
chatList.setCellFactory(new ListCellFactory<>(ChatControl::new));
messageList.setCellFactory(MessageListCell::new);
+ // TODO: cache image
if (currentChat.getRecipient() instanceof User) recipientProfilePic.setImage(IconUtil.loadIconThemeSensitive("user_icon", 43));
else recipientProfilePic.setImage(IconUtil.loadIconThemeSensitive("group_icon", 43));
}
+ @Event(eventType = Logout.class, priority = 200)
+ private void onLogout() { eventBus.removeListener(this); }
+
/**
* Initializes all {@code SystemCommands} used in {@code ChatScene}.
*
* @since Envoy Client v0.2-beta
*/
private void initializeSystemCommandsMap() {
- final var builder = new SystemCommandBuilder();
+ final var builder = new SystemCommandBuilder(messageTextAreaCommands);
+
// Do A Barrel roll initialization
final var random = new Random();
builder.setAction(text -> doABarrelRoll(Integer.parseInt(text.get(0)), Double.parseDouble(text.get(1))))
.setDefaults(Integer.toString(random.nextInt(3) + 1), Double.toString(random.nextDouble() * 3 + 1))
.setDescription("See for yourself :)")
- .setNumberOfArguments(2);
- messageTextAreaCommands.add("DABR", builder.build());
+ .setNumberOfArguments(2)
+ .build("dabr");
+
+ // Logout initialization
+ builder.setAction(text -> ShutdownHelper.logout()).setNumberOfArguments(0).setDescription("Logs you out.").build("logout");
+
+ // Exit initialization
+ builder.setAction(text -> ShutdownHelper.exit()).setNumberOfArguments(0).setDescription("Exits the program").build("exit", false);
+ builder.build("q");
+
+ // Open settings scene initialization
+ builder.setAction(text -> sceneContext.load(SceneInfo.SETTINGS_SCENE))
+ .setNumberOfArguments(0)
+ .setDescription("Opens the settings screen")
+ .build("settings");
}
@Override
@@ -360,18 +358,14 @@ public final class ChatScene implements EventListener, Restorable {
// Load the chat
currentChat = localDB.getChat(user.getID()).get();
- messageList.setItems(FXCollections.observableList(currentChat.getMessages()));
+ messageList.setItems(currentChat.getMessages());
final var scrollIndex = messageList.getItems().size() - currentChat.getUnreadAmount();
messageList.scrollTo(scrollIndex);
logger.log(Level.FINEST, "Loading chat with " + user + " at index " + scrollIndex);
deleteContactMenuItem.setText("Delete " + user.getName());
// Read the current chat
- try {
- currentChat.read(writeProxy);
- } catch (final IOException e) {
- logger.log(Level.WARNING, "Could not read current chat.", e);
- }
+ currentChat.read(writeProxy);
// Discard the pending attachment
if (recorder.isRecording()) {
@@ -555,8 +549,8 @@ public final class ChatScene implements EventListener, Restorable {
// Sending an IsTyping event if none has been sent for
// IsTyping#millisecondsActive
- if (currentChat.getLastWritingEvent() + IsTyping.millisecondsActive <= System.currentTimeMillis()) {
- eventBus.dispatch(new SendEvent(new IsTyping(getChatID(), currentChat.getRecipient().getID())));
+ if (client.isOnline() && currentChat.getLastWritingEvent() + IsTyping.millisecondsActive <= System.currentTimeMillis()) {
+ client.send(new IsTyping(getChatID(), currentChat.getRecipient().getID()));
currentChat.lastWritingEventWasNow();
}
@@ -665,7 +659,7 @@ public final class ChatScene implements EventListener, Restorable {
return;
}
final var text = messageTextArea.getText().strip();
- if (!messageTextAreaCommands.executeIfAnyPresent(text)) try {
+ if (!messageTextAreaCommands.executeIfAnyPresent(text)) {
// Creating the message and its metadata
final var builder = new MessageBuilder(localDB.getUser().getID(), currentChat.getRecipient().getID(), localDB.getIDGenerator())
.setText(text);
@@ -692,15 +686,10 @@ public final class ChatScene implements EventListener, Restorable {
localDB.getChats().remove(currentChat);
localDB.getChats().add(0, currentChat);
});
- ListViewRefresh.deepRefresh(messageList);
scrollToMessageListEnd();
// Request a new ID generator if all IDs were used
- if (!localDB.getIDGenerator().hasNext() && client.isOnline()) client.requestIdGenerator();
-
- } catch (final IOException e) {
- logger.log(Level.SEVERE, "Error while sending message: ", e);
- new Alert(AlertType.ERROR, "An error occured while sending the message!").showAndWait();
+ if (!localDB.getIDGenerator().hasNext() && client.isOnline()) client.requestIDGenerator();
}
// Clear text field and disable post button
diff --git a/client/src/main/java/envoy/client/ui/controller/ContactSearchTab.java b/client/src/main/java/envoy/client/ui/controller/ContactSearchTab.java
index a171489..b573345 100644
--- a/client/src/main/java/envoy/client/ui/controller/ContactSearchTab.java
+++ b/client/src/main/java/envoy/client/ui/controller/ContactSearchTab.java
@@ -7,8 +7,12 @@ import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.control.Alert.AlertType;
-import envoy.client.event.*;
-import envoy.client.ui.listcell.*;
+import envoy.client.data.Context;
+import envoy.client.event.BackEvent;
+import envoy.client.helper.AlertHelper;
+import envoy.client.net.Client;
+import envoy.client.ui.control.ContactControl;
+import envoy.client.ui.listcell.ListCellFactory;
import envoy.data.User;
import envoy.event.ElementOperation;
import envoy.event.contact.*;
@@ -25,10 +29,6 @@ import dev.kske.eventbus.*;
*
- * File: ContactSearchScene.java
- * Created: 07.06.2020
*
* @author Leon Hofmeister
* @author Maximilian Käfer
@@ -46,6 +46,7 @@ public class ContactSearchTab implements EventListener {
private final Alert alert = new Alert(AlertType.CONFIRMATION);
+ private static final Client client = Context.getInstance().getClient();
private static final EventBus eventBus = EventBus.getInstance();
private static final Logger logger = EnvoyLog.getLogger(ChatScene.class);
@@ -53,6 +54,7 @@ public class ContactSearchTab implements EventListener {
private void initialize() {
eventBus.registerListener(this);
userList.setCellFactory(new ListCellFactory<>(ContactControl::new));
+ alert.setTitle("Add User?");
}
@Event
@@ -77,7 +79,7 @@ public class ContactSearchTab implements EventListener {
@FXML
private void sendRequest() {
final var text = searchBar.getText().strip();
- if (!text.isBlank()) eventBus.dispatch(new SendEvent(new UserSearchRequest(text)));
+ if (!text.isBlank()) client.send(new UserSearchRequest(text));
else userList.getItems().clear();
}
@@ -104,16 +106,23 @@ public class ContactSearchTab implements EventListener {
final var user = userList.getSelectionModel().getSelectedItem();
if (user != null) {
currentlySelectedUser = user;
- final var event = new ContactOperation(currentlySelectedUser, ElementOperation.ADD);
- // Sends the event to the server
- eventBus.dispatch(new SendEvent(event));
- // Removes the chosen user and updates the UI
- userList.getItems().remove(currentlySelectedUser);
- eventBus.dispatch(event);
- logger.log(Level.INFO, "Added user " + currentlySelectedUser);
+ alert.setContentText("Add user " + currentlySelectedUser.getName() + " to your contacts?");
+ AlertHelper.confirmAction(alert, this::addAsContact);
}
}
+ private void addAsContact() {
+
+ // Sends the event to the server
+ final var event = new ContactOperation(currentlySelectedUser, ElementOperation.ADD);
+ client.send(event);
+
+ // Removes the chosen user and updates the UI
+ userList.getItems().remove(currentlySelectedUser);
+ eventBus.dispatch(event);
+ logger.log(Level.INFO, "Added user " + currentlySelectedUser);
+ }
+
@FXML
private void backButtonClicked() { eventBus.dispatch(new BackEvent()); }
}
diff --git a/client/src/main/java/envoy/client/ui/controller/GroupCreationTab.java b/client/src/main/java/envoy/client/ui/controller/GroupCreationTab.java
index d2f61a6..4243ce4 100644
--- a/client/src/main/java/envoy/client/ui/controller/GroupCreationTab.java
+++ b/client/src/main/java/envoy/client/ui/controller/GroupCreationTab.java
@@ -10,8 +10,9 @@ import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import envoy.client.data.*;
-import envoy.client.event.*;
-import envoy.client.ui.listcell.*;
+import envoy.client.event.BackEvent;
+import envoy.client.ui.control.ContactControl;
+import envoy.client.ui.listcell.ListCellFactory;
import envoy.data.*;
import envoy.event.GroupCreation;
import envoy.event.contact.ContactOperation;
@@ -27,10 +28,6 @@ import dev.kske.eventbus.*;
* When the group creation button is pressed, a {@link GroupCreation} is sent to
* the server. This controller enforces a valid group name and a non-empty
* member list (excluding the client user).
- *
- * File: GroupCreationScene.java
- * Created: 07.06.2020
*
* @author Maximilian Käfer
* @since Envoy Client v0.1-beta
@@ -137,8 +134,9 @@ public class GroupCreationTab implements EventListener {
* @since Envoy Client v0.1-beta
*/
private void createGroup(String name) {
- eventBus.dispatch(new SendEvent(
- new GroupCreation(name, userList.getSelectionModel().getSelectedItems().stream().map(User::getID).collect(Collectors.toSet()))));
+ Context.getInstance()
+ .getClient()
+ .send(new GroupCreation(name, userList.getSelectionModel().getSelectedItems().stream().map(User::getID).collect(Collectors.toSet())));
}
/**
@@ -150,12 +148,7 @@ public class GroupCreationTab implements EventListener {
* @since Envoy Client v0.1-beta
*/
public boolean groupNameAlreadyPresent(String newName) {
- return localDB.getChats()
- .stream()
- .map(Chat::getRecipient)
- .filter(Group.class::isInstance)
- .map(Contact::getName)
- .anyMatch(newName::equals);
+ return localDB.getChats().stream().map(Chat::getRecipient).filter(Group.class::isInstance).map(Contact::getName).anyMatch(newName::equals);
}
@FXML
@@ -211,7 +204,7 @@ public class GroupCreationTab implements EventListener {
userList.getItems().add((User) operation.get());
break;
case REMOVE:
- userList.getItems().removeIf(u -> u.equals(operation.get()));
+ userList.getItems().removeIf(operation.get()::equals);
break;
}
});
diff --git a/client/src/main/java/envoy/client/ui/controller/LoginScene.java b/client/src/main/java/envoy/client/ui/controller/LoginScene.java
index 30cb205..6176f8c 100644
--- a/client/src/main/java/envoy/client/ui/controller/LoginScene.java
+++ b/client/src/main/java/envoy/client/ui/controller/LoginScene.java
@@ -12,6 +12,7 @@ import javafx.scene.image.ImageView;
import envoy.client.data.ClientConfig;
import envoy.client.ui.*;
+import envoy.client.util.IconUtil;
import envoy.data.LoginCredentials;
import envoy.event.HandshakeRejection;
import envoy.util.*;
@@ -19,9 +20,7 @@ import envoy.util.*;
import dev.kske.eventbus.*;
/**
- * Project: envoy-client
- * File: LoginDialog.java
- * Created: 03.04.2020
+ * Controller for the login scene.
*
* @author Kai S. K. Engelbart
* @author Maximilian Käfer
@@ -101,20 +100,21 @@ public final class LoginScene implements EventListener {
@FXML
private void registerSwitchPressed() {
+
+ // Update button text and register switch
if (!registration) {
- // case if the current mode is login
loginButton.setText("Register");
loginButton.setPadding(new Insets(2, 116, 2, 116));
registerTextLabel.setText("Already an account?");
registerSwitch.setText("Login");
} else {
- // case if the current mode is registration
loginButton.setText("Login");
loginButton.setPadding(new Insets(2, 125, 2, 125));
registerTextLabel.setText("No account yet?");
registerSwitch.setText("Register");
}
registration = !registration;
+
// Make repeat password field and label visible / invisible
repeatPasswordField.setVisible(registration);
offlineModeButton.setDisable(registration);
diff --git a/client/src/main/java/envoy/client/ui/controller/SettingsScene.java b/client/src/main/java/envoy/client/ui/controller/SettingsScene.java
index bd3a237..f69475a 100644
--- a/client/src/main/java/envoy/client/ui/controller/SettingsScene.java
+++ b/client/src/main/java/envoy/client/ui/controller/SettingsScene.java
@@ -1,20 +1,14 @@
package envoy.client.ui.controller;
import javafx.fxml.FXML;
-import javafx.scene.control.Label;
-import javafx.scene.control.ListView;
-import javafx.scene.control.TitledPane;
+import javafx.scene.control.*;
import envoy.client.data.Context;
-import envoy.client.net.Client;
-import envoy.client.ui.SceneContext;
-import envoy.client.ui.listcell.AbstractListCell;
+import envoy.client.ui.listcell.ListCellFactory;
import envoy.client.ui.settings.*;
/**
- * Project: envoy-client
- * File: SettingsSceneController.java
- * Created: 10.04.2020
+ * Controller for the settings scene.
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
@@ -27,20 +21,10 @@ public final class SettingsScene {
@FXML
private TitledPane titledPane;
- private final Client client = Context.getInstance().getClient();
- private final SceneContext sceneContext = Context.getInstance().getSceneContext();
-
@FXML
private void initialize() {
- settingsList.setCellFactory(listView -> new AbstractListCell<>(listView) {
-
- @Override
- protected Label renderItem(SettingsPane item) { return new Label(item.getTitle()); }
- });
- settingsList.getItems().add(new GeneralSettingsPane());
- settingsList.getItems().add(new UserSettingsPane(sceneContext, client.getSender(), client.isOnline()));
- settingsList.getItems().add(new DownloadSettingsPane(sceneContext));
- settingsList.getItems().add(new BugReportPane(client.getSender(), client.isOnline()));
+ settingsList.setCellFactory(new ListCellFactory<>(pane -> new Label(pane.getTitle())));
+ settingsList.getItems().addAll(new GeneralSettingsPane(), new UserSettingsPane(), new DownloadSettingsPane(), new BugReportPane());
}
@FXML
@@ -53,5 +37,5 @@ public final class SettingsScene {
}
@FXML
- private void backButtonClicked() { sceneContext.pop(); }
+ private void backButtonClicked() { Context.getInstance().getSceneContext().pop(); }
}
diff --git a/client/src/main/java/envoy/client/ui/controller/Tabs.java b/client/src/main/java/envoy/client/ui/controller/Tabs.java
index 0940cd3..9889e3d 100644
--- a/client/src/main/java/envoy/client/ui/controller/Tabs.java
+++ b/client/src/main/java/envoy/client/ui/controller/Tabs.java
@@ -2,10 +2,6 @@ package envoy.client.ui.controller;
/**
* Provides options to select different tabs.
- *
- * File: Tabs.java
- * Created: 30.8.2020
*
* @author Maximilian Käfer
* @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/ui/controller/package-info.java b/client/src/main/java/envoy/client/ui/controller/package-info.java
index 7989b8f..fcd4b35 100644
--- a/client/src/main/java/envoy/client/ui/controller/package-info.java
+++ b/client/src/main/java/envoy/client/ui/controller/package-info.java
@@ -1,11 +1,9 @@
/**
* Contains JavaFX scene controllers.
- *
- * File: package-info.java
- * Created: 08.06.2020
*
* @author Kai S. K. Engelbart
+ * @author Leon Hofmeister
+ * @author Maximilian Käfer
* @since Envoy Client v0.1-beta
*/
package envoy.client.ui.controller;
diff --git a/client/src/main/java/envoy/client/ui/custom/package-info.java b/client/src/main/java/envoy/client/ui/custom/package-info.java
deleted file mode 100644
index 97a8f58..0000000
--- a/client/src/main/java/envoy/client/ui/custom/package-info.java
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * This package stores custom components for use in JavaFX.
- * These components are also expected to be used via FXML.
- *
- * File: package-info.java
- * Created: 30.07.2020
- *
- * @author Leon Hofmeister
- * @author Maximilian Käfer
- * @author Kai S. K. Engelbart
- * @since Envoy Client v0.2-beta
- */
-package envoy.client.ui.custom;
diff --git a/client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java b/client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java
index a763981..1e12021 100644
--- a/client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java
+++ b/client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java
@@ -1,17 +1,10 @@
package envoy.client.ui.listcell;
-import javafx.scene.Cursor;
-import javafx.scene.Node;
-import javafx.scene.control.ContentDisplay;
-import javafx.scene.control.ListCell;
-import javafx.scene.control.ListView;
+import javafx.scene.*;
+import javafx.scene.control.*;
/**
* Provides a convenience frame for list cell creation.
- *
- * File: AbstractListCell.java
- * Created: 18.07.2020
*
* @author Kai S. K. Engelbart
* @param
- * File: GenericListCell.java
- * Created: 18.07.2020
*
* @author Kai S. K. Engelbart
* @param
- * File: ListCellFactory.java
- * Created: 13.07.2020
*
* @author Kai S. K. Engelbart
* @param
- * File: MessageListCell.java
- * Created: 18.07.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/ui/listcell/package-info.java b/client/src/main/java/envoy/client/ui/listcell/package-info.java
index ab0788e..dd5dd33 100644
--- a/client/src/main/java/envoy/client/ui/listcell/package-info.java
+++ b/client/src/main/java/envoy/client/ui/listcell/package-info.java
@@ -1,12 +1,9 @@
/**
* This package contains custom list cells that are used to display certain
* things.
- *
- * File: package-info.java
- * Created: 30.06.2020
*
* @author Leon Hofmeister
+ * @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
*/
package envoy.client.ui.listcell;
diff --git a/client/src/main/java/envoy/client/ui/settings/BugReportPane.java b/client/src/main/java/envoy/client/ui/settings/BugReportPane.java
index 88b0397..1f2e98f 100644
--- a/client/src/main/java/envoy/client/ui/settings/BugReportPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/BugReportPane.java
@@ -4,25 +4,17 @@ import javafx.event.EventHandler;
import javafx.scene.control.*;
import javafx.scene.input.InputEvent;
-import envoy.client.event.SendEvent;
import envoy.client.util.IssueUtil;
-import envoy.data.User;
import envoy.event.IssueProposal;
-import dev.kske.eventbus.EventBus;
-
/**
* This class offers the option for users to submit a bug report. Only the title
* of a bug is needed to be sent.
- *
- * File: BugReportPane.java
- * Created: Aug 4, 2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
*/
-public final class BugReportPane extends OnlyIfOnlineSettingsPane {
+public final class BugReportPane extends OnlineOnlySettingsPane {
private final Label titleLabel = new Label("Suggest a title for the bug:");
private final TextField titleTextField = new TextField();
@@ -36,12 +28,10 @@ public final class BugReportPane extends OnlyIfOnlineSettingsPane {
/**
* Creates a new {@code BugReportPane}.
*
- * @param user the user whose details to use
- * @param online whether this user is currently online
* @since Envoy Client v0.2-beta
*/
- public BugReportPane(User user, boolean online) {
- super("Report a bug", online);
+ public BugReportPane() {
+ super("Report a bug");
setSpacing(10);
setToolTipText("A bug can only be reported while being online");
@@ -68,12 +58,8 @@ public final class BugReportPane extends OnlyIfOnlineSettingsPane {
// Displaying the submitReportButton
submitReportButton.setDisable(true);
- submitReportButton.setOnAction(e -> {
- EventBus.getInstance()
- .dispatch(new SendEvent(new IssueProposal(titleTextField.getText(),
- IssueUtil.sanitizeIssueDescription(errorDetailArea.getText(), showUsernameInBugReport.isSelected() ? user.getName() : null),
- true)));
- });
+ submitReportButton.setOnAction(e -> client.send(new IssueProposal(titleTextField.getText(), IssueUtil
+ .sanitizeIssueDescription(errorDetailArea.getText(), showUsernameInBugReport.isSelected() ? client.getSender().getName() : null), true)));
getChildren().add(submitReportButton);
}
}
diff --git a/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java
index fe358c1..4bcb1d8 100644
--- a/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java
@@ -5,14 +5,10 @@ import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.stage.DirectoryChooser;
-import envoy.client.ui.SceneContext;
+import envoy.client.data.Context;
/**
* Displays options for downloading {@link envoy.data.Attachment}s.
- *
- * File: DownloadSettingsPane.java
- * Created: 27.07.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
@@ -22,15 +18,14 @@ public final class DownloadSettingsPane extends SettingsPane {
/**
* Constructs a new {@code DownloadSettingsPane}.
*
- * @param sceneContext the {@code SceneContext} used to block input to the
- * {@link javafx.stage.Stage} used in Envoy
* @since Envoy Client v0.2-beta
*/
- public DownloadSettingsPane(SceneContext sceneContext) {
+ public DownloadSettingsPane() {
super("Download");
setSpacing(15);
setPadding(new Insets(15));
- // checkbox to disable asking
+
+ // Checkbox to disable asking
final var checkBox = new CheckBox(settings.getItems().get("autoSaveDownloads").getUserFriendlyName());
checkBox.setSelected(settings.isDownloadSavedWithoutAsking());
checkBox.setTooltip(new Tooltip("Determines whether a \"Select save location\" - dialogue will be shown when saving attachments."));
@@ -52,7 +47,7 @@ public final class DownloadSettingsPane extends SettingsPane {
final var directoryChooser = new DirectoryChooser();
directoryChooser.setTitle("Select the directory where attachments should be saved to");
directoryChooser.setInitialDirectory(settings.getDownloadLocation());
- final var selectedDirectory = directoryChooser.showDialog(sceneContext.getStage());
+ final var selectedDirectory = directoryChooser.showDialog(Context.getInstance().getSceneContext().getStage());
if (selectedDirectory != null) {
currentPath.setText(selectedDirectory.getAbsolutePath());
diff --git a/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java
index cb87294..bc8cba6 100644
--- a/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java
@@ -4,15 +4,12 @@ import javafx.scene.control.*;
import envoy.client.data.SettingsItem;
import envoy.client.event.ThemeChangeEvent;
+import envoy.client.helper.ShutdownHelper;
import envoy.data.User.UserStatus;
import dev.kske.eventbus.EventBus;
/**
- * Project: envoy-client
- * File: GeneralSettingsPane.java
- * Created: 18.04.2020
- *
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
*/
@@ -28,23 +25,30 @@ public final class GeneralSettingsPane extends SettingsPane {
// TODO: Support other value types
final var settingsItems = settings.getItems();
final var hideOnCloseCheckbox = new SettingsCheckbox((SettingsItem
- * File: OnlyIfOnlineSettingsPane.java
- * Created: 04.08.2020
*
* @author Leon Hofmeister
+ * @author Kai S. K. Engelbart
* @since Envoy Client v0.2-beta
*/
-public abstract class OnlyIfOnlineSettingsPane extends SettingsPane {
+public abstract class OnlineOnlySettingsPane extends SettingsPane {
+
+ protected final Client client = Context.getInstance().getClient();
private final Tooltip beOnlineReminder = new Tooltip("You need to be online to modify your account.");
/**
- * @param title
+ * @param title the title of this pane
* @since Envoy Client v0.2-beta
*/
- protected OnlyIfOnlineSettingsPane(String title, boolean online) {
+ protected OnlineOnlySettingsPane(String title) {
super(title);
- setDisable(!online);
+ setDisable(!client.isOnline());
- if (!online) {
+ if (!client.isOnline()) {
final var infoLabel = new Label("You shall not pass!\n(... Unless you would happen to be online)");
infoLabel.setId("info-label-warning");
infoLabel.setWrapText(true);
@@ -45,5 +44,11 @@ public abstract class OnlyIfOnlineSettingsPane extends SettingsPane {
} else Tooltip.uninstall(this, beOnlineReminder);
}
+ /**
+ * Sets the text of the tooltip displayed for this pane.
+ *
+ * @param text the text to display
+ * @since Envoy Client v0.2-beta
+ */
protected void setToolTipText(String text) { beOnlineReminder.setText(text); }
}
diff --git a/client/src/main/java/envoy/client/ui/settings/SettingsCheckbox.java b/client/src/main/java/envoy/client/ui/settings/SettingsCheckbox.java
index b672d5a..b171d07 100644
--- a/client/src/main/java/envoy/client/ui/settings/SettingsCheckbox.java
+++ b/client/src/main/java/envoy/client/ui/settings/SettingsCheckbox.java
@@ -6,10 +6,6 @@ import javafx.scene.control.CheckBox;
import envoy.client.data.SettingsItem;
/**
- * Project: envoy-client
- * File: SettingsToggleButton.java
- * Created: 18.04.2020
- *
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
*/
diff --git a/client/src/main/java/envoy/client/ui/settings/SettingsPane.java b/client/src/main/java/envoy/client/ui/settings/SettingsPane.java
index be63f26..5dc9796 100644
--- a/client/src/main/java/envoy/client/ui/settings/SettingsPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/SettingsPane.java
@@ -5,10 +5,6 @@ import javafx.scene.layout.VBox;
import envoy.client.data.Settings;
/**
- * Project: envoy-client
- * File: SettingsPane.java
- * Created: 18.04.2020
- *
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
*/
diff --git a/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
index 498a940..5c6e730 100644
--- a/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
@@ -14,24 +14,19 @@ import javafx.scene.input.InputEvent;
import javafx.scene.layout.HBox;
import javafx.stage.FileChooser;
-import envoy.client.event.SendEvent;
-import envoy.client.ui.*;
-import envoy.client.ui.custom.ProfilePicImageView;
-import envoy.data.User;
+import envoy.client.data.Context;
+import envoy.client.ui.control.ProfilePicImageView;
+import envoy.client.util.IconUtil;
import envoy.event.*;
import envoy.util.*;
import dev.kske.eventbus.EventBus;
/**
- * Project: envoy-client
- * File: UserSettingsPane.java
- * Created: 31.07.2020
- *
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
*/
-public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
+public final class UserSettingsPane extends OnlineOnlySettingsPane {
private boolean profilePicChanged, usernameChanged, validPassword;
private byte[] currentImageBytes;
@@ -50,13 +45,10 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
/**
* Creates a new {@code UserSettingsPane}.
*
- * @param sceneContext the {@code SceneContext} to block input to Envoy
- * @param user the user who wants to customize his profile
- * @param online whether this user is currently online
* @since Envoy Client v0.2-beta
*/
- public UserSettingsPane(SceneContext sceneContext, User user, boolean online) {
- super("User", online);
+ public UserSettingsPane() {
+ super("User");
setSpacing(10);
// Display of profile pic change mechanism
@@ -67,18 +59,19 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
profilePic.setFitWidth(60);
profilePic.setFitHeight(60);
profilePic.setOnMouseClicked(e -> {
- if (!online) return;
+ if (!client.isOnline()) return;
final var pictureChooser = new FileChooser();
pictureChooser.setTitle("Select a new profile pic");
pictureChooser.setInitialDirectory(new File(System.getProperty("user.home")));
pictureChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Pictures", "*.png", "*.jpg", "*.bmp", "*.gif"));
- final var file = pictureChooser.showOpenDialog(sceneContext.getStage());
+ final var file = pictureChooser.showOpenDialog(Context.getInstance().getSceneContext().getStage());
if (file != null) {
// Check max file size
+ // TODO: Move to config
if (file.length() > 5E6) {
new Alert(AlertType.WARNING, "The selected file exceeds the size limit of 5MB!").showAndWait();
return;
@@ -96,7 +89,7 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
hbox.getChildren().add(profilePic);
// Displaying the username change mechanism
- final var username = user.getName();
+ final var username = client.getSender().getName();
newUsername = username;
usernameTextField.setText(username);
final EventHandler super InputEvent> textChanged = e -> {
@@ -133,7 +126,7 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
}
// Displaying the save button
- saveButton.setOnAction(e -> save(user.getID(), currentPasswordField.getText()));
+ saveButton.setOnAction(e -> save(client.getSender().getID(), currentPasswordField.getText()));
saveButton.setAlignment(Pos.BOTTOM_RIGHT);
getChildren().add(saveButton);
}
@@ -150,7 +143,7 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
if (profilePicChanged) {
final var profilePicChangeEvent = new ProfilePicChange(currentImageBytes, userID);
eventBus.dispatch(profilePicChangeEvent);
- eventBus.dispatch(new SendEvent(profilePicChangeEvent));
+ client.send(profilePicChangeEvent);
logger.log(Level.INFO, "The user just changed his profile pic.");
}
@@ -158,8 +151,8 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
final var validContactName = Bounds.isValidContactName(newUsername);
if (usernameChanged && validContactName) {
final var nameChangeEvent = new NameChange(userID, newUsername);
- eventBus.dispatch(new SendEvent(nameChangeEvent));
eventBus.dispatch(nameChangeEvent);
+ client.send(nameChangeEvent);
logger.log(Level.INFO, "The user just changed his name to " + newUsername + ".");
} else if (!validContactName) {
final var alert = new Alert(AlertType.ERROR);
@@ -172,14 +165,13 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
// The password was changed
if (validPassword) {
- eventBus.dispatch(new SendEvent(new PasswordChangeRequest(newPassword, oldPassword, userID)));
+ client.send(new PasswordChangeRequest(newPassword, oldPassword, userID));
logger.log(Level.INFO, "The user just tried to change his password!");
} else if (!(validPassword || newPassword.isBlank())) {
final var alert = new Alert(AlertType.ERROR);
alert.setTitle("Unequal Password");
alert.setContentText("Repeated password is unequal to the chosen new password");
alert.showAndWait();
- return;
}
}
}
diff --git a/client/src/main/java/envoy/client/ui/settings/package-info.java b/client/src/main/java/envoy/client/ui/settings/package-info.java
index e908b93..ea3fdb6 100644
--- a/client/src/main/java/envoy/client/ui/settings/package-info.java
+++ b/client/src/main/java/envoy/client/ui/settings/package-info.java
@@ -1,10 +1,6 @@
/**
* This package contains classes used for representing the settings
* visually.
- *
- * File: package-info.java
- * Created: 19 Apr 2020
*
* @author Leon Hofmeister
* @author Kai S. K. Engelbart
diff --git a/client/src/main/java/envoy/client/ui/IconUtil.java b/client/src/main/java/envoy/client/util/IconUtil.java
similarity index 87%
rename from client/src/main/java/envoy/client/ui/IconUtil.java
rename to client/src/main/java/envoy/client/util/IconUtil.java
index 2da4d35..42a8554 100644
--- a/client/src/main/java/envoy/client/ui/IconUtil.java
+++ b/client/src/main/java/envoy/client/util/IconUtil.java
@@ -1,9 +1,8 @@
-package envoy.client.ui;
+package envoy.client.util;
import java.awt.image.BufferedImage;
import java.io.IOException;
-import java.util.EnumMap;
-import java.util.EnumSet;
+import java.util.*;
import java.util.logging.Level;
import javax.imageio.ImageIO;
@@ -16,10 +15,6 @@ import envoy.util.EnvoyLog;
/**
* Provides static utility methods for loading icons from the resource
* folder.
- *
- * File: IconUtil.java
- * Created: 16.03.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Client v0.1-beta
@@ -35,15 +30,7 @@ public final class IconUtil {
* @return the loaded image
* @since Envoy Client v0.1-beta
*/
- public static Image load(String path) {
- Image image = null;
- try {
- image = new Image(IconUtil.class.getResource(path).toExternalForm());
- } catch (final NullPointerException e) {
- EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e);
- }
- return image;
- }
+ public static Image load(String path) { return new Image(IconUtil.class.getResource(path).toExternalForm()); }
/**
* Loads an image from the resource folder and scales it to the given size.
@@ -54,13 +41,7 @@ public final class IconUtil {
* @since Envoy Client v0.1-beta
*/
public static Image load(String path, int size) {
- Image image = null;
- try {
- image = new Image(IconUtil.class.getResource(path).toExternalForm(), size, size, true, true);
- } catch (final NullPointerException e) {
- EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e);
- }
- return image;
+ return new Image(IconUtil.class.getResource(path).toExternalForm(), size, size, true, true);
}
/**
diff --git a/client/src/main/java/envoy/client/util/IssueUtil.java b/client/src/main/java/envoy/client/util/IssueUtil.java
index 6c6e165..8933a67 100644
--- a/client/src/main/java/envoy/client/util/IssueUtil.java
+++ b/client/src/main/java/envoy/client/util/IssueUtil.java
@@ -2,39 +2,34 @@ package envoy.client.util;
/**
* Provides methods to handle outgoing issues.
- *
- * File: IssueUtil.java
- * Created: 20.08.2020
*
* @author Leon Hofmeister
+ * @author Kai S. K. Engelbart
* @since Envoy Client v0.2-beta
*/
public final class IssueUtil {
- /**
- *
- * @since Envoy Client v0.2-beta
- */
private IssueUtil() {}
/**
- * Performs actions to ensure the description of an issue will be displayed as
- * intended by the user.
+ * Normalizes line breaks and appends the user name to the issue description if
+ * requested.
*
- * @param rawDescription the description to sanitize
- * @param username the user who submitted the issue. Should be
- * {@code null} if he does not want to be named.
+ * @param description the description to sanitize
+ * @param username the user who submitted the issue. Should be
+ * {@code null} if he does not want to be named.
* @return the sanitized description
* @since Envoy Client v0.2-beta
*/
- public static String sanitizeIssueDescription(String rawDescription, String username) {
- // Appending the submitter name, if this option was enabled
- rawDescription += username != null
- ? (rawDescription.endsWith("\n") || rawDescription.endsWith("
") ? "" : "
") + String.format("Submitted by user %s.", username)
- : "";
- // Markdown does not support "normal" line breaks. It uses "
"
- rawDescription = rawDescription.replaceAll(System.getProperty("line.separator", "\r?\n"), "
");
- return rawDescription;
+ public static String sanitizeIssueDescription(String description, String username) {
+
+ // Trim and replace line breaks by
tags
+ description = description.trim().replaceAll(System.getProperty("line.separator"), "
");
+
+ // Append user name if requested
+ if (username != null)
+ description += String.format("
Submitted by user %s.", username);
+
+ return description;
}
}
diff --git a/client/src/main/java/envoy/client/util/ReflectionUtil.java b/client/src/main/java/envoy/client/util/ReflectionUtil.java
index abdfd51..49273f8 100644
--- a/client/src/main/java/envoy/client/util/ReflectionUtil.java
+++ b/client/src/main/java/envoy/client/util/ReflectionUtil.java
@@ -1,17 +1,11 @@
package envoy.client.util;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
+import java.util.*;
+import java.util.stream.*;
import javafx.scene.Node;
/**
- * Project: envoy-client
- * File: ReflectionUtil.java
- * Created: 02.08.2020
- *
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
*/
@@ -20,8 +14,9 @@ public final class ReflectionUtil {
private ReflectionUtil() {}
/**
- * Gets all declared variables of the given instance that have the specified
- * class
+ * Gets all declared variable values of the given instance that have the
+ * specified class.
+ *
- * File: package-info.java
- * Created: 02.08.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/module-info.java b/client/src/main/java/module-info.java
index 4382521..e0f86ba 100644
--- a/client/src/main/java/module-info.java
+++ b/client/src/main/java/module-info.java
@@ -20,7 +20,7 @@ module envoy.client {
opens envoy.client.ui to javafx.graphics, javafx.fxml, dev.kske.eventbus;
opens envoy.client.ui.controller to javafx.graphics, javafx.fxml, envoy.client.util, dev.kske.eventbus;
- opens envoy.client.ui.custom to javafx.graphics, javafx.fxml;
+ opens envoy.client.ui.control to javafx.graphics, javafx.fxml;
opens envoy.client.ui.settings to envoy.client.util;
opens envoy.client.net to dev.kske.eventbus;
opens envoy.client.data to dev.kske.eventbus;
diff --git a/common/src/main/java/envoy/data/Attachment.java b/common/src/main/java/envoy/data/Attachment.java
index 292284a..31e83fb 100644
--- a/common/src/main/java/envoy/data/Attachment.java
+++ b/common/src/main/java/envoy/data/Attachment.java
@@ -5,10 +5,6 @@ import java.io.Serializable;
/**
* This interface should be used for any type supposed to be a {@link Message}
* attachment (i.e. images or sound).
- *
- * File: Attachment.java
- * Created: 30 Dec 2019
*
* @author Leon Hofmeister
* @author Kai S. K. Engelbart
diff --git a/common/src/main/java/envoy/data/Config.java b/common/src/main/java/envoy/data/Config.java
index 7b7c097..74798fb 100644
--- a/common/src/main/java/envoy/data/Config.java
+++ b/common/src/main/java/envoy/data/Config.java
@@ -1,7 +1,6 @@
package envoy.data;
-import java.io.File;
-import java.io.IOException;
+import java.io.*;
import java.util.*;
import java.util.function.Function;
import java.util.logging.Level;
@@ -19,10 +18,6 @@ import envoy.util.EnvoyLog;
* default value or over command line argument. Developers that fail to provide
* default values will be greeted with an error message the next time they try
* to start Envoy...
- *
- * File: Config.java
- * Created: 12 Oct 2019
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.1-beta
@@ -104,6 +99,7 @@ public class Config {
public void loadAll(Class> declaringClass, String propertiesFilePath, String[] args) {
if (modificationDisabled)
throw new IllegalStateException("Cannot change config after isInitialized has been called");
+
// Load the defaults from the given .properties file first
final var properties = new Properties();
try {
@@ -120,6 +116,7 @@ public class Config {
// Check if all configuration values have been initialized
isInitialized();
+
// Disable further editing of the config
modificationDisabled = true;
}
@@ -130,10 +127,9 @@ public class Config {
* @since Envoy Common v0.1-beta
*/
private void isInitialized() {
- if (items.values().stream().map(ConfigItem::get).anyMatch(Objects::isNull))
- throw new IllegalStateException("config item(s) has/ have not been initialized:"
- + items.values().stream().filter(configItem -> configItem.get() == null)
- .map(ConfigItem::getCommandLong).collect(Collectors.toSet()));
+ String uninitialized = items.values().stream().filter(c -> c.get() == null).map(ConfigItem::getCommandLong).collect(Collectors.joining(", "));
+ if(!uninitialized.isEmpty())
+ throw new IllegalStateException("Config items uninitialized: " + uninitialized);
}
/**
diff --git a/common/src/main/java/envoy/data/ConfigItem.java b/common/src/main/java/envoy/data/ConfigItem.java
index 5f61750..e3bdc42 100644
--- a/common/src/main/java/envoy/data/ConfigItem.java
+++ b/common/src/main/java/envoy/data/ConfigItem.java
@@ -7,10 +7,6 @@ import java.util.function.Function;
* line arguments and its default value.
*
- * File: ConfigItem.javaEvent.java
- * Created: 21.12.2019
*
* @author Kai S. K. Engelbart
* @param
* It provides an id and a name for each user and group.
- *
- * Project: envoy-common
- * File: Contact.java
- * Created: 24 Mar 2020
*
* @author Leon Hofmeister
* @since Envoy v0.1-beta
diff --git a/common/src/main/java/envoy/data/Group.java b/common/src/main/java/envoy/data/Group.java
index fd7d074..40a0cb1 100644
--- a/common/src/main/java/envoy/data/Group.java
+++ b/common/src/main/java/envoy/data/Group.java
@@ -1,15 +1,9 @@
package envoy.data;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.HashSet;
-import java.util.Set;
+import java.io.*;
+import java.util.*;
/**
- * Project: envoy-common
- * File: Group.java
- * Created: 24 Mar 2020
- *
* @author Leon Hofmeister
* @since Envoy Common v0.1-beta
*/
diff --git a/common/src/main/java/envoy/data/GroupMessage.java b/common/src/main/java/envoy/data/GroupMessage.java
index 93b8658..fec27f8 100644
--- a/common/src/main/java/envoy/data/GroupMessage.java
+++ b/common/src/main/java/envoy/data/GroupMessage.java
@@ -1,14 +1,9 @@
package envoy.data;
import java.time.Instant;
-import java.util.Collections;
-import java.util.Map;
+import java.util.*;
/**
- * Project: envoy-common
- * File: GroupMessage.java
- * Created: 26.03.2020
- *
* @author Maximilian Käfer
* @since Envoy Common v0.1-beta
*/
diff --git a/common/src/main/java/envoy/data/IDGenerator.java b/common/src/main/java/envoy/data/IDGenerator.java
index 45d6966..774c348 100644
--- a/common/src/main/java/envoy/data/IDGenerator.java
+++ b/common/src/main/java/envoy/data/IDGenerator.java
@@ -2,17 +2,15 @@ package envoy.data;
import java.io.Serializable;
+import dev.kske.eventbus.IEvent;
+
/**
- * Generates increasing IDs between two numbers.
- *
- * Project: envoy-common
- * File: IDGenerator.java
- * Created: 31.12.2019
+ * Generates increasing IDs between two numbers.
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.2-alpha
*/
-public final class IDGenerator implements Serializable {
+public final class IDGenerator implements IEvent, Serializable {
private final long end;
private long current;
diff --git a/common/src/main/java/envoy/data/LoginCredentials.java b/common/src/main/java/envoy/data/LoginCredentials.java
index e4edd72..3848989 100644
--- a/common/src/main/java/envoy/data/LoginCredentials.java
+++ b/common/src/main/java/envoy/data/LoginCredentials.java
@@ -9,10 +9,6 @@ import java.time.Instant;
*
- * File: LoginCredentials.java
- * Created: 29.12.2019
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/data/Message.java b/common/src/main/java/envoy/data/Message.java
index 3258e34..e642566 100644
--- a/common/src/main/java/envoy/data/Message.java
+++ b/common/src/main/java/envoy/data/Message.java
@@ -9,10 +9,6 @@ import dev.kske.eventbus.IEvent;
* Represents a unique message with a unique, numeric ID. Further metadata
* includes the sender and recipient {@link User}s, as well as the creation
* date and the current {@link MessageStatus}.
- *
- * Project: envoy-common
- * File: Message.java
- * Created: 28.12.2019
*
* @author Kai S. K. Engelbart
* @author Leon Hofmeister
@@ -28,23 +24,22 @@ public class Message implements Serializable, IEvent {
public enum MessageStatus {
/**
- * is selected, if a message was sent but not received by the server yet.
+ * The message has not yet been sent to the server
*/
WAITING,
/**
- * is selected, if a sent message was received by the server.
+ * The message has been sent to the server.
*/
SENT,
/**
- * is selected, if a message was delivered from the server to the recipient, but
- * has not been read yet.
+ * The message has been received by its recipient.
*/
RECEIVED,
/**
- * is selected, if a recipient opened the corresponding chat of said message.
+ * The message has been read by its recipient.
*/
READ
}
diff --git a/common/src/main/java/envoy/data/MessageBuilder.java b/common/src/main/java/envoy/data/MessageBuilder.java
index b1a3f74..9c5eb95 100644
--- a/common/src/main/java/envoy/data/MessageBuilder.java
+++ b/common/src/main/java/envoy/data/MessageBuilder.java
@@ -7,10 +7,6 @@ import envoy.data.Message.MessageStatus;
/**
* Provides a method of constructing the {@link Message} class.
- *
- * Project: envoy-common
- * File: MessageBuilder.java
- * Created: 31.12.2019
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/data/User.java b/common/src/main/java/envoy/data/User.java
index a423934..ab83070 100644
--- a/common/src/main/java/envoy/data/User.java
+++ b/common/src/main/java/envoy/data/User.java
@@ -1,17 +1,11 @@
package envoy.data;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.HashSet;
-import java.util.Set;
+import java.io.*;
+import java.util.*;
/**
* Represents a unique user with a unique, numeric ID, a name and a current
* {@link UserStatus}.
- *
- * Project: envoy-common
- * File: User.java
- * Created: 28.12.2019
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.2-alpha
@@ -32,7 +26,7 @@ public final class User extends Contact {
*
* @since Envoy Common v0.2-alpha
*/
- public static enum UserStatus {
+ public enum UserStatus {
/**
* select this, if a user is online and can be interacted with
diff --git a/common/src/main/java/envoy/data/package-info.java b/common/src/main/java/envoy/data/package-info.java
index 39df4f5..10865d0 100644
--- a/common/src/main/java/envoy/data/package-info.java
+++ b/common/src/main/java/envoy/data/package-info.java
@@ -1,6 +1,6 @@
/**
* This package contains all data objects that are used both by Envoy Client and
- * by Envoy Server Standalone.
+ * by Envoy Server.
*
* @author Leon Hofmeister
* @author Maximilian Käfer
diff --git a/common/src/main/java/envoy/event/ElementOperation.java b/common/src/main/java/envoy/event/ElementOperation.java
index b7d4c10..e585a84 100644
--- a/common/src/main/java/envoy/event/ElementOperation.java
+++ b/common/src/main/java/envoy/event/ElementOperation.java
@@ -1,13 +1,10 @@
package envoy.event;
/**
- * This enum declares all modification possibilities for a given container.
+ * This enum declares all modification possibilities for a given container.
+ *
- *
- * Project: envoy-common
- * File: ElementOperation.java
- * Created: 25 Mar 2020
+ * {@link ElementOperation#REMOVE}.
*
* @author Leon Hofmeister
* @since Envoy Common v0.1-beta
diff --git a/common/src/main/java/envoy/event/Event.java b/common/src/main/java/envoy/event/Event.java
index 33ccc24..da3bc72 100644
--- a/common/src/main/java/envoy/event/Event.java
+++ b/common/src/main/java/envoy/event/Event.java
@@ -8,10 +8,6 @@ import dev.kske.eventbus.IEvent;
* This class serves as a convenience base class for all events. It implements
* the {@link IEvent} interface and provides a generic value. For events without
* a value there also is {@link envoy.event.Event.Valueless}.
- *
- * File: Event.java
- * Created: 04.12.2019
*
* @author Kai S. K. Engelbart
* @param
- *
- * Project: envoy-common
- * File: Event.java
- * Created: 11 Feb 2020
+ * Serves as a super class for events that do not carry a value.
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/event/GroupCreation.java b/common/src/main/java/envoy/event/GroupCreation.java
index e7a8a2c..02270ee 100644
--- a/common/src/main/java/envoy/event/GroupCreation.java
+++ b/common/src/main/java/envoy/event/GroupCreation.java
@@ -1,16 +1,11 @@
package envoy.event;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
import envoy.data.User;
/**
- * This event creates a group with the given name.
- *
- * Project: envoy-common
- * File: GroupCreation.java
- * Created: 25 Mar 2020
+ * This event creates a group with the given name.
*
* @author Leon Hofmeister
* @since Envoy Common v0.1-beta
@@ -30,7 +25,7 @@ public final class GroupCreation extends Event
- * File: GroupCreationResult.java
- * Created: 22.08.2020
*
* @author Leon Hofmeister
* @since Envoy Common v0.2-beta
diff --git a/common/src/main/java/envoy/event/GroupMessageStatusChange.java b/common/src/main/java/envoy/event/GroupMessageStatusChange.java
index 50f6ae3..30d286e 100644
--- a/common/src/main/java/envoy/event/GroupMessageStatusChange.java
+++ b/common/src/main/java/envoy/event/GroupMessageStatusChange.java
@@ -6,10 +6,6 @@ import envoy.data.GroupMessage;
import envoy.data.Message.MessageStatus;
/**
- * Project: envoy-common
- * File: GroupMessageStatusChange.java
- * Created: 18.04.2020
- *
* @author Maximilian Käfer
* @since Envoy Common v0.1-beta
*/
diff --git a/common/src/main/java/envoy/event/GroupResize.java b/common/src/main/java/envoy/event/GroupResize.java
index 6aec843..c8e8c76 100644
--- a/common/src/main/java/envoy/event/GroupResize.java
+++ b/common/src/main/java/envoy/event/GroupResize.java
@@ -1,18 +1,15 @@
package envoy.event;
-import envoy.data.Contact;
-import envoy.data.Group;
-import envoy.data.User;
+import static envoy.event.ElementOperation.*;
+
+import envoy.data.*;
/**
* This event is used to communicate changes in the group size between client
- * and server.
+ * and server.
+ *
- * Project: envoy-common
- * File: GroupResize.java
- * Created: 25 Mar 2020
*
* @author Leon Hofmeister
* @since Envoy Common v0.1-beta
@@ -36,13 +33,13 @@ public final class GroupResize extends Event
- * File: HandshakeRejection.java
- * Created: 28 Jan 2020
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.3-alpha
diff --git a/common/src/main/java/envoy/event/IDGeneratorRequest.java b/common/src/main/java/envoy/event/IDGeneratorRequest.java
index 70b49bd..09e8265 100644
--- a/common/src/main/java/envoy/event/IDGeneratorRequest.java
+++ b/common/src/main/java/envoy/event/IDGeneratorRequest.java
@@ -2,11 +2,7 @@ package envoy.event;
/**
* Signifies to the server that the client needs a new
- * {@link envoy.data.IDGenerator} instance.
- *
- * Project: envoy-common
- * File: IDGeneratorRequest.java
- * Created: 28 Jan 2020
+ * {@link envoy.data.IDGenerator} instance.
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.3-alpha
diff --git a/common/src/main/java/envoy/event/IsTyping.java b/common/src/main/java/envoy/event/IsTyping.java
index bb2d2c3..0b6f544 100644
--- a/common/src/main/java/envoy/event/IsTyping.java
+++ b/common/src/main/java/envoy/event/IsTyping.java
@@ -3,10 +3,6 @@ package envoy.event;
/**
* This event should be sent when a user is currently typing something in a
* chat.
- *
- * File: IsTyping.java
- * Created: 24.07.2020
*
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
@@ -18,7 +14,8 @@ public final class IsTyping extends Event
+ * The number of milliseconds that this event will be active.
+ *
- * File: IssueProposal.java
- * Created: 05.08.2020
+ * not disabled by its administrator, will forward it directly to Gitea.
*
* @author Leon Hofmeister
* @since Envoy Common v0.2-beta
diff --git a/common/src/main/java/envoy/event/MessageStatusChange.java b/common/src/main/java/envoy/event/MessageStatusChange.java
index aa94e6d..33e2cb3 100644
--- a/common/src/main/java/envoy/event/MessageStatusChange.java
+++ b/common/src/main/java/envoy/event/MessageStatusChange.java
@@ -5,10 +5,6 @@ import java.time.Instant;
import envoy.data.Message;
/**
- * Project: envoy-common
- * File: MessageStatusChange.java
- * Created: 6 Jan 2020
- *
* @author Kai S. K. Engelbart
* @since Envoy Common v0.2-alpha
*/
diff --git a/common/src/main/java/envoy/event/NameChange.java b/common/src/main/java/envoy/event/NameChange.java
index b4558a7..368f4bc 100644
--- a/common/src/main/java/envoy/event/NameChange.java
+++ b/common/src/main/java/envoy/event/NameChange.java
@@ -3,14 +3,11 @@ package envoy.event;
import envoy.data.Contact;
/**
- * This event informs
+ * This event informs
+ *
- * File: NameChange.java
- * Created: 25 Mar 2020
- *
* @author Leon Hofmeister
* @since Envoy Common v0.1-beta
*/
diff --git a/common/src/main/java/envoy/event/NewAuthToken.java b/common/src/main/java/envoy/event/NewAuthToken.java
index 81af7b6..82dccca 100644
--- a/common/src/main/java/envoy/event/NewAuthToken.java
+++ b/common/src/main/java/envoy/event/NewAuthToken.java
@@ -2,10 +2,6 @@ package envoy.event;
/**
* This event can be used to transmit a new authentication token to a client.
- *
- * File: NewAuthToken.java
- * Created: 19.09.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.2-beta
diff --git a/common/src/main/java/envoy/event/NoAttachments.java b/common/src/main/java/envoy/event/NoAttachments.java
index aace460..3622569 100644
--- a/common/src/main/java/envoy/event/NoAttachments.java
+++ b/common/src/main/java/envoy/event/NoAttachments.java
@@ -3,10 +3,6 @@ package envoy.event;
/**
* This event is used so that the server can tell the client that attachments
* will be filtered out.
- *
- * File: NoAttachments.java
- * Created: 22.08.2020
*
* @author Leon Hofmeister
* @since Envoy Common v0.2-beta
diff --git a/common/src/main/java/envoy/event/PasswordChangeRequest.java b/common/src/main/java/envoy/event/PasswordChangeRequest.java
index 0556e25..59ec8fb 100644
--- a/common/src/main/java/envoy/event/PasswordChangeRequest.java
+++ b/common/src/main/java/envoy/event/PasswordChangeRequest.java
@@ -3,10 +3,6 @@ package envoy.event;
import envoy.data.Contact;
/**
- * Project: envoy-common
- * File: PasswordChangeRequest.java
- * Created: 31.07.2020
- *
* @author Leon Hofmeister
* @since Envoy Common v0.2-beta
*/
diff --git a/common/src/main/java/envoy/event/PasswordChangeResult.java b/common/src/main/java/envoy/event/PasswordChangeResult.java
index 363e416..716404c 100644
--- a/common/src/main/java/envoy/event/PasswordChangeResult.java
+++ b/common/src/main/java/envoy/event/PasswordChangeResult.java
@@ -3,10 +3,6 @@ package envoy.event;
/**
* This class acts as a notice to the user whether his
* {@link envoy.event.PasswordChangeRequest} was successful.
- *
- * File: PasswordChangeResult.java
- * Created: 01.08.2020
*
* @author Leon Hofmeister
* @since Envoy Common v0.2-beta
diff --git a/common/src/main/java/envoy/event/ProfilePicChange.java b/common/src/main/java/envoy/event/ProfilePicChange.java
index ceb2eff..3400dc4 100644
--- a/common/src/main/java/envoy/event/ProfilePicChange.java
+++ b/common/src/main/java/envoy/event/ProfilePicChange.java
@@ -1,10 +1,6 @@
package envoy.event;
/**
- * Project: envoy-common
- * File: ProfilePicChange.java
- * Created: 31.07.2020
- *
* @author Leon Hofmeister
* @since Envoy Common v0.2-beta
*/
diff --git a/common/src/main/java/envoy/event/UserStatusChange.java b/common/src/main/java/envoy/event/UserStatusChange.java
index e8c1f94..5a26f50 100644
--- a/common/src/main/java/envoy/event/UserStatusChange.java
+++ b/common/src/main/java/envoy/event/UserStatusChange.java
@@ -4,10 +4,6 @@ import envoy.data.User;
import envoy.data.User.UserStatus;
/**
- * Project: envoy-common
- * File: UserStatusChange.java
- * Created: 1 Feb 2020
- *
* @author Leon Hofmeister
* @since Envoy Common v0.2-alpha
*/
diff --git a/common/src/main/java/envoy/event/contact/ContactOperation.java b/common/src/main/java/envoy/event/contact/ContactOperation.java
index 48427d5..a31d147 100644
--- a/common/src/main/java/envoy/event/contact/ContactOperation.java
+++ b/common/src/main/java/envoy/event/contact/ContactOperation.java
@@ -1,15 +1,10 @@
package envoy.event.contact;
import envoy.data.Contact;
-import envoy.event.ElementOperation;
-import envoy.event.Event;
+import envoy.event.*;
/**
- * Signifies the modification of a contact list.
- *
- * Project: envoy-common
- * File: ContactOperation.java
- * Created: 05.02.2020
+ * Signifies the modification of a contact list.
*
* @author Maximilian Käfer
* @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/event/contact/UserSearchRequest.java b/common/src/main/java/envoy/event/contact/UserSearchRequest.java
index f615f0c..6eb1925 100644
--- a/common/src/main/java/envoy/event/contact/UserSearchRequest.java
+++ b/common/src/main/java/envoy/event/contact/UserSearchRequest.java
@@ -4,10 +4,6 @@ import envoy.event.Event;
/**
* Requests a user search from the server.
- *
- * File: UserSearchRequest.java
- * Created: 05.02.2020
*
* @author Maximilian Käfer
* @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/event/contact/UserSearchResult.java b/common/src/main/java/envoy/event/contact/UserSearchResult.java
index 86b4c09..6b1358b 100644
--- a/common/src/main/java/envoy/event/contact/UserSearchResult.java
+++ b/common/src/main/java/envoy/event/contact/UserSearchResult.java
@@ -7,10 +7,6 @@ import envoy.event.Event;
/**
* Contains a list of users for which a search has been requested.
- *
- * File: UserSearchResult.java
- * Created: 11 Feb 2020
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/event/contact/package-info.java b/common/src/main/java/envoy/event/contact/package-info.java
index 375ea89..e1abec1 100644
--- a/common/src/main/java/envoy/event/contact/package-info.java
+++ b/common/src/main/java/envoy/event/contact/package-info.java
@@ -1,9 +1,5 @@
/**
- * This package contains all contact-related events.
- *
- * Project: envoy-common
- * File: package-info.java
- * Created: 28 Mar 2020
+ * This package contains all contact-related events.
*
* @author Leon Hofmeister
* @author Maximilian Käfer
diff --git a/common/src/main/java/envoy/exception/EnvoyException.java b/common/src/main/java/envoy/exception/EnvoyException.java
index 0c02a52..a09b460 100644
--- a/common/src/main/java/envoy/exception/EnvoyException.java
+++ b/common/src/main/java/envoy/exception/EnvoyException.java
@@ -1,10 +1,6 @@
package envoy.exception;
/**
- * Project: envoy-common
- * File: EnvoyException.java
- * Created: 27 Oct 2019
- *
* @author Kai S. K. Engelbart
* @since Envoy v0.1-alpha
*/
diff --git a/common/src/main/java/envoy/util/Bounds.java b/common/src/main/java/envoy/util/Bounds.java
index c5575e0..8f8f381 100644
--- a/common/src/main/java/envoy/util/Bounds.java
+++ b/common/src/main/java/envoy/util/Bounds.java
@@ -4,10 +4,6 @@ import java.util.regex.Pattern;
/**
* Implements contact name validation.
- *
- * File: Bounds.java
- * Created: 25.06.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.1-beta
diff --git a/common/src/main/java/envoy/util/EnvoyLog.java b/common/src/main/java/envoy/util/EnvoyLog.java
index e28189e..55f3a42 100644
--- a/common/src/main/java/envoy/util/EnvoyLog.java
+++ b/common/src/main/java/envoy/util/EnvoyLog.java
@@ -1,7 +1,6 @@
package envoy.util;
-import java.io.File;
-import java.io.IOException;
+import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.logging.*;
@@ -11,10 +10,6 @@ import envoy.data.Config;
/**
* Configures the {@link java.util.logging} API to output the log into the
* console and a log file.
- *
- * File: EnvoyLogger.java
- * Created: 14.12.2019
*
* @author Leon Hofmeister
* @author Kai S. K. Engelbart
diff --git a/common/src/main/java/envoy/util/SerializationUtils.java b/common/src/main/java/envoy/util/SerializationUtils.java
index 54fca82..f556657 100644
--- a/common/src/main/java/envoy/util/SerializationUtils.java
+++ b/common/src/main/java/envoy/util/SerializationUtils.java
@@ -4,10 +4,6 @@ import java.io.*;
/**
* Defines utility methods related to serialization.
- *
- * File: SerializationUtils.java
- * Created: 23.12.2019
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.2-alpha
@@ -34,8 +30,8 @@ public final class SerializationUtils {
* @since Envoy Common v0.2-alpha
*/
public static int bytesToInt(byte[] bytes, int offset) {
- return ((bytes[offset] & 0xFF) << 24) | ((bytes[offset + 1] & 0xFF) << 16) | ((bytes[offset + 2] & 0xFF) << 8)
- | ((bytes[offset + 3] & 0xFF) << 0);
+ return (bytes[offset] & 0xFF) << 24 | (bytes[offset + 1] & 0xFF) << 16 | (bytes[offset + 2] & 0xFF) << 8
+ | (bytes[offset + 3] & 0xFF) << 0;
}
/**
diff --git a/server/src/main/java/envoy/server/Startup.java b/server/src/main/java/envoy/server/Startup.java
index 4f3f0d1..6beafee 100755
--- a/server/src/main/java/envoy/server/Startup.java
+++ b/server/src/main/java/envoy/server/Startup.java
@@ -6,20 +6,13 @@ import java.util.logging.Level;
import com.jenkov.nioserver.Server;
-import envoy.server.data.PersistenceManager;
-import envoy.server.data.ServerConfig;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectMessageProcessor;
-import envoy.server.net.ObjectMessageReader;
+import envoy.server.data.*;
+import envoy.server.net.*;
import envoy.server.processors.*;
import envoy.util.EnvoyLog;
/**
- * Starts the server.
- *
- * Project: envoy-server-standalone
- * File: Startup.java
- * Created: 24.12.2019
+ * Starts the server.
*
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/data/ConfigItem.java b/server/src/main/java/envoy/server/data/ConfigItem.java
index ba8a2fe..ba3fff5 100755
--- a/server/src/main/java/envoy/server/data/ConfigItem.java
+++ b/server/src/main/java/envoy/server/data/ConfigItem.java
@@ -1,14 +1,8 @@
package envoy.server.data;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
/**
- * Project: envoy-server-standalone
- * File: ConfigItem.java
- * Created: 28 Jan 2020
- *
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-alpha
*/
diff --git a/server/src/main/java/envoy/server/data/Contact.java b/server/src/main/java/envoy/server/data/Contact.java
index a1e626d..36a302f 100644
--- a/server/src/main/java/envoy/server/data/Contact.java
+++ b/server/src/main/java/envoy/server/data/Contact.java
@@ -7,11 +7,7 @@ import javax.persistence.*;
/**
* This class acts as a superclass for all contacts, being {@link User}s and
- * {@link Group}s.
- *
- * Project: envoy-server-standalone
- * File: Contact.java
- * Created: 24.03.2020
+ * {@link Group}s.
*
* @author Maximilian Käfer
* @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/data/Group.java b/server/src/main/java/envoy/server/data/Group.java
index 232c13e..f0ccb50 100644
--- a/server/src/main/java/envoy/server/data/Group.java
+++ b/server/src/main/java/envoy/server/data/Group.java
@@ -2,17 +2,11 @@ package envoy.server.data;
import java.util.stream.Collectors;
-import javax.persistence.Entity;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
+import javax.persistence.*;
/**
* Represents a group inside the database. Referred to as "server group" as
- * opposed to "group" from Envoy Common.
- *
- * Project: envoy-server-standalone
- * File: Group.java
- * Created: 24.03.2020
+ * opposed to "group" from Envoy Common.
*
* @author Maximilian Käfer
* @since Envoy Server Standalone v0.1-alpha
@@ -32,14 +26,14 @@ public final class Group extends Contact {
/**
* Named query retrieving a group by name (parameter {@code :name}).
- *
+ *
* @since Envoy Server Standalone v0.1-beta
*/
public static final String findByName = "Group.findByName";
-
+
/**
* Named query retrieving all pending groups for a specific user (parameter {@code :user}, {@code :lastSeen}).
- *
+ *
* @since Envoy Server Standalone v0.1-beta
*/
public static final String findPendingGroups = "Group.findPendingGroups";
diff --git a/server/src/main/java/envoy/server/data/GroupMessage.java b/server/src/main/java/envoy/server/data/GroupMessage.java
index 0bcd4e3..444a935 100644
--- a/server/src/main/java/envoy/server/data/GroupMessage.java
+++ b/server/src/main/java/envoy/server/data/GroupMessage.java
@@ -1,18 +1,13 @@
package envoy.server.data;
import java.time.Instant;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
import javax.persistence.*;
import envoy.data.Group;
/**
- * Project: envoy-server-standalone
- * File: GroupMessage.java
- * Created: 18.04.2020
- *
* @author Maximilian Käfer
* @since Envoy Server Standalone v0.1-beta
*/
diff --git a/server/src/main/java/envoy/server/data/Message.java b/server/src/main/java/envoy/server/data/Message.java
index 2468fe6..bd5f006 100755
--- a/server/src/main/java/envoy/server/data/Message.java
+++ b/server/src/main/java/envoy/server/data/Message.java
@@ -7,10 +7,9 @@ import java.time.Instant;
import javax.persistence.*;
-import envoy.data.Attachment;
+import envoy.data.*;
import envoy.data.Attachment.AttachmentType;
import envoy.data.Message.MessageStatus;
-import envoy.data.MessageBuilder;
/**
* This JPA entity, which will be referred to as database message, stores the
@@ -21,10 +20,6 @@ import envoy.data.MessageBuilder;
* {@link Message#Message(envoy.data.Message)} constructor. A database message
* can be converted to a regular message using the {@link Message#toCommon()}
* method. In both cases, the objects will not contain references to each other.
- *
- * File: Message.java
- * Created: 02.01.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/data/PersistenceManager.java b/server/src/main/java/envoy/server/data/PersistenceManager.java
index fbadbb9..f601fe5 100755
--- a/server/src/main/java/envoy/server/data/PersistenceManager.java
+++ b/server/src/main/java/envoy/server/data/PersistenceManager.java
@@ -9,10 +9,6 @@ import envoy.data.User.UserStatus;
import envoy.server.net.ConnectionManager;
/**
- * Project: envoy-server-standalone
- * File: PersistenceManager.java
- * Created: 1 Jan 2020
- *
* @author Leon Hofmeister
* @author Maximilian Käfer
* @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/data/ServerConfig.java b/server/src/main/java/envoy/server/data/ServerConfig.java
index b16733d..96f4d01 100644
--- a/server/src/main/java/envoy/server/data/ServerConfig.java
+++ b/server/src/main/java/envoy/server/data/ServerConfig.java
@@ -5,10 +5,6 @@ import static java.util.function.Function.identity;
import envoy.data.Config;
/**
- * Project: server
- * File: ServerConfig.java
- * Created: 21.08.2020
- *
* @author Leon Hofmeister
* @since Envoy Server v0.2-beta
*/
diff --git a/server/src/main/java/envoy/server/data/User.java b/server/src/main/java/envoy/server/data/User.java
index 341ebd4..e4c0829 100755
--- a/server/src/main/java/envoy/server/data/User.java
+++ b/server/src/main/java/envoy/server/data/User.java
@@ -11,11 +11,7 @@ import envoy.data.User.UserStatus;
/**
* This class enables the storage of user specific data inside a database using
* Hibernate. Its objects will be referred to as database users as opposed to
- * the common user objects present on both the client and the server.
- *
- * Project: envoy-server-standalone
- * File: User.java
- * Created: 02.01.2020
+ * the common user objects present on both the client and the server.
*
* @author Kai S. K. Engelbart
* @author Maximilian Käfer
diff --git a/server/src/main/java/envoy/server/net/ConnectionManager.java b/server/src/main/java/envoy/server/net/ConnectionManager.java
index a43b357..2dc7d2d 100755
--- a/server/src/main/java/envoy/server/net/ConnectionManager.java
+++ b/server/src/main/java/envoy/server/net/ConnectionManager.java
@@ -7,15 +7,10 @@ import java.util.stream.Collectors;
import com.jenkov.nioserver.ISocketIdListener;
import envoy.data.User.UserStatus;
-import envoy.server.data.Group;
-import envoy.server.data.PersistenceManager;
+import envoy.server.data.*;
import envoy.server.processors.UserStatusChangeProcessor;
/**
- * Project: envoy-server-standalone
- * File: ConnectionManager.java
- * Created: 03.01.2020
- *
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-alpha
*/
@@ -110,6 +105,6 @@ public final class ConnectionManager implements ISocketIdListener {
* @since Envoy Server Standalone v0.1-beta
*/
public Set
- *
- * Project: envoy-server-standalone
- * File: ObjectMessageProcessor.java
- * Created: 28.12.2019
+ * Handles incoming objects.
*
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-alpha
@@ -55,14 +46,13 @@ public final class ObjectMessageProcessor implements IMessageProcessor {
for (@SuppressWarnings("rawtypes")
ObjectProcessor p : processors) {
Class> c = (Class>) ((ParameterizedType) p.getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0];
- if (c.equals(obj.getClass())) {
+ if (c.equals(obj.getClass()))
try {
p.process(c.cast(obj), message.socketId, new ObjectWriteProxy(writeProxy));
break;
} catch (IOException e) {
logger.log(Level.SEVERE, "Exception during processor execution: ", e);
}
- }
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
diff --git a/server/src/main/java/envoy/server/net/ObjectMessageReader.java b/server/src/main/java/envoy/server/net/ObjectMessageReader.java
index ddd2dca..a86c589 100755
--- a/server/src/main/java/envoy/server/net/ObjectMessageReader.java
+++ b/server/src/main/java/envoy/server/net/ObjectMessageReader.java
@@ -2,19 +2,14 @@ package envoy.server.net;
import java.io.IOException;
import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
import com.jenkov.nioserver.*;
import envoy.util.SerializationUtils;
/**
- * This {@link IMessageReader} decodes serialized Java objects.
- *
- * Project: envoy-server-standalone
- * File: ObjectMessageReader.java
- * Created: 28.12.2019
+ * This {@link IMessageReader} decodes serialized Java objects.
*
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/net/ObjectWriteProxy.java b/server/src/main/java/envoy/server/net/ObjectWriteProxy.java
index 4e8229e..53f12fc 100755
--- a/server/src/main/java/envoy/server/net/ObjectWriteProxy.java
+++ b/server/src/main/java/envoy/server/net/ObjectWriteProxy.java
@@ -5,19 +5,13 @@ import java.util.Set;
import java.util.logging.Logger;
import java.util.stream.Stream;
-import com.jenkov.nioserver.Message;
-import com.jenkov.nioserver.WriteProxy;
+import com.jenkov.nioserver.*;
import envoy.server.data.Contact;
-import envoy.util.EnvoyLog;
-import envoy.util.SerializationUtils;
+import envoy.util.*;
/**
- * This class defines methods to send an object to a client.
- *
- * Project: envoy-server-standalone
- * File: ObjectWriteProxy.java
- * Created: 04.01.2020
+ * This class defines methods to send an object to a client.
*
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-alpha
@@ -67,8 +61,8 @@ public final class ObjectWriteProxy {
}
/**
- * Sends an object to all contact in a set that are online.
- *
+ * Sends an object to all contacts in a set that are online.
+ *
* @param contacts the contacts to send the object to
* @param message the object to send
* @since Envoy Server Standalone v0.1-beta
@@ -76,8 +70,8 @@ public final class ObjectWriteProxy {
public void writeToOnlineContacts(Set extends Contact> contacts, Object message) { writeToOnlineContacts(contacts.stream(), message); }
/**
- * Sends an object to all contact in a set that are online.
- *
+ * Sends an object to all contacts in a set that are online.
+ *
* @param contacts the contacts to send the object to
* @param message the object to send
* @since Envoy Server Standalone v0.1-beta
diff --git a/server/src/main/java/envoy/server/processors/ContactOperationProcessor.java b/server/src/main/java/envoy/server/processors/ContactOperationProcessor.java
index ba4f240..178bff4 100755
--- a/server/src/main/java/envoy/server/processors/ContactOperationProcessor.java
+++ b/server/src/main/java/envoy/server/processors/ContactOperationProcessor.java
@@ -5,15 +5,10 @@ import java.util.logging.Logger;
import envoy.event.ElementOperation;
import envoy.event.contact.ContactOperation;
import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.net.*;
import envoy.util.EnvoyLog;
/**
- * Project: envoy-server-standalone
- * File: ContactOperationProcessor.java
- * Created: 08.02.2020
- *
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-alpha
*/
diff --git a/server/src/main/java/envoy/server/processors/GroupCreationProcessor.java b/server/src/main/java/envoy/server/processors/GroupCreationProcessor.java
index 2839aeb..8f40af2 100644
--- a/server/src/main/java/envoy/server/processors/GroupCreationProcessor.java
+++ b/server/src/main/java/envoy/server/processors/GroupCreationProcessor.java
@@ -4,20 +4,12 @@ import static envoy.server.Startup.config;
import java.util.HashSet;
-import envoy.event.ElementOperation;
-import envoy.event.GroupCreation;
-import envoy.event.GroupCreationResult;
+import envoy.event.*;
import envoy.event.contact.ContactOperation;
-import envoy.server.data.Contact;
-import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.data.*;
+import envoy.server.net.*;
/**
- * Project: envoy-server-standalone
- * File: GroupCreationProcessor.java
- * Created: 26.03.2020
- *
* @author Maximilian Käfer
* @since Envoy Server Standalone v0.1-beta
*/
diff --git a/server/src/main/java/envoy/server/processors/GroupMessageProcessor.java b/server/src/main/java/envoy/server/processors/GroupMessageProcessor.java
index 4cb7c2c..77ab232 100644
--- a/server/src/main/java/envoy/server/processors/GroupMessageProcessor.java
+++ b/server/src/main/java/envoy/server/processors/GroupMessageProcessor.java
@@ -10,18 +10,12 @@ import java.util.logging.Logger;
import javax.persistence.EntityExistsException;
import envoy.data.GroupMessage;
-import envoy.event.MessageStatusChange;
-import envoy.event.NoAttachments;
+import envoy.event.*;
import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.net.*;
import envoy.util.EnvoyLog;
/**
- * Project: envoy-server-standalone
- * File: GroupMessageProcessor.java
- * Created: 18.04.2020
- *
* @author Maximilian Käfer
* @since Envoy Server Standalone v0.1-beta
*/
diff --git a/server/src/main/java/envoy/server/processors/GroupMessageStatusChangeProcessor.java b/server/src/main/java/envoy/server/processors/GroupMessageStatusChangeProcessor.java
index 515639b..2604698 100644
--- a/server/src/main/java/envoy/server/processors/GroupMessageStatusChangeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/GroupMessageStatusChangeProcessor.java
@@ -4,23 +4,15 @@ import static envoy.data.Message.MessageStatus.READ;
import java.time.Instant;
import java.util.Collections;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.logging.*;
import envoy.data.Message.MessageStatus;
-import envoy.event.GroupMessageStatusChange;
-import envoy.event.MessageStatusChange;
-import envoy.server.data.GroupMessage;
-import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.event.*;
+import envoy.server.data.*;
+import envoy.server.net.*;
import envoy.util.EnvoyLog;
/**
- * Project: envoy-server-standalone
- * File: GroupMessageStatusChangeProcessor.java
- * Created: 03.07.2020
- *
* @author Maximilian Käfer
* @since Envoy Server Standalone v0.1-beta
*/
diff --git a/server/src/main/java/envoy/server/processors/GroupResizeProcessor.java b/server/src/main/java/envoy/server/processors/GroupResizeProcessor.java
index 86ec875..0a5b697 100644
--- a/server/src/main/java/envoy/server/processors/GroupResizeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/GroupResizeProcessor.java
@@ -1,16 +1,10 @@
package envoy.server.processors;
import envoy.event.GroupResize;
-import envoy.server.data.Contact;
-import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.data.*;
+import envoy.server.net.*;
/**
- * Project: envoy-server-standalone
- * File: GroupResizeProcessor.java
- * Created: 03.04.2020
- *
* @author Maximilian Käfer
* @since Envoy Server Standalone v0.1-beta
*/
diff --git a/server/src/main/java/envoy/server/processors/IDGeneratorRequestProcessor.java b/server/src/main/java/envoy/server/processors/IDGeneratorRequestProcessor.java
index edd6e7b..0cf9823 100755
--- a/server/src/main/java/envoy/server/processors/IDGeneratorRequestProcessor.java
+++ b/server/src/main/java/envoy/server/processors/IDGeneratorRequestProcessor.java
@@ -4,15 +4,10 @@ import java.io.IOException;
import envoy.data.IDGenerator;
import envoy.event.IDGeneratorRequest;
-import envoy.server.data.ConfigItem;
-import envoy.server.data.PersistenceManager;
+import envoy.server.data.*;
import envoy.server.net.ObjectWriteProxy;
/**
- * Project: envoy-server-standalone
- * File: IDGeneratorRequestProcessor.java
- * Created: 28 Jan 2020
- *
* @author Kai S. K. Engelbart
* @author Maximilian Käfer
* @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/processors/IsTypingProcessor.java b/server/src/main/java/envoy/server/processors/IsTypingProcessor.java
index a147ed1..aaf2987 100644
--- a/server/src/main/java/envoy/server/processors/IsTypingProcessor.java
+++ b/server/src/main/java/envoy/server/processors/IsTypingProcessor.java
@@ -3,17 +3,11 @@ package envoy.server.processors;
import java.io.IOException;
import envoy.event.IsTyping;
-import envoy.server.data.PersistenceManager;
-import envoy.server.data.User;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.data.*;
+import envoy.server.net.*;
/**
* This processor handles incoming {@link IsTyping} events.
- *
- * File: IsTypingProcessor.java
- * Created: 24.07.2020
*
* @author Leon Hofmeister
* @since Envoy Server v0.2-beta
diff --git a/server/src/main/java/envoy/server/processors/IssueProposalProcessor.java b/server/src/main/java/envoy/server/processors/IssueProposalProcessor.java
index 78feb21..aa00ff1 100644
--- a/server/src/main/java/envoy/server/processors/IssueProposalProcessor.java
+++ b/server/src/main/java/envoy/server/processors/IssueProposalProcessor.java
@@ -3,10 +3,8 @@ package envoy.server.processors;
import static envoy.server.Startup.config;
import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.net.*;
+import java.util.logging.*;
import envoy.event.IssueProposal;
import envoy.server.net.ObjectWriteProxy;
@@ -15,10 +13,6 @@ import envoy.util.EnvoyLog;
/**
* This processor handles incoming {@link IssueProposal}s and automatically
* creates a new issue on the gitea site, if not disabled by its administrator.
- *
- * File: IssueProposalProcessor.java
- * Created: 05.08.2020
*
* @author Leon Hofmeister
* @since Envoy Server v0.2-beta
diff --git a/server/src/main/java/envoy/server/processors/LoginCredentialProcessor.java b/server/src/main/java/envoy/server/processors/LoginCredentialProcessor.java
index 4412828..fdd83bf 100755
--- a/server/src/main/java/envoy/server/processors/LoginCredentialProcessor.java
+++ b/server/src/main/java/envoy/server/processors/LoginCredentialProcessor.java
@@ -19,11 +19,7 @@ import envoy.server.util.*;
import envoy.util.*;
/**
- * This {@link ObjectProcessor} handles {@link LoginCredentials}.
- *
- * Project: envoy-server-standalone
- * File: LoginCredentialProcessor.java
- * Created: 30.12.2019
+ * This {@link ObjectProcessor} handles {@link LoginCredentials}.
*
* @author Kai S. K. Engelbart
* @author Maximilian Käfer
diff --git a/server/src/main/java/envoy/server/processors/MessageProcessor.java b/server/src/main/java/envoy/server/processors/MessageProcessor.java
index 5b03007..e7605d6 100755
--- a/server/src/main/java/envoy/server/processors/MessageProcessor.java
+++ b/server/src/main/java/envoy/server/processors/MessageProcessor.java
@@ -2,25 +2,18 @@ package envoy.server.processors;
import static envoy.server.Startup.config;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.logging.*;
import javax.persistence.EntityExistsException;
import envoy.data.Message;
-import envoy.event.MessageStatusChange;
-import envoy.event.NoAttachments;
+import envoy.event.*;
import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.net.*;
import envoy.util.EnvoyLog;
/**
* This {@link ObjectProcessor} handles incoming {@link Message}s.
- *
- * File: MessageProcessor.java
- * Created: 30.12.2019
*
* @author Kai S. K. Engelbart
* @author Maximilian Käfer
diff --git a/server/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java b/server/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java
index 950f0c2..83f08fe 100755
--- a/server/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java
@@ -1,21 +1,15 @@
package envoy.server.processors;
import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.logging.*;
import envoy.data.Message.MessageStatus;
import envoy.event.MessageStatusChange;
import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.net.*;
import envoy.util.EnvoyLog;
/**
- * Project: envoy-server-standalone
- * File: MessageStatusChangeProcessor.java
- * Created: 10 Jan 2020
- *
* @author Leon Hofmeister
* @since Envoy Server Standalone v0.1-alpha
*/
diff --git a/server/src/main/java/envoy/server/processors/NameChangeProcessor.java b/server/src/main/java/envoy/server/processors/NameChangeProcessor.java
index aa6897f..7914c37 100644
--- a/server/src/main/java/envoy/server/processors/NameChangeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/NameChangeProcessor.java
@@ -3,15 +3,10 @@ package envoy.server.processors;
import java.io.IOException;
import envoy.event.NameChange;
-import envoy.server.data.Contact;
-import envoy.server.data.PersistenceManager;
+import envoy.server.data.*;
import envoy.server.net.ObjectWriteProxy;
/**
- * Project: envoy-server-standalone
- * File: NameChangeProcessor.java
- * Created: 26 Mar 2020
- *
* @author Leon Hofmeister
* @since Envoy Server Standalone v0.1-beta
*/
diff --git a/server/src/main/java/envoy/server/processors/ObjectProcessor.java b/server/src/main/java/envoy/server/processors/ObjectProcessor.java
index ab6666e..cebd1f2 100755
--- a/server/src/main/java/envoy/server/processors/ObjectProcessor.java
+++ b/server/src/main/java/envoy/server/processors/ObjectProcessor.java
@@ -6,11 +6,7 @@ import envoy.server.net.ObjectWriteProxy;
/**
* This interface defines methods for processing objects of a specific
- * type incoming from a client.
- *
- * Project: envoy-server-standalone
- * File: ObjectProcessor.java
- * Created: 30.12.2019
+ * type incoming from a client.
*
* @author Kai S. K. Engelbart
* @param
- * File: PasswordChangeRequestProcessor.java
- * Created: 31.07.2020
- *
* @author Leon Hofmeister
* @since Envoy Server v0.2-beta
*/
diff --git a/server/src/main/java/envoy/server/processors/ProfilePicChangeProcessor.java b/server/src/main/java/envoy/server/processors/ProfilePicChangeProcessor.java
index f777ed8..112170c 100644
--- a/server/src/main/java/envoy/server/processors/ProfilePicChangeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/ProfilePicChangeProcessor.java
@@ -6,10 +6,6 @@ import envoy.event.ProfilePicChange;
import envoy.server.net.ObjectWriteProxy;
/**
- * Project: envoy-server-standalone
- * File: ProfilePicChangeProcessor.java
- * Created: 01.08.2020
- *
* @author Leon Hofmeister
* @since Envoy Server v0.2-beta
*/
diff --git a/server/src/main/java/envoy/server/processors/UserSearchProcessor.java b/server/src/main/java/envoy/server/processors/UserSearchProcessor.java
index 3504217..7166d6a 100755
--- a/server/src/main/java/envoy/server/processors/UserSearchProcessor.java
+++ b/server/src/main/java/envoy/server/processors/UserSearchProcessor.java
@@ -4,18 +4,11 @@ import java.io.IOException;
import java.util.stream.Collectors;
import envoy.data.Contact;
-import envoy.event.contact.UserSearchRequest;
-import envoy.event.contact.UserSearchResult;
-import envoy.server.data.PersistenceManager;
-import envoy.server.data.User;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.event.contact.*;
+import envoy.server.data.*;
+import envoy.server.net.*;
/**
- * Project: envoy-server-standalone
- * File: UserSearchProcessor.java
- * Created: 08.02.2020
- *
* @author Kai S. K. Engelbart
* @author Maximilian Käfer
* @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java b/server/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java
index 57a9b25..9350af0 100755
--- a/server/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java
@@ -4,17 +4,12 @@ import java.util.logging.Logger;
import envoy.data.User.UserStatus;
import envoy.event.UserStatusChange;
-import envoy.server.data.PersistenceManager;
-import envoy.server.data.User;
+import envoy.server.data.*;
import envoy.server.net.ObjectWriteProxy;
import envoy.util.EnvoyLog;
/**
* This processor handles incoming {@link UserStatusChange}.
- *
- * File: UserStatusChangeProcessor.java
- * Created: 1 Feb 2020
*
* @author Leon Hofmeister
* @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/util/AuthTokenGenerator.java b/server/src/main/java/envoy/server/util/AuthTokenGenerator.java
index b74c77a..c6fc928 100644
--- a/server/src/main/java/envoy/server/util/AuthTokenGenerator.java
+++ b/server/src/main/java/envoy/server/util/AuthTokenGenerator.java
@@ -4,10 +4,6 @@ import java.security.SecureRandom;
/**
* Provides a secure token generation algorithm.
- *
- * File: AuthTokenGenerator.java
- * Created: 19.09.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Server v0.2-beta
diff --git a/server/src/main/java/envoy/server/util/PasswordUtil.java b/server/src/main/java/envoy/server/util/PasswordUtil.java
index f3e3b3e..80ba6c1 100644
--- a/server/src/main/java/envoy/server/util/PasswordUtil.java
+++ b/server/src/main/java/envoy/server/util/PasswordUtil.java
@@ -1,9 +1,7 @@
package envoy.server.util;
import java.math.BigInteger;
-import java.security.GeneralSecurityException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
+import java.security.*;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
@@ -11,10 +9,6 @@ import javax.crypto.spec.PBEKeySpec;
/**
* Provides a password hashing and comparison mechanism using the
* {@code PBKDF2WithHmacSHA1} algorithm.
- *
- * File: PasswordUtil.java
- * Created: 10.07.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-beta
diff --git a/server/src/main/java/envoy/server/util/VersionUtil.java b/server/src/main/java/envoy/server/util/VersionUtil.java
index 2d50796..aa1d661 100644
--- a/server/src/main/java/envoy/server/util/VersionUtil.java
+++ b/server/src/main/java/envoy/server/util/VersionUtil.java
@@ -5,10 +5,6 @@ import java.util.regex.Pattern;
/**
* Implements a comparison algorithm between Envoy versions and defines minimal
* and maximal client versions compatible with this server.
- *
- * File: VersionUtil.java
- * Created: 23.06.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-beta
diff --git a/server/src/main/java/envoy/server/util/package-info.java b/server/src/main/java/envoy/server/util/package-info.java
index f052882..3cfc809 100644
--- a/server/src/main/java/envoy/server/util/package-info.java
+++ b/server/src/main/java/envoy/server/util/package-info.java
@@ -1,9 +1,5 @@
/**
* This package contains utility classes used in Envoy Server.
- *
- * File: package-info.java
- * Created: 23.06.2020
*
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-beta