Message listener in progress (along with a refactoring)

This commit is contained in:
Norbi Peti 2016-08-11 12:28:36 +02:00
parent 7565c4fc96
commit bbc8121968
13 changed files with 78 additions and 45 deletions

View file

@ -5,7 +5,8 @@
<script src="js/jquery-3.1.0.js"></script> <script src="js/jquery-3.1.0.js"></script>
<script src="js/moment-with-locales.js" charset="UTF-8"></script> <script src="js/moment-with-locales.js" charset="UTF-8"></script>
<script src="js/utils.js"></script> <script src="js/utils.js"></script>
<script src="js/message.js"></script> <script src="js/sendmessage.js"></script>
<script src="js/receivemessage.js"></script>
<script src="js/login.js"></script> <script src="js/login.js"></script>
<script src="js/register.js"></script> <script src="js/register.js"></script>
<link rel="stylesheet" href="css/style.css"/> <link rel="stylesheet" href="css/style.css"/>

View file

@ -18,7 +18,6 @@ $(document).ready(function () {
console.log(ctime.innerText); console.log(ctime.innerText);
if (ctime != null) if (ctime != null)
ctime.innerText = moment(ctime.innerText, "YYYY-MM-DDTHH:mm:ssZ").fromNow(); //.format("lll"); ctime.innerText = moment(ctime.innerText, "YYYY-MM-DDTHH:mm:ssZ").fromNow(); //.format("lll");
//ctime.innerText = new Date(ctime.innerText * 1).toDateString();
} }
cmsgs.lastElementChild.scrollIntoView(false); cmsgs.lastElementChild.scrollIntoView(false);
} }

View file

@ -0,0 +1,7 @@
(function poll() {
setTimeout(function() {
$.ajax({ url: "/receivemessage", success: function(data) {
}, dataType: "json", complete: poll });
}, 100);
})();

View file

@ -15,9 +15,7 @@ var respfunc = function respfunc(result) {
sendmsg(msginput); sendmsg(msginput);
} }
else { else {
var errormsg = document.getElementById("errormsg"); showError.
errormsg.innerHTML = result.responseText;
errormsg.style = "display: block"; //TODO: Hide errormsg after a while (index.js)
msginput.disabled = false; msginput.disabled = false;
} }
} }

View file

@ -1,13 +1,20 @@
/** /**
* Created by Norbi on 2016-07-27. * Created by Norbi on 2016-07-27.
*/ */
function getFormData($form) { function getFormData($form) {
var unindexed_array = $form.serializeArray(); var unindexed_array = $form.serializeArray();
var indexed_array = {}; var indexed_array = {};
$.map(unindexed_array, function (n, i) { $.map(unindexed_array, function (n, i) {
indexed_array[n['name']] = n['value']; indexed_array[n['name']] = n['value'];
}); });
return indexed_array; return indexed_array;
} }
function showError(message) {
var errormsg = document.getElementById("errormsg");
errormsg.innerHTML = result.responseText;
errormsg.style = "display: block";
setTimeout(function(){errormsg.style.display="none";}, 2000);
}

View file

@ -8,11 +8,10 @@ import io.github.norbipeti.chat.server.data.LoaderCollection;
@Table(name = "CONVERSATION") @Table(name = "CONVERSATION")
public class Conversation extends SavedData { public class Conversation extends SavedData {
private static final long serialVersionUID = 5058682475353799722L; private static final long serialVersionUID = 5058682475353799722L;
private static Long nextid = 0L;
// @Id // @Id
// @GeneratedValue(strategy = GenerationType.IDENTITY) // @GeneratedValue(strategy = GenerationType.IDENTITY)
// @Column(name = "ID", unique = true, nullable = false) // @Column(name = "ID", unique = true, nullable = false)
private Long id = nextid++; private Long id;
@ElementCollection(fetch = FetchType.EAGER) @ElementCollection(fetch = FetchType.EAGER)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "conversation") @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "conversation")
private LoaderCollection<MessageChunk> messsagechunks = new LoaderCollection<>(MessageChunk.class); private LoaderCollection<MessageChunk> messsagechunks = new LoaderCollection<>(MessageChunk.class);
@ -53,4 +52,8 @@ public class Conversation extends SavedData {
private Conversation() { private Conversation() {
} }
@Override
protected void init() {
}
} }

View file

@ -10,11 +10,13 @@ import io.github.norbipeti.chat.server.data.LoaderRef;
@Entity @Entity
@Table(name = "MESSAGE") @Table(name = "MESSAGE")
public class Message implements Serializable { public class Message implements Serializable {
private static final int MESSAGE_LIMIT_PER_CHUNK = 50;
private static final long serialVersionUID = 6345941601716826570L; private static final long serialVersionUID = 6345941601716826570L;
private static Long nextid = 0L;
// @Id // @Id
// @GeneratedValue(strategy = GenerationType.IDENTITY) // @GeneratedValue(strategy = GenerationType.IDENTITY)
// @Column(name = "ID", unique = true, nullable = false) // @Column(name = "ID", unique = true, nullable = false)
// private Long id; private Long id = nextid++;
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
// @JoinTable(name="user_message") // @JoinTable(name="user_message")
private LoaderRef<User> sender; private LoaderRef<User> sender;
@ -64,7 +66,28 @@ public class Message implements Serializable {
this.messagechunk = new LoaderRef<MessageChunk>(messagechunk); this.messagechunk = new LoaderRef<MessageChunk>(messagechunk);
} }
/* public Long getId() {
* public Long getId() { return id; } public void setId(Long id) { this.id = id; } return id;
*/ }
public void setId(Long id) {
this.id = id;
}
private Message() {
}
public static Message create(Conversation parent) {
Message msg = new Message();
int size = parent.getMesssageChunks().size();
MessageChunk chunk;
if (size == 0 || parent.getMesssageChunks().get(size - 1).getMessages().size() >= MESSAGE_LIMIT_PER_CHUNK) {
chunk = SavedData.create(MessageChunk.class);
chunk.setConversation(parent);
parent.getMesssageChunks().add(chunk);
} else
chunk = parent.getMesssageChunks().get(size - 1);
msg.setMessageChunk(chunk);
return msg;
}
} }

View file

@ -7,11 +7,11 @@ import io.github.norbipeti.chat.server.data.LoaderRef;
public class MessageChunk extends SavedData { public class MessageChunk extends SavedData {
private static final long serialVersionUID = -1665300779209348467L; private static final long serialVersionUID = -1665300779209348467L;
private static Long nextid = 0L;
private Long id = nextid++; private Long id;
private List<Message> messages = new ArrayList<>(); private List<Message> messages = new ArrayList<>();
private LoaderRef<Conversation> conversation; private LoaderRef<Conversation> conversation;
private Long nextmsgid = 0L;
public List<Message> getMessages() { public List<Message> getMessages() {
return messages; return messages;

View file

@ -11,10 +11,12 @@ public abstract class SavedData implements Serializable {
public abstract void setId(long id); public abstract void setId(long id);
protected abstract void init();
protected SavedData() { protected SavedData() {
} }
public static <T extends SavedData> T create(Class<T> cl) { static <T extends SavedData> T create(Class<T> cl) {
T obj; T obj;
try { try {
Constructor<T> constructor = cl.getDeclaredConstructor(new Class<?>[0]); Constructor<T> constructor = cl.getDeclaredConstructor(new Class<?>[0]);
@ -27,6 +29,7 @@ public abstract class SavedData implements Serializable {
} }
obj.setId(DataManager.getNextIDs().getOrDefault(obj.getClass(), 0L)); obj.setId(DataManager.getNextIDs().getOrDefault(obj.getClass(), 0L));
DataManager.setNextID(obj.getClass(), obj.getId() + 1); DataManager.setNextID(obj.getClass(), obj.getId() + 1);
obj.init();
DataManager.save(obj); DataManager.save(obj);
return obj; return obj;
} }

View file

@ -11,8 +11,7 @@ import io.github.norbipeti.chat.server.data.LoaderCollection;
@Table(name = "\"USER\"") @Table(name = "\"USER\"")
public class User extends SavedData { public class User extends SavedData {
private static final long serialVersionUID = 2862762084164225666L; private static final long serialVersionUID = 2862762084164225666L;
private static Long nextid = 0L; private Long id;
private Long id = nextid++;
private String name; private String name;
private String email; private String email;
private String password; private String password;
@ -109,4 +108,8 @@ public class User extends SavedData {
public void setId(long id) { public void setId(long id) {
this.id = id; this.id = id;
} }
public static User createUser() {
return SavedData.create(User.class);
}
} }

View file

@ -62,7 +62,7 @@ public class IOHelper {
} }
public static String ReadFile(File file) throws FileNotFoundException, IOException { public static String ReadFile(File file) throws FileNotFoundException, IOException {
String content = FileUtils.readFileToString(file, StandardCharsets.UTF_8); // TODO: FIx UTF-8 file reading String content = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
return content; return content;
} }

View file

@ -45,7 +45,7 @@ public class IndexPage extends Page {
if (user.getConversations().size() == 0) { if (user.getConversations().size() == 0) {
LoaderCollection<Conversation> convs = DataManager.getAll(Conversation.class); LoaderCollection<Conversation> convs = DataManager.getAll(Conversation.class);
if (convs.size() == 0) { if (convs.size() == 0) {
Conversation c = SavedData.create(Conversation.class); Conversation c = Conversation.create();
convs.add(c); // TODO: Handle no conversation open convs.add(c); // TODO: Handle no conversation open
} }
user.getConversations().add(convs.get(0)); user.getConversations().add(convs.get(0));

View file

@ -27,21 +27,10 @@ public class ReceiveMessageAjaxPage extends Page {
public void handlePage(HttpExchange exchange) throws IOException { public void handlePage(HttpExchange exchange) throws IOException {
User user = IOHelper.GetLoggedInUser(exchange); User user = IOHelper.GetLoggedInUser(exchange);
if (user == null) { if (user == null) {
IOHelper.SendResponse(403, "<p>Please log in to send messages</p>", exchange); IOHelper.SendResponse(403, "<p>Please log in to receive messages</p>", exchange);
return;
}
JsonObject obj = IOHelper.GetPOSTJSON(exchange);
if (obj == null) {
IOHelper.SendResponse(400, "JSONERROR: " + IOHelper.GetPOST(exchange), exchange);
return;
}
if (!obj.has("message") || !obj.has("conversation")) {
IOHelper.SendResponse(400,
"<h1>400 Bad request</h1><p>Message or conversation not found in JSON response.</p><p>"
+ IOHelper.GetPOST(exchange) + "</p>",
exchange);
return; return;
} }
JsonObject obj = new JsonObject();
String message = obj.get("message").getAsString().trim(); String message = obj.get("message").getAsString().trim();
int conversation = obj.get("conversation").getAsInt(); int conversation = obj.get("conversation").getAsInt();
if (message.trim().length() == 0) { if (message.trim().length() == 0) {