diff --git a/src/main/java/envoy/client/Config.java b/src/main/java/envoy/client/Config.java
index fda0f97..19a5843 100644
--- a/src/main/java/envoy/client/Config.java
+++ b/src/main/java/envoy/client/Config.java
@@ -1,5 +1,6 @@
package envoy.client;
+import java.io.File;
import java.util.Properties;
/**
@@ -14,25 +15,28 @@ public class Config {
private String server;
private int port;
+ private File localDB;
/**
- * Defaults to the {@code server.properties} file for information.
+ * Defaults to the {@code client.properties} file for information.
*
- *
- * @param properties - The two options for internet connection server and port
- * @since Envoy 0.1
+ * @param properties a {@link Properties} object containing information about
+ * the server and port, as well as the path to the local
+ * database
+ * @since Envoy v0.1-alpha
*/
public void load(Properties properties) {
if (properties.containsKey("server")) server = properties.getProperty("server");
if (properties.containsKey("port")) port = Integer.parseInt(properties.getProperty("port"));
+ localDB = new File(properties.getProperty("localDB", ".\\localDB"));
}
/**
- * Sets the server and the port via command line properties --server/ -s and --port/ -p.
+ * Sets the server, port and localDB path via command line properties --server /
+ * -s, --port / -p and --localDB / -db.
*
- * @param args {@code --server} or {@code -s} followed by the specified URL
- * and {@code --port} or {@code -p} followed by a 4-digit Integer
- * @since Envoy 0.1
+ * @param args the command line arguments to parse
+ * @since Envoy v0.1-alpha
*/
public void load(String[] args) {
for (int i = 0; i < args.length; i++)
@@ -45,10 +49,13 @@ public class Config {
case "-p":
port = Integer.parseInt(args[++i]);
break;
+ case "--localDB":
+ case "-db":
+ localDB = new File(args[++i]);
}
}
- public boolean isInitialized() { return server != null && !server.isEmpty() && port > 0; }
+ public boolean isInitialized() { return server != null && !server.isEmpty() && port > 0 && port < 65566 && localDB != null; }
public String getServer() { return server; }
@@ -57,4 +64,8 @@ public class Config {
public int getPort() { return port; }
public void setPort(int port) { this.port = port; }
+
+ public File getLocalDB() { return localDB; }
+
+ public void setLocalDB(File localDB) { this.localDB = localDB; }
}
diff --git a/src/main/java/envoy/client/ChatSynchronizer.java b/src/main/java/envoy/client/LocalDB.java
similarity index 50%
rename from src/main/java/envoy/client/ChatSynchronizer.java
rename to src/main/java/envoy/client/LocalDB.java
index 0f7322f..5a06a02 100644
--- a/src/main/java/envoy/client/ChatSynchronizer.java
+++ b/src/main/java/envoy/client/LocalDB.java
@@ -9,38 +9,54 @@ import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
+import envoy.exception.EnvoyException;
+import envoy.schema.User;
+
/**
* Project: envoy-client
- * File: ChatSynchronizer.java
+ * File: LocalDB.java
* Created: 27.10.2019
*
* @author Kai S. K. Engelbart
* @since Envoy v0.1-alpha
*/
-public class ChatSynchronizer {
+public class LocalDB {
private File localDB;
+ private User sender;
private List chats = new ArrayList<>();
- public ChatSynchronizer(String localDBPath) {
- localDB = new File(localDBPath);
- if (localDB.exists() && !localDB.isDirectory()) loadFromLocalDB();
+ public LocalDB(User sender) { this.sender = sender; }
+
+ public void initializeDBFile(File localDBDir) throws EnvoyException {
+ if (localDBDir.exists() && !localDBDir.isDirectory())
+ throw new EnvoyException(String.format("LocalDBDir '%s' is not a directory!", localDBDir.getAbsolutePath()));
+ localDB = new File(localDBDir, sender.getID() + ".db");
+ if (localDB.exists()) loadFromLocalDB();
}
public void saveToLocalDB() {
+ try {
+ localDB.getParentFile().mkdirs();
+ localDB.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(localDB))) {
out.writeObject(chats);
- } catch(IOException ex) {
+ } catch (IOException ex) {
ex.printStackTrace();
}
}
-
+
@SuppressWarnings("unchecked")
- private void loadFromLocalDB() {
+ private void loadFromLocalDB() throws EnvoyException {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(localDB))) {
Object obj = in.readObject();
if (obj instanceof ArrayList>) chats = (ArrayList) obj;
- } catch (ClassNotFoundException | IOException e) {}
+ } catch (ClassNotFoundException | IOException e) {
+ throw new EnvoyException(e);
+ }
}
public List getChats() { return chats; }
diff --git a/src/main/java/envoy/client/ui/ChatWindow.java b/src/main/java/envoy/client/ui/ChatWindow.java
index 4f5256e..8feb3ac 100644
--- a/src/main/java/envoy/client/ui/ChatWindow.java
+++ b/src/main/java/envoy/client/ui/ChatWindow.java
@@ -24,8 +24,8 @@ import javax.swing.Timer;
import javax.swing.border.EmptyBorder;
import envoy.client.Chat;
-import envoy.client.ChatSynchronizer;
import envoy.client.Client;
+import envoy.client.LocalDB;
import envoy.schema.Message;
import envoy.schema.Messages;
import envoy.schema.User;
@@ -48,14 +48,14 @@ public class ChatWindow extends JFrame {
private JPanel contentPane = new JPanel();
private Client client;
- private ChatSynchronizer chatSynchronizer;
+ private LocalDB localDB;
private JList userList = new JList<>();
private Chat currentChat;
- public ChatWindow(Client client, ChatSynchronizer chatSynchronizer) {
+ public ChatWindow(Client client, LocalDB localDB) {
this.client = client;
- this.chatSynchronizer = chatSynchronizer;
+ this.localDB = localDB;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 800);
@@ -67,7 +67,7 @@ public class ChatWindow extends JFrame {
@Override
public void windowClosing(WindowEvent e) {
- chatSynchronizer.saveToLocalDB();
+ localDB.saveToLocalDB();
}
});
@@ -204,7 +204,7 @@ public class ChatWindow extends JFrame {
final User user = selectedUserList.getSelectedValue();
client.setRecipient(user);
- currentChat = chatSynchronizer.getChats()
+ currentChat = localDB.getChats()
.stream()
.filter(chat -> chat.getRecipient().getID() == user.getID())
.findFirst()
@@ -253,10 +253,10 @@ public class ChatWindow extends JFrame {
userListModel.addElement(user);
// Check if user exists in local DB
- if (chatSynchronizer.getChats()
+ if (localDB.getChats()
.stream()
.filter(c -> c.getRecipient().getID() == user.getID())
- .count() == 0) chatSynchronizer.getChats().add(new Chat(user));
+ .count() == 0) localDB.getChats().add(new Chat(user));
});
SwingUtilities.invokeLater(() -> userList.setModel(userListModel));
}).start();
@@ -272,11 +272,11 @@ public class ChatWindow extends JFrame {
new Timer(timeout, (evt) -> {
Messages unreadMessages = client.getUnreadMessages(client.getSender().getID());
for (int i = 0; i < unreadMessages.getMessage().size(); i++)
- for (int j = 0; j < chatSynchronizer.getChats().size(); j++)
- if (chatSynchronizer.getChats().get(j)
+ for (int j = 0; j < localDB.getChats().size(); j++)
+ if (localDB.getChats().get(j)
.getRecipient()
.getID() == unreadMessages.getMessage().get(i).getMetaData().getSender())
- chatSynchronizer.getChats().get(j).appendMessage(unreadMessages.getMessage().get(i));
+ localDB.getChats().get(j).appendMessage(unreadMessages.getMessage().get(i));
}).start();
}
}
\ No newline at end of file
diff --git a/src/main/java/envoy/client/ui/Startup.java b/src/main/java/envoy/client/ui/Startup.java
index e664aa8..d494536 100644
--- a/src/main/java/envoy/client/ui/Startup.java
+++ b/src/main/java/envoy/client/ui/Startup.java
@@ -6,9 +6,10 @@ import java.util.Properties;
import javax.swing.JOptionPane;
-import envoy.client.ChatSynchronizer;
import envoy.client.Client;
import envoy.client.Config;
+import envoy.client.LocalDB;
+import envoy.exception.EnvoyException;
/**
* Starts the Envoy client and prompts the user to enter their name.
@@ -31,7 +32,7 @@ public class Startup {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
try {
Properties configProperties = new Properties();
- configProperties.load(loader.getResourceAsStream("server.properties"));
+ configProperties.load(loader.getResourceAsStream("client.properties"));
config.load(configProperties);
} catch (IOException e) {
e.printStackTrace();
@@ -48,11 +49,21 @@ public class Startup {
System.err.println("User name is not set or empty. Exiting...");
System.exit(1);
}
- Client client = new Client(config, userName);
+ Client client = new Client(config, userName);
+ LocalDB localDB = new LocalDB(client.getSender());
+ try {
+ localDB.initializeDBFile(config.getLocalDB());
+ } catch (EnvoyException e) {
+ e.printStackTrace();
+ JOptionPane.showMessageDialog(null,
+ "Error while loading local database: " + e.toString() + "\nChats will not be stored locally.",
+ "Local DB error",
+ JOptionPane.WARNING_MESSAGE);
+ }
EventQueue.invokeLater(() -> {
try {
- ChatWindow frame = new ChatWindow(client, new ChatSynchronizer("local_chats.db"));
+ ChatWindow frame = new ChatWindow(client, localDB);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
diff --git a/src/main/resources/client.properties b/src/main/resources/client.properties
new file mode 100644
index 0000000..2641927
--- /dev/null
+++ b/src/main/resources/client.properties
@@ -0,0 +1,3 @@
+server=http://kske.feste-ip.net
+port=43315
+localDB=.\\localDB
diff --git a/src/main/resources/server.properties b/src/main/resources/server.properties
deleted file mode 100644
index 6b0ae8f..0000000
--- a/src/main/resources/server.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-server=http://kske.feste-ip.net
-port=43315
\ No newline at end of file