Fixed serialization

This commit is contained in:
Norbi Peti 2016-08-04 13:10:46 +02:00
parent b01b1324eb
commit d6441d90e1
8 changed files with 100 additions and 79 deletions

View file

@ -33,55 +33,56 @@ public class Main {
final GsonBuilder gsonBuilder = new GsonBuilder(); final GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(new TypeToken<LoaderCollection<Conversation>>() { gsonBuilder.registerTypeAdapter(new TypeToken<LoaderCollection<Conversation>>() {
}.getType(), new LoaderCollectionSerializer<Conversation>()); }.getType(), new LoaderCollectionSerializer<Conversation>());
gsonBuilder.registerTypeAdapter(new TypeToken<LoaderCollection<Message>>() { gsonBuilder.registerTypeAdapter(new TypeToken<LoaderCollection<MessageChunk>>() {
}.getType(), new LoaderCollectionSerializer<Message>()); }.getType(), new LoaderCollectionSerializer<MessageChunk>());
gsonBuilder.registerTypeAdapter(new TypeToken<LoaderCollection<User>>() { gsonBuilder.registerTypeAdapter(new TypeToken<LoaderCollection<User>>() {
}.getType(), new LoaderCollectionSerializer<User>()); }.getType(), new LoaderCollectionSerializer<User>());
gsonBuilder.registerTypeAdapter(new TypeToken<LoaderRef<Conversation>>() {
}.getType(), new LoaderRefSerializer<Conversation>());
gsonBuilder.registerTypeAdapter(new TypeToken<LoaderRef<MessageChunk>>() {
}.getType(), new LoaderRefSerializer<MessageChunk>());
gsonBuilder.registerTypeAdapter(new TypeToken<LoaderRef<User>>() {
}.getType(), new LoaderRefSerializer<User>());
gson = gsonBuilder.create(); gson = gsonBuilder.create();
/*User user = new User(); /*
user.setName("asd"); * User user = new User(); user.setName("asd");
user.setEmail("test@test.com"); * user.setEmail("test@test.com"); User user2 = new User();
User user2 = new User(); * user2.setName("Teszt"); user2.setEmail("test2@test.com"); // user
user2.setName("Teszt"); * = provider.save(user); // user2 = provider.save(user2);
user2.setEmail("test2@test.com"); * user.getContacts().add(user2); user2.getContacts().add(user);
// user = provider.save(user); * LogManager.getLogger().log(Level.DEBUG, "1st's contact: " +
// user2 = provider.save(user2); * user.getContacts().get(0));
user.getContacts().add(user2); * LogManager.getLogger().log(Level.DEBUG, "2nd's contact: " +
user2.getContacts().add(user); * user2.getContacts().get(0)); Conversation conversation = new
LogManager.getLogger().log(Level.DEBUG, "1st's contact: " + user.getContacts().get(0)); * Conversation(); conversation.getUsers().add(user);
LogManager.getLogger().log(Level.DEBUG, "2nd's contact: " + user2.getContacts().get(0)); * user.getConversations().add(conversation);
Conversation conversation = new Conversation(); * LogManager.getLogger().debug("User: " + user);
conversation.getUsers().add(user); * conversation.getUsers().add(user2);
user.getConversations().add(conversation); * LogManager.getLogger().debug("User2: " + user2);
LogManager.getLogger().debug("User: " + user); * user2.getConversations().add(conversation); Message msg = new
conversation.getUsers().add(user2); * Message(); msg.setSender(user); msg.setTime(new Date());
LogManager.getLogger().debug("User2: " + user2); * msg.setMessage("Teszt 1"); conversation.getMesssages().add(msg);
user2.getConversations().add(conversation); * Message msg2 = new Message(); msg2.setSender(user2);
Message msg = new Message(); * msg2.setTime(new Date()); msg2.setMessage("Teszt 2");
msg.setSender(user); * conversation.getMesssages().add(msg2); // provider.save(user); //
msg.setTime(new Date()); * provider.save(user2);s User loggedinuser = new User();
msg.setMessage("Teszt 1"); * loggedinuser.setName("NorbiPeti");
conversation.getMesssages().add(msg); * loggedinuser.setSessionid("093b1395-8c31-4f3b-ba67-828a755af92e")
Message msg2 = new Message(); * ; loggedinuser.setEmail("sznp@asd.com");
msg2.setSender(user2); * loggedinuser.getContacts().add(user2);
msg2.setTime(new Date()); * conversation.getUsers().add(loggedinuser);
msg2.setMessage("Teszt 2"); * loggedinuser.getConversations().add(conversation);
conversation.getMesssages().add(msg2); * DataManager.save(user); DataManager.save(user2);
// provider.save(user); * DataManager.save(loggedinuser); DataManager.save(conversation);
// provider.save(user2);s */
User loggedinuser = new User();
loggedinuser.setName("NorbiPeti");
loggedinuser.setSessionid("093b1395-8c31-4f3b-ba67-828a755af92e");
loggedinuser.setEmail("sznp@asd.com");
loggedinuser.getContacts().add(user2);
conversation.getUsers().add(loggedinuser);
loggedinuser.getConversations().add(conversation);
DataManager.save(user);
DataManager.save(user2);
DataManager.save(loggedinuser);
DataManager.save(conversation);*/
LogManager.getLogger().log(Level.INFO, "Starting webserver..."); //TODO: Separate IDs for conversations and users LogManager.getLogger().log(Level.INFO, "Starting webserver..."); // TODO:
// Separate
// IDs
// for
// conversations
// and
// users
HttpServer server = HttpServer.create(new InetSocketAddress(InetAddress.getLocalHost(), 8080), 10); HttpServer server = HttpServer.create(new InetSocketAddress(InetAddress.getLocalHost(), 8080), 10);
Reflections rf = new Reflections( Reflections rf = new Reflections(
new ConfigurationBuilder().setUrls(ClasspathHelper.forClassLoader(Page.class.getClassLoader())) new ConfigurationBuilder().setUrls(ClasspathHelper.forClassLoader(Page.class.getClassLoader()))

View file

@ -12,10 +12,10 @@ import com.google.gson.stream.JsonWriter;
import io.github.norbipeti.chat.server.db.domain.SavedData; import io.github.norbipeti.chat.server.db.domain.SavedData;
//@SuppressWarnings("rawtypes") //@SuppressWarnings("rawtypes")
public class LoaderCollectionSerializer extends TypeAdapter<LoaderCollection<? extends SavedData>> { public class LoaderCollectionSerializer<T extends SavedData> extends TypeAdapter<LoaderCollection<T>> {
@Override @Override
public void write(JsonWriter out, LoaderCollection<? extends SavedData> value) throws IOException { public void write(JsonWriter out, LoaderCollection<T> value) throws IOException {
out.beginObject(); out.beginObject();
out.name("items"); out.name("items");
new Gson().toJson(value.idlist, new TypeToken<List<Long>>() { new Gson().toJson(value.idlist, new TypeToken<List<Long>>() {
@ -24,10 +24,9 @@ public class LoaderCollectionSerializer extends TypeAdapter<LoaderCollection<? e
out.endObject(); out.endObject();
} }
// @SuppressWarnings("unchecked")
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public LoaderCollection<? extends SavedData> read(JsonReader in) throws IOException { public LoaderCollection<T> read(JsonReader in) throws IOException {
in.beginObject(); in.beginObject();
in.nextName(); in.nextName();
List<Long> list = new Gson().fromJson(in, new TypeToken<List<Long>>() { List<Long> list = new Gson().fromJson(in, new TypeToken<List<Long>>() {
@ -36,15 +35,14 @@ public class LoaderCollectionSerializer extends TypeAdapter<LoaderCollection<? e
new Exception("Error: Next isn't \"class\"").printStackTrace(); new Exception("Error: Next isn't \"class\"").printStackTrace();
return null; return null;
} }
Class<? extends SavedData> cl; Class<T> cl;
try { try {
cl = (Class<? extends SavedData>) Class.forName(in.nextString()); cl = (Class<T>) Class.forName(in.nextString());
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
LoaderCollection<? extends SavedData> col = new LoaderCollection<SavedData>( LoaderCollection<T> col = new LoaderCollection<T>(cl); // TODO
(Class<SavedData>) cl); // TODO
col.idlist.addAll(list); col.idlist.addAll(list);
in.endObject(); in.endObject();
return col; return col;

View file

@ -1,5 +1,7 @@
package io.github.norbipeti.chat.server.data; package io.github.norbipeti.chat.server.data;
import java.io.Serializable;
import io.github.norbipeti.chat.server.db.domain.SavedData; import io.github.norbipeti.chat.server.db.domain.SavedData;
/** /**
@ -16,7 +18,8 @@ import io.github.norbipeti.chat.server.db.domain.SavedData;
* @param <T> * @param <T>
* The type of the stored object * The type of the stored object
*/ */
public class LoaderRef<T extends SavedData> { public class LoaderRef<T extends SavedData> implements Serializable {
private static final long serialVersionUID = 8458570738734235320L;
Class<T> cl; Class<T> cl;
Long id; Long id;

View file

@ -12,14 +12,13 @@ import com.google.gson.stream.JsonWriter;
import io.github.norbipeti.chat.server.db.domain.SavedData; import io.github.norbipeti.chat.server.db.domain.SavedData;
//@SuppressWarnings("rawtypes") //@SuppressWarnings("rawtypes")
public class LoaderRefSerializer extends TypeAdapter<LoaderRef<? extends SavedData>> { public class LoaderRefSerializer<T extends SavedData> extends TypeAdapter<LoaderRef<T>> {
@Override @Override
public void write(JsonWriter out, LoaderRef<? extends SavedData> value) throws IOException { public void write(JsonWriter out, LoaderRef<T> value) throws IOException {
out.beginObject(); out.beginObject();
out.name("items"); out.name("id");
new Gson().toJson(value.id, new TypeToken<List<Long>>() { out.value(value.id);
}.getType(), out);
out.name("class").value(value.cl.getName()); out.name("class").value(value.cl.getName());
out.endObject(); out.endObject();
} }
@ -27,24 +26,22 @@ public class LoaderRefSerializer extends TypeAdapter<LoaderRef<? extends SavedDa
// @SuppressWarnings("unchecked") // @SuppressWarnings("unchecked")
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public LoaderRef<? extends SavedData> read(JsonReader in) throws IOException { public LoaderRef<T> read(JsonReader in) throws IOException {
in.beginObject(); in.beginObject();
in.nextName(); in.nextName();
Long id = new Gson().fromJson(in, new TypeToken<Long>() { long id = in.nextLong();
}.getType());
if (!in.nextName().equals("class")) { if (!in.nextName().equals("class")) {
new Exception("Error: Next isn't \"class\"").printStackTrace(); new Exception("Error: Next isn't \"class\"").printStackTrace();
return null; return null;
} }
Class<? extends SavedData> cl; Class<T> cl;
try { try {
cl = (Class<? extends SavedData>) Class.forName(in.nextString()); cl = (Class<T>) Class.forName(in.nextString());
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
LoaderRef<? extends SavedData> col = new LoaderRef<SavedData>( LoaderRef<T> col = new LoaderRef<T>(cl, id); // TODO
(Class<SavedData>) cl, id); // TODO
in.endObject(); in.endObject();
return col; return col;
} }

View file

@ -17,21 +17,25 @@ public class Message implements Serializable {
// private Long id; // private Long id;
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
// @JoinTable(name="user_message") // @JoinTable(name="user_message")
private User sender; private LoaderRef<User> sender;
private Date time; private Date time;
private String message; private String message;
@ManyToOne(fetch = FetchType.EAGER) @ManyToOne(fetch = FetchType.EAGER)
// @JoinTable(name="conversation_message") // @JoinTable(name="conversation_message")
private LoaderRef<MessageChunk> messagechunk; private LoaderRef<MessageChunk> messagechunk;
public User getSender() { public LoaderRef<User> getSender() {
return sender; return sender;
} }
public void setSender(User sender) { public void setSender(LoaderRef<User> sender) {
this.sender = sender; this.sender = sender;
} }
public void setSender(User sender) {
this.sender = new LoaderRef<User>(sender);
}
public Date getTime() { public Date getTime() {
return time; return time;
} }
@ -56,6 +60,10 @@ public class Message implements Serializable {
this.messagechunk = messagechunk; this.messagechunk = messagechunk;
} }
public void setMessageChunk(MessageChunk messagechunk) {
this.messagechunk = new LoaderRef<MessageChunk>(messagechunk);
}
/* /*
* public Long getId() { return id; } * public Long getId() { return id; }
* *

View file

@ -26,4 +26,8 @@ public class MessageChunk extends SavedData {
public void setConversation(LoaderRef<Conversation> conversation) { public void setConversation(LoaderRef<Conversation> conversation) {
this.conversation = conversation; this.conversation = conversation;
} }
public void setConversation(Conversation conversation) {
this.conversation = new LoaderRef<Conversation>(conversation);
}
} }

View file

@ -11,6 +11,7 @@ import io.github.norbipeti.chat.server.IOHelper;
import io.github.norbipeti.chat.server.data.DataManager; import io.github.norbipeti.chat.server.data.DataManager;
import io.github.norbipeti.chat.server.db.domain.Conversation; import io.github.norbipeti.chat.server.db.domain.Conversation;
import io.github.norbipeti.chat.server.db.domain.Message; import io.github.norbipeti.chat.server.db.domain.Message;
import io.github.norbipeti.chat.server.db.domain.MessageChunk;
import io.github.norbipeti.chat.server.db.domain.User; import io.github.norbipeti.chat.server.db.domain.User;
public class IndexPage extends Page { public class IndexPage extends Page {
@ -46,12 +47,15 @@ public class IndexPage extends Page {
cide.attr("id", "convidp"); cide.attr("id", "convidp");
cide.text(Long.toString(conv.getId())); cide.text(Long.toString(conv.getId()));
LogManager.getLogger().log(Level.INFO, "Messages: " + conv.getMesssageChunks().size()); LogManager.getLogger().log(Level.INFO, "Messages: " + conv.getMesssageChunks().size());
for (Message message : conv.getMesssageChunks()) { for (MessageChunk chunk : conv.getMesssageChunks()) { // TODO:
Element msgelement = channelmessages.appendElement("div"); //TODO: Save messages in conversation files // Reverse
Element header = msgelement.appendElement("p"); for (Message message : chunk.getMessages()) {
header.text(message.getSender().getName() + " - " + message.getTime()); Element msgelement = channelmessages.appendElement("div");
Element body = msgelement.appendElement("p"); Element header = msgelement.appendElement("p");
body.text(message.getMessage()); header.text(message.getSender().get().getName() + " - " + message.getTime());
Element body = msgelement.appendElement("p");
body.text(message.getMessage());
}
} }
return doc; return doc;
}, exchange); }, exchange);

View file

@ -12,6 +12,7 @@ import io.github.norbipeti.chat.server.data.DataManager;
import io.github.norbipeti.chat.server.data.LoaderCollection; import io.github.norbipeti.chat.server.data.LoaderCollection;
import io.github.norbipeti.chat.server.db.domain.Conversation; import io.github.norbipeti.chat.server.db.domain.Conversation;
import io.github.norbipeti.chat.server.db.domain.Message; import io.github.norbipeti.chat.server.db.domain.Message;
import io.github.norbipeti.chat.server.db.domain.MessageChunk;
import io.github.norbipeti.chat.server.db.domain.User; import io.github.norbipeti.chat.server.db.domain.User;
public class MessageAjaxPage extends Page { public class MessageAjaxPage extends Page {
@ -66,15 +67,20 @@ public class MessageAjaxPage extends Page {
+ conversation + " is not found.</p>", exchange); + conversation + " is not found.</p>", exchange);
return; return;
} }
MessageChunk chunk = new MessageChunk(); // TODO: Automatize
chunk.setConversation(conv);
Message msg = new Message(); Message msg = new Message();
msg.setSender(user); msg.setSender(user);
msg.setMessage(message); msg.setMessage(message);
msg.setTime(new Date()); msg.setTime(new Date());
msg.setConversation(conv); // TODO: Store relations at one side or both msg.setMessageChunk(chunk); // TODO: Store relations at one side or
DataManager.save(msg); // both);
conv.getMesssageChunks().add(msg); chunk.getMessages().add(msg);
//DataManager.save(chunk); - TODO
conv.getMesssageChunks().add(chunk);
DataManager.save(conv); DataManager.save(conv);
LogManager.getLogger().log(Level.DEBUG, "Added conversation's message count: " + conv.getMesssageChunks().size()); LogManager.getLogger().log(Level.DEBUG,
"Added conversation's message count: " + conv.getMesssageChunks().size());
IOHelper.SendResponse(200, "Success", exchange); IOHelper.SendResponse(200, "Success", exchange);
} }