From 319a2a9aa1f1193be9a1b5f399558ceb79f9fa08 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Thu, 11 Aug 2016 13:31:11 +0200 Subject: [PATCH] Message listener in progress with a refactoring still --- pom.xml | 6 +++ src/io/github/norbipeti/chat/server/Main.java | 17 +++++-- .../chat/server/data/DataManager.java | 38 +++++++-------- .../chat/server/db/domain/Conversation.java | 4 +- .../chat/server/db/domain/ManagedData.java | 4 +- .../chat/server/db/domain/Message.java | 43 +++++++++-------- .../chat/server/db/domain/MessageChunk.java | 8 +++- .../chat/server/db/domain/SavedData.java | 6 +++ .../norbipeti/chat/server/db/domain/User.java | 8 ++-- .../norbipeti/chat/server/page/IndexPage.java | 2 +- .../server/page/ReceiveMessageAjaxPage.java | 46 +++++-------------- .../chat/server/page/SendMessageAjaxPage.java | 9 +--- 12 files changed, 96 insertions(+), 95 deletions(-) create mode 100644 src/io/github/norbipeti/chat/server/db/domain/SavedData.java diff --git a/pom.xml b/pom.xml index 1a95534..5c3a70f 100644 --- a/pom.xml +++ b/pom.xml @@ -100,6 +100,12 @@ gson 2.7 + + + io.vertx + vertx-core + 3.3.2 + 1.8 diff --git a/src/io/github/norbipeti/chat/server/Main.java b/src/io/github/norbipeti/chat/server/Main.java index 95662b9..854a730 100644 --- a/src/io/github/norbipeti/chat/server/Main.java +++ b/src/io/github/norbipeti/chat/server/Main.java @@ -19,6 +19,8 @@ import io.github.norbipeti.chat.server.data.*; import io.github.norbipeti.chat.server.db.domain.*; import io.github.norbipeti.chat.server.io.DataType; import io.github.norbipeti.chat.server.page.*; +import io.vertx.core.Vertx; +import io.vertx.core.http.HttpServerOptions; public class Main { public static Gson gson; @@ -30,10 +32,10 @@ public class Main { LogManager.getLogger().log(Level.INFO, "Loading files..."); DataManager.init(); final GsonBuilder gsonBuilder = new GsonBuilder(); - Reflections rf = new Reflections( - new ConfigurationBuilder().setUrls(ClasspathHelper.forClassLoader(ManagedData.class.getClassLoader())) - .addClassLoader(ManagedData.class.getClassLoader()).addScanners(new SubTypesScanner()) - .filterInputsBy((String pkg) -> pkg.contains(ManagedData.class.getPackage().getName()))); + Reflections rf = new Reflections(new ConfigurationBuilder() + .setUrls(ClasspathHelper.forClassLoader(ManagedData.class.getClassLoader())) + .addClassLoader(ManagedData.class.getClassLoader()).addScanners(new SubTypesScanner()) + .filterInputsBy((String pkg) -> pkg.contains(ManagedData.class.getPackage().getName()))); Set> datas = rf.getSubTypesOf(ManagedData.class); for (Class data : datas) { if (Modifier.isAbstract(data.getModifiers())) @@ -75,6 +77,13 @@ public class Main { } } server.start(); + LogManager.getLogger().info("Starting websocket server..."); + Vertx vertx = Vertx.vertx(); + io.vertx.core.http.HttpServer socketserver = vertx.createHttpServer(); + socketserver.websocketHandler(websocket -> { + websocket.writeFinalTextFrame("Hello"); // TODO + }); + socketserver.listen(8180); LogManager.getLogger().log(Level.INFO, "Ready... Press Enter to stop."); System.in.read(); LogManager.getLogger().log(Level.INFO, "Stopping..."); diff --git a/src/io/github/norbipeti/chat/server/data/DataManager.java b/src/io/github/norbipeti/chat/server/data/DataManager.java index 57122fb..627a040 100644 --- a/src/io/github/norbipeti/chat/server/data/DataManager.java +++ b/src/io/github/norbipeti/chat/server/data/DataManager.java @@ -12,7 +12,7 @@ import java.util.Map.Entry; import com.google.common.io.Files; import io.github.norbipeti.chat.server.Main; -import io.github.norbipeti.chat.server.db.domain.ManagedData; +import io.github.norbipeti.chat.server.db.domain.SavedData; public final class DataManager { private DataManager() { @@ -20,7 +20,7 @@ public final class DataManager { private static final File datafolder = new File("data"); - public static void save(T object) { + public static void save(T object) { try { File file = new File(datafolder, getFileName(object.getClass(), object.getId())); cache.put(file, object); @@ -30,11 +30,11 @@ public final class DataManager { } } - public static T load(Class cl, long id) { + public static T load(Class cl, long id) { return loadFromFile(new File(datafolder, getFileName(cl, id)), cl); } - public static LoaderCollection getAll(Class cl) { + public static LoaderCollection getAll(Class cl) { String[] filenames = datafolder.list(new FilenameFilter() { @Override @@ -59,10 +59,10 @@ public final class DataManager { // TODO: Handle unloading of used objects (prevent detached objects) @SuppressWarnings("unchecked") - private static T loadFromFile(File file, Class cl) { + private static T loadFromFile(File file, Class cl) { try { if (!file.exists()) { - T obj = ManagedData.create(cl); + T obj = SavedData.create(cl); return obj; } if (cache.containsKey(file)) @@ -83,18 +83,18 @@ public final class DataManager { return null; } - public static boolean remove(T obj) { + public static boolean remove(T obj) { if (cache.containsValue(obj)) cache.values().remove(obj); return new File(obj.getClass().getSimpleName() + "-" + obj.getId()).delete(); } - public static boolean remove(Class cl, Long id) { + public static boolean remove(Class cl, Long id) { return new File(cl.getName() + "-" + id).delete(); } public static void init() { - packagename = ManagedData.class.getPackage().getName(); + packagename = SavedData.class.getPackage().getName(); datafolder.mkdir(); nextids = loadNextIDs(); } @@ -108,32 +108,32 @@ public final class DataManager { public static void save() { saveNextIDs(nextids); for (Entry item : cache.entrySet()) { - DataManager.save((ManagedData) item.getValue()); + DataManager.save((SavedData) item.getValue()); } } - private static HashMap, Long> nextids; + private static HashMap, Long> nextids; - public static Map, Long> getNextIDs() { + public static Map, Long> getNextIDs() { return Collections.unmodifiableMap(nextids); } - public static void setNextID(Class cl, Long id) { + public static void setNextID(Class cl, Long id) { nextids.put(cl, id); } @SuppressWarnings("unchecked") - private static HashMap, Long> loadNextIDs() { + private static HashMap, Long> loadNextIDs() { try { File file = new File("data", "idlist.ini"); if (!file.exists()) return new HashMap<>(); BufferedReader reader = Files.newReader(file, StandardCharsets.UTF_8); String line; - HashMap, Long> ret = new HashMap<>(); + HashMap, Long> ret = new HashMap<>(); while ((line = reader.readLine()) != null) { String[] spl = line.split("\\="); - ret.put((Class) Class.forName(packagename + "." + spl[0]), Long.parseLong(spl[1])); + ret.put((Class) Class.forName(packagename + "." + spl[0]), Long.parseLong(spl[1])); } return ret; } catch (Exception e) { @@ -142,11 +142,11 @@ public final class DataManager { return new HashMap<>(); } - private static void saveNextIDs(HashMap, Long> ids) { + private static void saveNextIDs(HashMap, Long> ids) { try { File file = new File("data", "idlist.ini"); String contents = ""; - for (Entry, Long> item : ids.entrySet()) { + for (Entry, Long> item : ids.entrySet()) { contents += item.getKey().getSimpleName() + "=" + item.getValue() + "\n"; } Files.write(contents, file, StandardCharsets.UTF_8); @@ -155,7 +155,7 @@ public final class DataManager { } } - private static String getFileName(Class cl, Long id) { + private static String getFileName(Class cl, Long id) { if (id != null) return cl.getSimpleName() + "-" + id + ".json"; else diff --git a/src/io/github/norbipeti/chat/server/db/domain/Conversation.java b/src/io/github/norbipeti/chat/server/db/domain/Conversation.java index 9797f60..ad98029 100644 --- a/src/io/github/norbipeti/chat/server/db/domain/Conversation.java +++ b/src/io/github/norbipeti/chat/server/db/domain/Conversation.java @@ -6,7 +6,7 @@ import io.github.norbipeti.chat.server.data.LoaderCollection; @Entity @Table(name = "CONVERSATION") -public class Conversation extends ManagedData { +public class Conversation extends SavedData { private static final long serialVersionUID = 5058682475353799722L; // @Id // @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -46,7 +46,7 @@ public class Conversation extends ManagedData { } @Override - public void setId(long id) { + protected void setId(long id) { this.id = id; } diff --git a/src/io/github/norbipeti/chat/server/db/domain/ManagedData.java b/src/io/github/norbipeti/chat/server/db/domain/ManagedData.java index 40e585f..e4a865e 100644 --- a/src/io/github/norbipeti/chat/server/db/domain/ManagedData.java +++ b/src/io/github/norbipeti/chat/server/db/domain/ManagedData.java @@ -9,14 +9,14 @@ import io.github.norbipeti.chat.server.data.DataManager; public abstract class ManagedData implements Serializable { public abstract long getId(); - public abstract void setId(long id); + protected abstract void setId(long id); protected abstract void init(); protected ManagedData() { } - static T create(Class cl) { + public static T create(Class cl) { T obj; try { Constructor constructor = cl.getDeclaredConstructor(new Class[0]); diff --git a/src/io/github/norbipeti/chat/server/db/domain/Message.java b/src/io/github/norbipeti/chat/server/db/domain/Message.java index ba3252b..33bf698 100644 --- a/src/io/github/norbipeti/chat/server/db/domain/Message.java +++ b/src/io/github/norbipeti/chat/server/db/domain/Message.java @@ -9,7 +9,7 @@ import io.github.norbipeti.chat.server.data.LoaderRef; @Entity @Table(name = "MESSAGE") -public class Message implements Serializable { +public class Message extends ManagedData { private static final int MESSAGE_LIMIT_PER_CHUNK = 50; private static final long serialVersionUID = 6345941601716826570L; private static Long nextid = 0L; @@ -58,27 +58,16 @@ public class Message implements Serializable { return messagechunk; } - public void setMessageChunk(LoaderRef messagechunk) { - this.messagechunk = messagechunk; + public void setConversation(LoaderRef conversation) { + setConv(conversation.get()); } - public void setMessageChunk(MessageChunk messagechunk) { - this.messagechunk = new LoaderRef(messagechunk); + public void setConversation(Conversation conversation) { + setConv(conversation); } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - private Message() { - } - - public static Message create(Conversation parent) { - Message msg = new Message(); + private void setConv(Conversation parent) { + Message msg = this; int size = parent.getMesssageChunks().size(); MessageChunk chunk; if (size == 0 || parent.getMesssageChunks().get(size - 1).getMessages().size() >= MESSAGE_LIMIT_PER_CHUNK) { @@ -87,7 +76,21 @@ public class Message implements Serializable { parent.getMesssageChunks().add(chunk); } else chunk = parent.getMesssageChunks().get(size - 1); - msg.setMessageChunk(chunk); - return msg; + msg.messagechunk = new LoaderRef(chunk); + } + + public long getId() { + return id; + } + + protected void setId(long id) { + this.id = id; + } + + private Message() { + } + + @Override + protected void init() { } } diff --git a/src/io/github/norbipeti/chat/server/db/domain/MessageChunk.java b/src/io/github/norbipeti/chat/server/db/domain/MessageChunk.java index 55a0c5e..f475313 100644 --- a/src/io/github/norbipeti/chat/server/db/domain/MessageChunk.java +++ b/src/io/github/norbipeti/chat/server/db/domain/MessageChunk.java @@ -5,7 +5,7 @@ import java.util.List; import io.github.norbipeti.chat.server.data.LoaderRef; -public class MessageChunk extends ManagedData { +public class MessageChunk extends SavedData { private static final long serialVersionUID = -1665300779209348467L; private Long id; @@ -39,10 +39,14 @@ public class MessageChunk extends ManagedData { } @Override - public void setId(long id) { + protected void setId(long id) { this.id = id; } private MessageChunk() { } + + @Override + public void init() { + } } diff --git a/src/io/github/norbipeti/chat/server/db/domain/SavedData.java b/src/io/github/norbipeti/chat/server/db/domain/SavedData.java new file mode 100644 index 0000000..b8ec739 --- /dev/null +++ b/src/io/github/norbipeti/chat/server/db/domain/SavedData.java @@ -0,0 +1,6 @@ +package io.github.norbipeti.chat.server.db.domain; + +@SuppressWarnings("serial") +public abstract class SavedData extends ManagedData { + +} diff --git a/src/io/github/norbipeti/chat/server/db/domain/User.java b/src/io/github/norbipeti/chat/server/db/domain/User.java index 118a2a1..05b9e60 100644 --- a/src/io/github/norbipeti/chat/server/db/domain/User.java +++ b/src/io/github/norbipeti/chat/server/db/domain/User.java @@ -9,7 +9,7 @@ import io.github.norbipeti.chat.server.data.LoaderCollection; @Entity @Table(name = "\"USER\"") -public class User extends ManagedData { +public class User extends SavedData { private static final long serialVersionUID = 2862762084164225666L; private Long id; private String name; @@ -105,11 +105,11 @@ public class User extends ManagedData { } @Override - public void setId(long id) { + protected void setId(long id) { this.id = id; } - public static User createUser() { - return ManagedData.create(User.class); + @Override + public void init() { } } diff --git a/src/io/github/norbipeti/chat/server/page/IndexPage.java b/src/io/github/norbipeti/chat/server/page/IndexPage.java index e62102c..5379298 100644 --- a/src/io/github/norbipeti/chat/server/page/IndexPage.java +++ b/src/io/github/norbipeti/chat/server/page/IndexPage.java @@ -45,7 +45,7 @@ public class IndexPage extends Page { if (user.getConversations().size() == 0) { LoaderCollection convs = DataManager.getAll(Conversation.class); if (convs.size() == 0) { - Conversation c = Conversation.create(); + Conversation c = ManagedData.create(Conversation.class); convs.add(c); // TODO: Handle no conversation open } user.getConversations().add(convs.get(0)); diff --git a/src/io/github/norbipeti/chat/server/page/ReceiveMessageAjaxPage.java b/src/io/github/norbipeti/chat/server/page/ReceiveMessageAjaxPage.java index fd5eb86..2ac0d65 100644 --- a/src/io/github/norbipeti/chat/server/page/ReceiveMessageAjaxPage.java +++ b/src/io/github/norbipeti/chat/server/page/ReceiveMessageAjaxPage.java @@ -7,6 +7,7 @@ import org.apache.logging.log4j.LogManager; import com.google.gson.JsonObject; import com.sun.net.httpserver.HttpExchange; +import io.github.norbipeti.chat.server.Main; import io.github.norbipeti.chat.server.data.DataManager; import io.github.norbipeti.chat.server.data.LoaderCollection; import io.github.norbipeti.chat.server.db.domain.Conversation; @@ -18,6 +19,7 @@ import io.github.norbipeti.chat.server.io.IOHelper; public class ReceiveMessageAjaxPage extends Page { // http://stackoverflow.com/questions/9242404/javascript-listen-to-server + // https://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery @Override public String GetName() { return "receivemessage"; @@ -30,40 +32,16 @@ public class ReceiveMessageAjaxPage extends Page { IOHelper.SendResponse(403, "

Please log in to receive messages

", exchange); return; } - JsonObject obj = new JsonObject(); - String message = obj.get("message").getAsString().trim(); - int conversation = obj.get("conversation").getAsInt(); - if (message.trim().length() == 0) { - IOHelper.SendResponse(400, "

400 Bad request

The message cannot be empty.

", exchange); - return; - } - LoaderCollection convos = user.getConversations(); - Conversation conv = null; - LogManager.getLogger().log(Level.DEBUG, "Len: " + convos.size()); - for (Conversation con : convos) { - LogManager.getLogger().log(Level.DEBUG, con.getId()); - if (con.getId() == conversation) { - conv = con; - break; - } - } - if (conv == null) { - IOHelper.SendResponse(400, "

400 Conversation not found

The conversation with the id " - + conversation + " is not found.

", exchange); - return; - } - MessageChunk chunk = ManagedData.create(MessageChunk.class); - chunk.setConversation(conv); - Message msg = new Message(); - msg.setSender(user); - msg.setMessage(message); - msg.setTime(new Date()); - msg.setMessageChunk(chunk); - chunk.getMessages().add(msg); - conv.getMesssageChunks().add(chunk); - DataManager.save(conv); - LogManager.getLogger().log(Level.DEBUG, - "Added conversation's message count: " + conv.getMesssageChunks().size()); + JsonObject obj = new JsonObject(); // TODO + /* + * String message = obj.get("message").getAsString().trim(); int conversation = obj.get("conversation").getAsInt(); if (message.trim().length() == 0) { IOHelper.SendResponse(400, + * "

400 Bad request

The message cannot be empty.

", exchange); return; } LoaderCollection convos = user.getConversations(); Conversation conv = null; + * LogManager.getLogger().log(Level.DEBUG, "Len: " + convos.size()); for (Conversation con : convos) { LogManager.getLogger().log(Level.DEBUG, con.getId()); if (con.getId() == conversation) { + * conv = con; break; } } if (conv == null) { IOHelper.SendResponse(400, "

400 Conversation not found

The conversation with the id " + conversation + " is not found.

", exchange); + * return; } MessageChunk chunk = ManagedData.create(MessageChunk.class); chunk.setConversation(conv); Message msg = new Message(); msg.setSender(user); msg.setMessage(message); + * msg.setTime(new Date()); msg.setMessageChunk(chunk); chunk.getMessages().add(msg); conv.getMesssageChunks().add(chunk); DataManager.save(conv); LogManager.getLogger().log(Level.DEBUG, + * "Added conversation's message count: " + conv.getMesssageChunks().size()); + */ IOHelper.SendResponse(200, "Success", exchange); } diff --git a/src/io/github/norbipeti/chat/server/page/SendMessageAjaxPage.java b/src/io/github/norbipeti/chat/server/page/SendMessageAjaxPage.java index 1e75434..c0f701a 100644 --- a/src/io/github/norbipeti/chat/server/page/SendMessageAjaxPage.java +++ b/src/io/github/norbipeti/chat/server/page/SendMessageAjaxPage.java @@ -64,16 +64,11 @@ public class SendMessageAjaxPage extends Page { + conversation + " is not found.

", exchange); return; } - MessageChunk chunk = ManagedData.create(MessageChunk.class); // TODO: Automatize - chunk.setConversation(conv); - Message msg = new Message(); + Message msg = ManagedData.create(Message.class); + msg.setConversation(conv); msg.setSender(user); - LogManager.getLogger().debug(message); msg.setMessage(message); msg.setTime(new Date()); - msg.setMessageChunk(chunk); // TODO: Store relations at one side or both - chunk.getMessages().add(msg); - conv.getMesssageChunks().add(chunk); DataManager.save(conv); LogManager.getLogger().log(Level.DEBUG, "Added conversation's message count: " + conv.getMesssageChunks().size());