diff --git a/src/themes/smalltalk.view b/src/themes/smalltalk.view
index 3557373..7d67733 100644
--- a/src/themes/smalltalk.view
+++ b/src/themes/smalltalk.view
@@ -347,6 +347,18 @@
$('#messages').append($li);
$('#list').animate({scrollTop: $('#messages').height()}, 'fast');
break;
+ case 'session-timeout':
+ $li = $("
");
+ $li.html("System Notification:\t" + $data.user + " left from this conversation.");
+ $('#messages').append($li);
+ $('#list').animate({scrollTop: $('#messages').height()}, 'fast');
+ break;
+ case 'expired':
+ $li = $("");
+ $li.html("System Notification:\tIt's an expired conversation, you have to refresh the current page or request a new meeting code.");
+ $('#messages').append($li);
+ $('#list').animate({scrollTop: $('#messages').height()}, 'fast');
+ break;
default:
timer.setAction(function(){
document.title = $_user + " is typing" + dotted;
@@ -369,26 +381,40 @@
data: { cmd: cmd }
}).done(function( msg ) {
if(msg.error == "missing user") {
- if (user) {
- $.ajax({
- type: "POST",
- url: "[%LINK:talk/start%]/"+ user
- }).done(function( msg ) {});
- }
- else {
- $("#modal").modal();
- }
- }
-
- if(msg.error == "expired") {
- if(confirm("The conversation is expired, Do you want to reload the conversation?")) {
- $.ajax({
- type: "POST",
- url: $('#link').text()
- }).done(function( msg ) {});
- }
- }
+ if (user) {
+ $.ajax({
+ type: "POST",
+ url: "[%LINK:talk/start%]/"+ user
+ }).done(function( msg ) {});
+ }
+ else {
+ $("#modal").modal();
+ }
+ }
}).fail(function( msg ) {
+ switch(msg.responseJSON.error) {
+ case 'session-timeout':
+ $li = $("");
+ $li.html("System Notification:\t" + $data.user + " left from this conversation.");
+ $('#messages').append($li);
+ $('#list').animate({scrollTop: $('#messages').height()}, 'fast');
+
+ if(confirm("Your session is timed out, Do you want to reload the conversation?")) {
+ $.ajax({
+ type: "POST",
+ url: $('#link').text()
+ }).done(function( msg ) {});
+ }
+ break;
+ case 'expired':
+ $li = $("");
+ $li.html("System Notification:\tIt's an expired conversation, you have to refresh the current page or request a new meeting code.");
+ $('#messages').append($li);
+ $('#list').animate({scrollTop: $('#messages').height()}, 'fast');
+ break;
+ default:break;
+ }
+
console.log('Fail.');
console.log(msg);
});
@@ -413,13 +439,22 @@
$.getJSON( "[%LINK:talk/update%]/{%meeting_code%}/{%session_id%}", function(data) {
update(data);
is_running = false;
- }).done(function() {
+ }).done(function( msg ) {
autoupdate();
is_running = false;
}).fail(function( msg ) {
- connection_timer.start();
- is_running = false;
- console.log(msg);
+ msg = msg.responseJSON;
+ if(msg.error == "expired") {
+ command("expired");
+ }
+ else if(msg.error == "session-timeout") {
+ command("session-timeout");
+ }
+ else {
+ connection_timer.start();
+ is_running = false;
+ console.log(msg);
+ }
});
}
}
@@ -630,7 +665,7 @@
-
+
@@ -673,7 +708,7 @@
diff --git a/src/tinystruct/examples/smalltalk.java b/src/tinystruct/examples/smalltalk.java
index d05d472..65b81b0 100644
--- a/src/tinystruct/examples/smalltalk.java
+++ b/src/tinystruct/examples/smalltalk.java
@@ -163,7 +163,7 @@ public String command() {
return this.save(meetingCode, builder);
}
-
+ response.setStatus(403);
return "{ \"error\": \"expired\" }";
}
@@ -173,25 +173,28 @@ public String save() {
response.setContentType("application/json");
final Object meetingCode = request.getSession().getAttribute("meeting_code");
- final String sessionId = request.getSession().getId();
- if ( meetingCode != null && sessions.get(meetingCode) != null && sessions.get(meetingCode).contains(sessionId)) {
- String message;
- if ((message = request.getParameter("text")) != null && !message.isEmpty()) {
- String[] agent = request.getHeader("User-Agent").split(" ");
- this.setVariable("browser", agent[agent.length - 1]);
-
- final SimpleDateFormat format = new SimpleDateFormat("yyyy-M-d h:m:s");
- final Builder builder = new Builder();
- builder.put("user", request.getSession().getAttribute("user"));
- builder.put("time", format.format(new Date()));
- builder.put("message", filter(message));
- builder.put("session_id", sessionId);
-
- return this.save(meetingCode, builder);
+ if (this.meetings.containsKey(meetingCode)) {
+ final String sessionId = request.getSession().getId();
+ if ( meetingCode != null && sessions.get(meetingCode) != null && sessions.get(meetingCode).contains(sessionId)) {
+ String message;
+ if ((message = request.getParameter("text")) != null && !message.isEmpty()) {
+ String[] agent = request.getHeader("User-Agent").split(" ");
+ this.setVariable("browser", agent[agent.length - 1]);
+
+ final SimpleDateFormat format = new SimpleDateFormat("yyyy-M-d h:m:s");
+ final Builder builder = new Builder();
+ builder.put("user", request.getSession().getAttribute("user"));
+ builder.put("time", format.format(new Date()));
+ builder.put("message", filter(message));
+ builder.put("session_id", sessionId);
+
+ return this.save(meetingCode, builder);
+ }
}
}
-
- return "{}";
+
+ response.setStatus(403);
+ return "{ \"error\": \"expired\" }";
}
public String update() throws ApplicationException, IOException {
@@ -201,14 +204,27 @@ public String update() throws ApplicationException, IOException {
if (meetingCode != null) {
return this.update(meetingCode.toString(), sessionId);
}
- return "";
+ final HttpServletResponse response = (HttpServletResponse) this.context.getAttribute("HTTP_RESPONSE");
+ response.setContentType("application/json");
+ response.setStatus(403);
+ return "{ \"error\": \"expired\" }";
}
public String update(String meetingCode, String sessionId) throws ApplicationException, IOException {
- if (sessions.get(meetingCode) != null && sessions.get(meetingCode).contains(sessionId)) {
- return this.update(sessionId);
+ if (this.meetings.containsKey(meetingCode)) {
+ if(sessions.get(meetingCode) != null && sessions.get(meetingCode).contains(sessionId)) {
+ return this.update(sessionId);
+ }
+ final HttpServletResponse response = (HttpServletResponse) this.context.getAttribute("HTTP_RESPONSE");
+ response.setContentType("application/json");
+ response.setStatus(403);
+ return "{ \"error\": \"session-timeout\" }";
}
- return "";
+
+ final HttpServletResponse response = (HttpServletResponse) this.context.getAttribute("HTTP_RESPONSE");
+ response.setContentType("application/json");
+ response.setStatus(403);
+ return "{ \"error\": \"expired\" }";
}
public String upload() throws ApplicationException {
@@ -307,16 +323,24 @@ public void sessionCreated(HttpSessionEvent arg0) {
public void sessionDestroyed(HttpSessionEvent arg0) {
Object meetingCode = arg0.getSession().getAttribute("meeting_code");
if ( meetingCode != null ) {
+ final SimpleDateFormat format = new SimpleDateFormat("yyyy-M-d h:m:s");
+ final Builder builder = new Builder();
+ builder.put("user", null);
+ builder.put("time", format.format(new Date()));
+ builder.put("cmd", "expired");
+ this.save(meetingCode, builder);
+
Queue messages;
List session_ids;
- synchronized (meetings) {
- if((session_ids = this.sessions.get(meetingCode)) != null)
- {
+ synchronized (meetings) {
+ if((session_ids = this.sessions.get(meetingCode)) != null) {
session_ids.remove(arg0.getSession().getId());
}
+
if ((messages = meetings.get(meetingCode)) != null) {
messages.remove(meetingCode);
}
+
meetings.notifyAll();
}