diff --git a/pages/css/style.css b/pages/css/style.css index 3f134a7..3f825f9 100644 --- a/pages/css/style.css +++ b/pages/css/style.css @@ -34,7 +34,9 @@ body { #usercontent { margin: auto; - width: 75%; + width: -moz-calc(100% - 600px); + width: -webkit-calc(100% - 600px); + width: calc(100% - 600px); height: 100%; } diff --git a/pages/js/message.js b/pages/js/message.js index 1d4c9a4..055b3c0 100644 --- a/pages/js/message.js +++ b/pages/js/message.js @@ -18,7 +18,7 @@ var sendmsgonenter = function sendmsgonenter(e) { //TODO: Detect Enter if (textarea.value.trim().length == 0) return; textarea.disabled = true; - window.convid = 1; + window.convid = document.getElementById("convidp").innerText * 1; var json = JSON.stringify({"message": textarea.value, "conversation": window.convid}); $.ajax({ url: "/message", data: json, method: "POST", success: respfunc, error: respfunc diff --git a/src/io/github/norbipeti/chat/server/Main.java b/src/io/github/norbipeti/chat/server/Main.java index 36263db..07d5e2e 100644 --- a/src/io/github/norbipeti/chat/server/Main.java +++ b/src/io/github/norbipeti/chat/server/Main.java @@ -4,7 +4,6 @@ import java.lang.reflect.Modifier; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.Date; -import java.util.List; import java.util.Set; import org.apache.logging.log4j.Level; @@ -19,9 +18,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.sun.net.httpserver.HttpServer; -import io.github.norbipeti.chat.server.data.DataManager; -import io.github.norbipeti.chat.server.data.LoaderCollection; -import io.github.norbipeti.chat.server.data.LoaderCollectionSerializer; +import io.github.norbipeti.chat.server.data.*; import io.github.norbipeti.chat.server.db.domain.*; import io.github.norbipeti.chat.server.page.*; @@ -57,13 +54,9 @@ public class Main { conversation.getUsers().add(user); user.getConversations().add(conversation); LogManager.getLogger().debug("User: " + user); - // conversation.getUsers().add(user2); - TODO - LogManager.getLogger().debug("User2: " + user2); // TODO: Switch - // to JSON - // files? - // user2.getConversations().add(conversation); // TODO: Fix - // duplicate - // key constraint + conversation.getUsers().add(user2); + LogManager.getLogger().debug("User2: " + user2); + user2.getConversations().add(conversation); Message msg = new Message(); msg.setSender(user); msg.setTime(new Date()); diff --git a/src/io/github/norbipeti/chat/server/data/DataManager.java b/src/io/github/norbipeti/chat/server/data/DataManager.java index b51a931..44d2db6 100644 --- a/src/io/github/norbipeti/chat/server/data/DataManager.java +++ b/src/io/github/norbipeti/chat/server/data/DataManager.java @@ -5,6 +5,9 @@ import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + import com.google.common.io.Files; import io.github.norbipeti.chat.server.Main; import io.github.norbipeti.chat.server.db.domain.ChatDatabaseEntity; @@ -13,9 +16,13 @@ public final class DataManager { private DataManager() { } - public static void save(T object) throws IOException { - Files.write(Main.gson.toJson(object), new File(object.getClass().getName() + "-" + object.getId()), - StandardCharsets.UTF_8); + public static void save(T object) { + try { + Files.write(Main.gson.toJson(object), new File(object.getClass().getName() + "-" + object.getId()), + StandardCharsets.UTF_8); + } catch (IOException e) { + e.printStackTrace(); + } } public static T load(Class cl, long id) { @@ -37,16 +44,24 @@ public final class DataManager { return rets; } + private static Map cache = new HashMap<>(); + // TODO: Remove objects from the cache over time + + @SuppressWarnings("unchecked") private static T loadFromFile(File file, Class cl) { try { if (!file.exists()) return cl.newInstance(); + if (cache.containsKey(file)) + return (T) cache.get(file); BufferedReader reader = Files.newReader(file, StandardCharsets.UTF_8); String objstr = ""; String line; while ((line = reader.readLine()) != null) objstr += line; - return Main.gson.fromJson(objstr, cl); + T obj = Main.gson.fromJson(objstr, cl); + cache.put(file, obj); + return obj; } catch (Exception e) { e.printStackTrace(); } @@ -54,6 +69,12 @@ public final class DataManager { } public static boolean remove(T obj) { + if (cache.containsValue(obj)) + cache.values().remove(obj); return new File(obj.getClass().getName() + "-" + obj.getId()).delete(); } + + public static boolean remove(Class cl, Long id) { + return new File(cl.getName() + "-" + id).delete(); + } } diff --git a/src/io/github/norbipeti/chat/server/data/LoaderCollection.java b/src/io/github/norbipeti/chat/server/data/LoaderCollection.java index 8a3c8b7..e3cda8c 100644 --- a/src/io/github/norbipeti/chat/server/data/LoaderCollection.java +++ b/src/io/github/norbipeti/chat/server/data/LoaderCollection.java @@ -44,28 +44,38 @@ public class LoaderCollection implements List, @Override public boolean add(T e) { + DataManager.save(e); return idlist.add(e.getId()); } @Override public void add(int index, T element) { + DataManager.save(element); idlist.add(index, element.getId()); } @Override public boolean addAll(Collection c) { - return idlist - .addAll(c.stream().map((data) -> ((ChatDatabaseEntity) data).getId()).collect(Collectors.toList())); + return idlist.addAll(c.stream().map((data) -> { + ChatDatabaseEntity cde = ((ChatDatabaseEntity) data); + DataManager.save(cde); + return cde.getId(); + }).collect(Collectors.toList())); } @Override public boolean addAll(int index, Collection c) { - return idlist.addAll(index, - c.stream().map((data) -> ((ChatDatabaseEntity) data).getId()).collect(Collectors.toList())); + return idlist.addAll(index, c.stream().map((data) -> { + ChatDatabaseEntity cde = ((ChatDatabaseEntity) data); + DataManager.save(cde); + return cde.getId(); + }).collect(Collectors.toList())); } @Override public void clear() { + for (Long id : idlist) + DataManager.remove(cl, id); //TODO: Move out to a main list idlist.clear(); } @@ -117,8 +127,12 @@ public class LoaderCollection implements List, */ @Override public boolean remove(Object o) { - if (ChatDatabaseEntity.class.isAssignableFrom(o.getClass())) + if (ChatDatabaseEntity.class.isAssignableFrom(o.getClass())) { + DataManager.remove((ChatDatabaseEntity) o); return idlist.remove(((ChatDatabaseEntity) o).getId()); + } + if (Long.class.isAssignableFrom(o.getClass())) + DataManager.remove(cl, (Long) o); return idlist.remove(o); } diff --git a/src/io/github/norbipeti/chat/server/page/IndexPage.java b/src/io/github/norbipeti/chat/server/page/IndexPage.java index 9e90433..d38feec 100644 --- a/src/io/github/norbipeti/chat/server/page/IndexPage.java +++ b/src/io/github/norbipeti/chat/server/page/IndexPage.java @@ -37,9 +37,16 @@ public class IndexPage extends Page { Element channelmessages = doc.getElementById("channelmessages"); LogManager.getLogger().log(Level.INFO, "Conversations: " + DataManager.load(Conversation.class).size()); LogManager.getLogger().log(Level.INFO, "User conversations: " + user.getConversations().size()); - Conversation convo = user.getConversations().get(0); - LogManager.getLogger().log(Level.INFO, "Messages: " + convo.getMesssages().size()); - for (Message message : convo.getMesssages()) { + LogManager.getLogger().log(Level.INFO, "Username: " + user.getName()); + if (user.getConversations().size() == 0) + user.getConversations().add(DataManager.load(Conversation.class).get(0)); + Conversation conv = user.getConversations().get(0); + Element cide = channelmessages.appendElement("p"); + cide.attr("style", "display: none"); + cide.attr("id", "convidp"); + cide.text(Long.toString(conv.getId())); + LogManager.getLogger().log(Level.INFO, "Messages: " + conv.getMesssages().size()); + for (Message message : conv.getMesssages()) { Element msgelement = channelmessages.appendElement("div"); Element header = msgelement.appendElement("p"); header.text(message.getSender().getName() + " - " + message.getTime()); @@ -48,7 +55,14 @@ public class IndexPage extends Page { } return doc; }, exchange); - } // TODO: Validation at registration (no special chars, etc.) + } // TODO: + // Validation + // at + // registration + // (no + // special + // chars, + // etc.) @Override public String GetName() { diff --git a/src/io/github/norbipeti/chat/server/page/MessageAjaxPage.java b/src/io/github/norbipeti/chat/server/page/MessageAjaxPage.java index 04ecf55..805c51a 100644 --- a/src/io/github/norbipeti/chat/server/page/MessageAjaxPage.java +++ b/src/io/github/norbipeti/chat/server/page/MessageAjaxPage.java @@ -45,7 +45,7 @@ public class MessageAjaxPage extends Page { String message = obj.get("message").getAsString(); int conversation = obj.get("conversation").getAsInt(); if (message.trim().length() == 0) { - IOHelper.SendResponse(400, "

400 Bad request

The message cannot be empty,

", exchange); + IOHelper.SendResponse(400, "

400 Bad request

The message cannot be empty.

", exchange); return; } LoaderCollection convos = user.getConversations();