From d6834c2ae43534b87bd95d1836f40ad0c68359be Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Tue, 9 Aug 2016 12:12:46 +0200 Subject: [PATCH] Working on generalizing the serializers --- pages/js/index.js | 7 +++- src/io/github/norbipeti/chat/server/Main.java | 23 ++++++++----- .../chat/server/data/DataManager.java | 4 +-- .../chat/server/data/LoaderCollection.java | 3 +- .../data/LoaderCollectionSerializer.java | 33 +++++++++++-------- .../norbipeti/chat/server/data/LoaderRef.java | 9 ++--- .../chat/server/data/LoaderRefSerializer.java | 2 +- .../norbipeti/chat/server/io/DataType.java | 32 ++++++++++++++++++ .../norbipeti/chat/server/page/IndexPage.java | 5 +-- 9 files changed, 82 insertions(+), 36 deletions(-) create mode 100644 src/io/github/norbipeti/chat/server/io/DataType.java diff --git a/pages/js/index.js b/pages/js/index.js index 823878a..b56d3df 100644 --- a/pages/js/index.js +++ b/pages/js/index.js @@ -4,6 +4,11 @@ $(document).ready(function () { var cmsgs = document.getElementById("channelmessages"); - if (cmsgs != null && cmsgs.childElementCount > 0) + if (cmsgs != null && cmsgs.childElementCount > 0) { + cmsgs.forEach(function (item) { + var ctime = item.getElementById("converttime"); + ctime.innerText = new Date(ctime.innerText * 1).toDateString(); + }); cmsgs.lastElementChild.scrollIntoView(false); + } }); diff --git a/src/io/github/norbipeti/chat/server/Main.java b/src/io/github/norbipeti/chat/server/Main.java index 7c74e35..311e090 100644 --- a/src/io/github/norbipeti/chat/server/Main.java +++ b/src/io/github/norbipeti/chat/server/Main.java @@ -16,9 +16,9 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.sun.net.httpserver.HttpServer; - 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.*; public class Main { @@ -31,12 +31,17 @@ public class Main { LogManager.getLogger().log(Level.INFO, "Loading files..."); DataManager.init(); final GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(new TypeToken>() { - }.getType(), new LoaderCollectionSerializer()); - gsonBuilder.registerTypeAdapter(new TypeToken>() { - }.getType(), new LoaderCollectionSerializer()); - gsonBuilder.registerTypeAdapter(new TypeToken>() { - }.getType(), new LoaderCollectionSerializer()); + Reflections rf = new Reflections( + new ConfigurationBuilder().setUrls(ClasspathHelper.forClassLoader(SavedData.class.getClassLoader())) + .addClassLoader(SavedData.class.getClassLoader()).addScanners(new SubTypesScanner()) + .filterInputsBy((String pkg) -> pkg.contains(SavedData.class.getPackage().getName()))); + Set> datas = rf.getSubTypesOf(SavedData.class); + for (Class data : datas) { + if (Modifier.isAbstract(data.getModifiers())) + continue; + gsonBuilder.registerTypeAdapter(new DataType(LoaderCollection.class, data), + new LoaderCollectionSerializer()); // TODO: Test + } gsonBuilder.registerTypeAdapter(new TypeToken>() { }.getType(), new LoaderRefSerializer()); gsonBuilder.registerTypeAdapter(new TypeToken>() { @@ -58,10 +63,10 @@ public class Main { */ LogManager.getLogger().log(Level.INFO, "Starting webserver..."); // TODO: Separate IDs for conversations and users HttpServer server = HttpServer.create(new InetSocketAddress(InetAddress.getLocalHost(), 8080), 10); - Reflections rf = new Reflections( + rf = new Reflections( new ConfigurationBuilder().setUrls(ClasspathHelper.forClassLoader(Page.class.getClassLoader())) .addClassLoader(Page.class.getClassLoader()).addScanners(new SubTypesScanner()) - .filterInputsBy((String pkg) -> pkg.contains("io.github.norbipeti.chat.server.page"))); + .filterInputsBy((String pkg) -> pkg.contains(Page.class.getPackage().getName()))); Set> pages = rf.getSubTypesOf(Page.class); for (Class page : pages) { try { diff --git a/src/io/github/norbipeti/chat/server/data/DataManager.java b/src/io/github/norbipeti/chat/server/data/DataManager.java index ae10b01..225f69f 100644 --- a/src/io/github/norbipeti/chat/server/data/DataManager.java +++ b/src/io/github/norbipeti/chat/server/data/DataManager.java @@ -61,7 +61,7 @@ public final class DataManager { private static T loadFromFile(File file, Class cl) { try { if (!file.exists()) { - T obj = cl.newInstance(); + T obj = SavedData.create(cl); return obj; } if (cache.containsKey(file)) @@ -146,7 +146,7 @@ public final class DataManager { File file = new File("data", "idlist.ini"); String contents = ""; for (Entry, Long> item : ids.entrySet()) { - contents += item.getKey().getName() + "=" + item.getValue() + "\n"; + contents += item.getKey().getSimpleName() + "=" + item.getValue() + "\n"; } Files.write(contents, file, StandardCharsets.UTF_8); } catch (Exception e) { diff --git a/src/io/github/norbipeti/chat/server/data/LoaderCollection.java b/src/io/github/norbipeti/chat/server/data/LoaderCollection.java index 1bdda29..d2ddbd2 100644 --- a/src/io/github/norbipeti/chat/server/data/LoaderCollection.java +++ b/src/io/github/norbipeti/chat/server/data/LoaderCollection.java @@ -22,7 +22,7 @@ import io.github.norbipeti.chat.server.db.domain.SavedData; * * @param */ -public class LoaderCollection implements List, Serializable { +public class LoaderCollection extends Loader implements List { private static final long serialVersionUID = 5426152406394894301L; List idlist; Class cl; @@ -32,6 +32,7 @@ public class LoaderCollection implements List, Serializa */ @Deprecated public LoaderCollection() { + idlist = new ArrayList<>(); } public LoaderCollection(Class cl) { diff --git a/src/io/github/norbipeti/chat/server/data/LoaderCollectionSerializer.java b/src/io/github/norbipeti/chat/server/data/LoaderCollectionSerializer.java index 6db75ae..a3254e3 100644 --- a/src/io/github/norbipeti/chat/server/data/LoaderCollectionSerializer.java +++ b/src/io/github/norbipeti/chat/server/data/LoaderCollectionSerializer.java @@ -1,6 +1,8 @@ package io.github.norbipeti.chat.server.data; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.List; @@ -15,15 +17,16 @@ import io.github.norbipeti.chat.server.db.domain.SavedData; // @SuppressWarnings("rawtypes") public class LoaderCollectionSerializer extends TypeAdapter> { - private static final Type returnType = getReturnType(); + // private static final Type returnType = getReturnType(); + // TODO: http://stackoverflow.com/a/17300227 @Override public void write(JsonWriter out, LoaderCollection value) throws IOException { if (value == null) { out.nullValue(); return; } - out.beginObject(); // TODO: http://stackoverflow.com/a/17300227 + out.beginObject(); out.name("items"); new Gson().toJson(value.idlist, new TypeToken>() { }.getType(), out); @@ -33,7 +36,7 @@ public class LoaderCollectionSerializer extends TypeAdapter> @SuppressWarnings("unchecked") @Override - public LoaderCollection read(JsonReader in) throws IOException { + public LoaderCollection read(JsonReader in) throws IOException { if (in.peek().equals(JsonToken.NULL)) { in.nextNull(); return null; @@ -46,25 +49,27 @@ public class LoaderCollectionSerializer extends TypeAdapter> new Exception("Error: Next isn't \"class\"").printStackTrace(); return null; } - Class cl; + Class cl; try { - cl = (Class) Class.forName(DataManager.getPackageName() + "." + in.nextString()); + cl = (Class) Class.forName(DataManager.getPackageName() + "." + in.nextString()); } catch (ClassNotFoundException e) { e.printStackTrace(); return null; } - LoaderCollection col = new LoaderCollection(cl); + LoaderCollection col; + try { + col = LoaderCollection.class.getDeclaredConstructor(Class.class).newInstance(cl); + } catch (Exception e) { + e.printStackTrace(); + return null; + } col.idlist.addAll(list); in.endObject(); return col; } - private static Type getReturnType() { - try { - return LoaderCollection.class.getDeclaredMethod("get", Integer.class).getGenericReturnType(); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } + /* + * private static Type getReturnType() { try { for (Method m : LoaderCollection.class.getDeclaredMethods()) System.out.println(m); return LoaderCollection.class.getDeclaredMethod("get", + * int.class).getGenericReturnType(); } catch (Exception e) { e.printStackTrace(); } return null; } + */ } diff --git a/src/io/github/norbipeti/chat/server/data/LoaderRef.java b/src/io/github/norbipeti/chat/server/data/LoaderRef.java index ac56815..82432fe 100644 --- a/src/io/github/norbipeti/chat/server/data/LoaderRef.java +++ b/src/io/github/norbipeti/chat/server/data/LoaderRef.java @@ -6,19 +6,16 @@ import io.github.norbipeti.chat.server.db.domain.SavedData; /** *

- * This class will only store IDs and load the object when calling - * {@link #get()} + * This class will only store IDs and load the object when calling {@link #get()} *

*

* And will also only save IDs when serialized with {@link LoaderRefSerializer} *

* * @author Norbi - * - * @param - * The type of the stored object + * @param The type of the stored object */ -public class LoaderRef implements Serializable { +public class LoaderRef extends Loader { private static final long serialVersionUID = 8458570738734235320L; Class cl; Long id; diff --git a/src/io/github/norbipeti/chat/server/data/LoaderRefSerializer.java b/src/io/github/norbipeti/chat/server/data/LoaderRefSerializer.java index c2a4699..3160da3 100644 --- a/src/io/github/norbipeti/chat/server/data/LoaderRefSerializer.java +++ b/src/io/github/norbipeti/chat/server/data/LoaderRefSerializer.java @@ -36,7 +36,7 @@ public class LoaderRefSerializer extends TypeAdapter cl; diff --git a/src/io/github/norbipeti/chat/server/io/DataType.java b/src/io/github/norbipeti/chat/server/io/DataType.java new file mode 100644 index 0000000..1c9d3bb --- /dev/null +++ b/src/io/github/norbipeti/chat/server/io/DataType.java @@ -0,0 +1,32 @@ +package io.github.norbipeti.chat.server.io; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +import io.github.norbipeti.chat.server.data.Loader; +import io.github.norbipeti.chat.server.db.domain.SavedData; + +public final class DataType implements ParameterizedType { + private Class datacl; + private Class loadercl; + + public DataType(Class loadercl, Class datacl) { + this.datacl = datacl; + this.loadercl = loadercl; + } + + @Override + public Type[] getActualTypeArguments() { + return new Type[] { datacl }; + } + + @Override + public Type getRawType() { + return loadercl; + } + + @Override + public Type getOwnerType() { + return null; + } +} diff --git a/src/io/github/norbipeti/chat/server/page/IndexPage.java b/src/io/github/norbipeti/chat/server/page/IndexPage.java index 35be43b..2f1e266 100644 --- a/src/io/github/norbipeti/chat/server/page/IndexPage.java +++ b/src/io/github/norbipeti/chat/server/page/IndexPage.java @@ -61,9 +61,10 @@ public class IndexPage extends Page { for (Message message : chunk.getMessages()) { Element msgelement = channelmessages.appendElement("div"); Element header = msgelement.appendElement("p"); - header.text(message.getSender().get().getName() + " - " + message.getTime()); + header.text(message.getSender().get().getName() + " - " + + message.getTime().getTime() + ""); Element body = msgelement.appendElement("p"); - body.text(message.getMessage()); + body.text(message.getMessage()); // TODO: Use JavaScript to convert time } } return doc;