From 8681fe2548ddbe8420cc1f025bc719ee11d32a4d Mon Sep 17 00:00:00 2001 From: Dansen999 Date: Sun, 24 Nov 2013 12:13:27 +0100 Subject: [PATCH] Initial import (partially) --- doc/info.txt | 2 + .../java/org/migor/core/beans/UserBean.java | 9 ++ .../migor/core/cache/UserSessionCache.java | 31 +++++ .../org/migor/core/models/internal/User.java | 36 +++++ .../java/org/migor/core/utils/JsonParser.java | 21 +++ .../main/java/org/migor/service/Response.java | 5 +- .../service/listeners/SessionListener.java | 7 + .../configuration/JsonConfiguration.java | 2 +- .../configuration/JsonExceptionMapper.java | 2 +- .../configuration/ServiceApplication.java | 4 +- .../migor/service/rest/user/UserService.java | 48 +++++++ .../service/rest/user/in/UserCredentials.java | 28 ++++ .../org/migor/service/sockets/EchoSocket.java | 40 ++++++ .../service/sockets/GlobalChatSocket.java | 113 ++++++++++++++++ .../migor/service/sockets/data/Message.java | 39 ++++++ .../org/migor/service/sockets/data/Type.java | 13 ++ .../service/sockets/data/UserSession.java | 30 ++++ .../src/main/webapp/WEB-INF/web.xml | 2 +- .../java/org/migor/shared/StatusCode.java | 14 +- .../src/main/webapp/index.jsp | 2 +- .../src/main/webapp/js/rest.js | 4 +- .../src/main/webapp/chat.jsp | 59 ++------ .../src/main/webapp/css/migor-mobile.css | 13 ++ .../src/main/webapp/index.jsp | 128 ++++++++++++++---- .../src/main/webapp/js/rest.js | 115 ++++++++++++++++ .../src/main/webapp/js/widget/widget-chat.js | 51 ------- .../webapp/js/widget/widget-migorMobile.js | 27 ---- 27 files changed, 677 insertions(+), 168 deletions(-) create mode 100644 doc/info.txt create mode 100644 org.migor.core/src/main/java/org/migor/core/beans/UserBean.java create mode 100644 org.migor.core/src/main/java/org/migor/core/cache/UserSessionCache.java create mode 100644 org.migor.core/src/main/java/org/migor/core/models/internal/User.java create mode 100644 org.migor.core/src/main/java/org/migor/core/utils/JsonParser.java rename org.migor.service/src/main/java/org/migor/service/{ => rest}/configuration/JsonConfiguration.java (95%) rename org.migor.service/src/main/java/org/migor/service/{ => rest}/configuration/JsonExceptionMapper.java (94%) rename org.migor.service/src/main/java/org/migor/service/{ => rest}/configuration/ServiceApplication.java (74%) create mode 100644 org.migor.service/src/main/java/org/migor/service/rest/user/UserService.java create mode 100644 org.migor.service/src/main/java/org/migor/service/rest/user/in/UserCredentials.java create mode 100644 org.migor.service/src/main/java/org/migor/service/sockets/EchoSocket.java create mode 100644 org.migor.service/src/main/java/org/migor/service/sockets/GlobalChatSocket.java create mode 100644 org.migor.service/src/main/java/org/migor/service/sockets/data/Message.java create mode 100644 org.migor.service/src/main/java/org/migor/service/sockets/data/Type.java create mode 100644 org.migor.service/src/main/java/org/migor/service/sockets/data/UserSession.java create mode 100644 org.migor.webclient.mobile/src/main/webapp/js/rest.js delete mode 100644 org.migor.webclient.mobile/src/main/webapp/js/widget/widget-chat.js delete mode 100644 org.migor.webclient.mobile/src/main/webapp/js/widget/widget-migorMobile.js diff --git a/doc/info.txt b/doc/info.txt new file mode 100644 index 0000000..789db61 --- /dev/null +++ b/doc/info.txt @@ -0,0 +1,2 @@ +User: admin + Password: CvCJzU-5bY8s diff --git a/org.migor.core/src/main/java/org/migor/core/beans/UserBean.java b/org.migor.core/src/main/java/org/migor/core/beans/UserBean.java new file mode 100644 index 0000000..3072616 --- /dev/null +++ b/org.migor.core/src/main/java/org/migor/core/beans/UserBean.java @@ -0,0 +1,9 @@ +package org.migor.core.beans; + +/** + * @author Daniel Scheidle + * @since 11/23/13 9:13 PM + */ +public class UserBean { + +} diff --git a/org.migor.core/src/main/java/org/migor/core/cache/UserSessionCache.java b/org.migor.core/src/main/java/org/migor/core/cache/UserSessionCache.java new file mode 100644 index 0000000..bdf038e --- /dev/null +++ b/org.migor.core/src/main/java/org/migor/core/cache/UserSessionCache.java @@ -0,0 +1,31 @@ +package org.migor.core.cache; + +import org.migor.core.models.internal.User; + +import javax.ejb.Singleton; +import javax.ejb.Startup; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Daniel Scheidle + * @since 11/23/13 9:14 PM + */ +@Startup +@Singleton +public class UserSessionCache { + + private Map userMap = new HashMap(); + + public void add(User user) { + userMap.put(user.getSessionId(), user); + } + + public User get(String sessionId) { + return userMap.get(sessionId); + } + + public void remove(String sessionId) { + userMap.remove(sessionId); + } +} \ No newline at end of file diff --git a/org.migor.core/src/main/java/org/migor/core/models/internal/User.java b/org.migor.core/src/main/java/org/migor/core/models/internal/User.java new file mode 100644 index 0000000..8ca00c6 --- /dev/null +++ b/org.migor.core/src/main/java/org/migor/core/models/internal/User.java @@ -0,0 +1,36 @@ +package org.migor.core.models.internal; + +/** + * @author Daniel Scheidle + * @since 11/23/13 9:13 PM + */ +public class User { + + private String sessionId; + + private String userName; + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @Override + public String toString() { + return "User{" + + "sessionId='" + sessionId + '\'' + + ", userName='" + userName + '\'' + + '}'; + } +} diff --git a/org.migor.core/src/main/java/org/migor/core/utils/JsonParser.java b/org.migor.core/src/main/java/org/migor/core/utils/JsonParser.java new file mode 100644 index 0000000..463f9a9 --- /dev/null +++ b/org.migor.core/src/main/java/org/migor/core/utils/JsonParser.java @@ -0,0 +1,21 @@ +package org.migor.core.utils; + +import org.codehaus.jackson.map.DeserializationConfig; +import org.codehaus.jackson.map.ObjectMapper; + +/** + * @author Daniel Scheidle + * @since 11/24/13 10:06 AM + */ +public class JsonParser { + + private JsonParser() { + + } + + public static ObjectMapper getObjectMapper() { + final ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return objectMapper; + } +} diff --git a/org.migor.service/src/main/java/org/migor/service/Response.java b/org.migor.service/src/main/java/org/migor/service/Response.java index c1d7e6d..f235962 100644 --- a/org.migor.service/src/main/java/org/migor/service/Response.java +++ b/org.migor.service/src/main/java/org/migor/service/Response.java @@ -19,7 +19,6 @@ public class Response { @JsonProperty("message") public String message; - //TODO format with timezone @JsonProperty("timestamp") public Date timestamp = new Date(); @@ -36,11 +35,11 @@ public class Response { } public static Response ok() { - return new Response(StatusCode.OK, null, null); + return new Response(StatusCode.OK, StatusCode.OK.getMessage(), null); } public static Response ok(@NotNull final Object content) { - return new Response(StatusCode.OK, null, content); + return new Response(StatusCode.OK, StatusCode.OK.getMessage(), content); } public static Response error(@NotNull final String message) { diff --git a/org.migor.service/src/main/java/org/migor/service/listeners/SessionListener.java b/org.migor.service/src/main/java/org/migor/service/listeners/SessionListener.java index 1dae713..0719b6d 100644 --- a/org.migor.service/src/main/java/org/migor/service/listeners/SessionListener.java +++ b/org.migor.service/src/main/java/org/migor/service/listeners/SessionListener.java @@ -1,8 +1,10 @@ package org.migor.service.listeners; import org.apache.log4j.Logger; +import org.migor.core.cache.UserSessionCache; +import javax.inject.Inject; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; @@ -15,6 +17,9 @@ public class SessionListener implements HttpSessionListener { private static final Logger logger = Logger.getLogger(SessionListener.class); + @Inject + private UserSessionCache userSessionCache; + @Override public void sessionCreated(HttpSessionEvent se) { if (logger.isDebugEnabled()) { @@ -27,5 +32,7 @@ public class SessionListener implements HttpSessionListener { if (logger.isDebugEnabled()) { logger.debug("Destroyed session " + se.getSession().getId()); } + + userSessionCache.remove(se.getSession().getId()); } } diff --git a/org.migor.service/src/main/java/org/migor/service/configuration/JsonConfiguration.java b/org.migor.service/src/main/java/org/migor/service/rest/configuration/JsonConfiguration.java similarity index 95% rename from org.migor.service/src/main/java/org/migor/service/configuration/JsonConfiguration.java rename to org.migor.service/src/main/java/org/migor/service/rest/configuration/JsonConfiguration.java index 8f54cc7..55e9654 100644 --- a/org.migor.service/src/main/java/org/migor/service/configuration/JsonConfiguration.java +++ b/org.migor.service/src/main/java/org/migor/service/rest/configuration/JsonConfiguration.java @@ -1,4 +1,4 @@ -package org.migor.service.configuration; +package org.migor.service.rest.configuration; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig; diff --git a/org.migor.service/src/main/java/org/migor/service/configuration/JsonExceptionMapper.java b/org.migor.service/src/main/java/org/migor/service/rest/configuration/JsonExceptionMapper.java similarity index 94% rename from org.migor.service/src/main/java/org/migor/service/configuration/JsonExceptionMapper.java rename to org.migor.service/src/main/java/org/migor/service/rest/configuration/JsonExceptionMapper.java index 97fa8e5..6f4debc 100644 --- a/org.migor.service/src/main/java/org/migor/service/configuration/JsonExceptionMapper.java +++ b/org.migor.service/src/main/java/org/migor/service/rest/configuration/JsonExceptionMapper.java @@ -1,4 +1,4 @@ -package org.migor.service.configuration; +package org.migor.service.rest.configuration; import org.apache.log4j.Logger; import org.migor.core.MigorException; diff --git a/org.migor.service/src/main/java/org/migor/service/configuration/ServiceApplication.java b/org.migor.service/src/main/java/org/migor/service/rest/configuration/ServiceApplication.java similarity index 74% rename from org.migor.service/src/main/java/org/migor/service/configuration/ServiceApplication.java rename to org.migor.service/src/main/java/org/migor/service/rest/configuration/ServiceApplication.java index ae1f276..82a84a2 100644 --- a/org.migor.service/src/main/java/org/migor/service/configuration/ServiceApplication.java +++ b/org.migor.service/src/main/java/org/migor/service/rest/configuration/ServiceApplication.java @@ -1,4 +1,4 @@ -package org.migor.service.configuration; +package org.migor.service.rest.configuration; import javax.ws.rs.ApplicationPath; @@ -8,7 +8,7 @@ import javax.ws.rs.core.Application; * @author Daniel Scheidle * @since 11/4/13 10:20 PM */ -@ApplicationPath("/rest") +@ApplicationPath("/") public class ServiceApplication extends Application { diff --git a/org.migor.service/src/main/java/org/migor/service/rest/user/UserService.java b/org.migor.service/src/main/java/org/migor/service/rest/user/UserService.java new file mode 100644 index 0000000..2745dec --- /dev/null +++ b/org.migor.service/src/main/java/org/migor/service/rest/user/UserService.java @@ -0,0 +1,48 @@ +package org.migor.service.rest.user; + +import org.apache.log4j.Logger; +import org.migor.core.cache.UserSessionCache; +import org.migor.core.models.internal.User; +import org.migor.service.Response; +import org.migor.service.rest.user.in.UserCredentials; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; + + +/** + * @author Daniel Scheidle + * @since 11/23/13 7:40 PM + */ +@Path("/private/user") +public class UserService { + + private static final Logger logger = Logger.getLogger(UserService.class); + + @Inject + private UserSessionCache userSessionCache; + + @POST + @Path("/login") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response login(@Context HttpServletRequest httpServletRequest, final UserCredentials credentials) { + + + User user = new User(); + user.setSessionId(httpServletRequest.getSession().getId()); + user.setUserName(credentials.getUserName()); + + logger.info("Adding user " + user); + + userSessionCache.add(user); + + return Response.ok(); + } +} diff --git a/org.migor.service/src/main/java/org/migor/service/rest/user/in/UserCredentials.java b/org.migor.service/src/main/java/org/migor/service/rest/user/in/UserCredentials.java new file mode 100644 index 0000000..c5a6143 --- /dev/null +++ b/org.migor.service/src/main/java/org/migor/service/rest/user/in/UserCredentials.java @@ -0,0 +1,28 @@ +package org.migor.service.rest.user.in; + +import org.codehaus.jackson.annotate.JsonProperty; + +/** + * @author Daniel Scheidle + * @since 11/23/13 7:41 PM + */ +public class UserCredentials { + + @JsonProperty("userName") + private String userName; + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @Override + public String toString() { + return "UserCredentials{" + + "userName='" + userName + '\'' + + '}'; + } +} diff --git a/org.migor.service/src/main/java/org/migor/service/sockets/EchoSocket.java b/org.migor.service/src/main/java/org/migor/service/sockets/EchoSocket.java new file mode 100644 index 0000000..03a8d4d --- /dev/null +++ b/org.migor.service/src/main/java/org/migor/service/sockets/EchoSocket.java @@ -0,0 +1,40 @@ +package org.migor.service.sockets; + +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + +/** + * @author Daniel Scheidle + * @since 11/23/13 5:00 PM + */ +@ServerEndpoint("/socket/echo") +public class EchoSocket { + + private static final Logger logger = Logger.getLogger(EchoSocket.class); + + + @OnOpen + public void onConnectionOpen(Session session) { + logger.info("Connection opened ... " + session.getId()); + } + + @OnMessage + public String onMessage(String message) { + if (StringUtils.isBlank(message)) { + return "Please send message"; + } + return message; + } + + @OnClose + public void onConnectionClose(Session session) { + logger.info("Connection close .... " + session.getId()); + } + +} diff --git a/org.migor.service/src/main/java/org/migor/service/sockets/GlobalChatSocket.java b/org.migor.service/src/main/java/org/migor/service/sockets/GlobalChatSocket.java new file mode 100644 index 0000000..213c68f --- /dev/null +++ b/org.migor.service/src/main/java/org/migor/service/sockets/GlobalChatSocket.java @@ -0,0 +1,113 @@ +package org.migor.service.sockets; + +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.migor.core.utils.JsonParser; +import org.migor.service.sockets.data.Message; +import org.migor.service.sockets.data.Type; +import org.migor.service.sockets.data.UserSession; + + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Daniel Scheidle + * @since 11/23/13 5:00 PM + */ +@ServerEndpoint("/socket/chat/global") +public class GlobalChatSocket { + + private static final Logger logger = Logger.getLogger(GlobalChatSocket.class); + + + private static Map userSessionMap = new HashMap(); + + @OnOpen + public void onConnectionOpen(final Session session) { + logger.info("Connection opened for " + session.getId()); + + try { + session.getBasicRemote().sendText(""); + } catch (IOException e) { + logger.warn("Couldn't deliver message to " + session.getId() + ": " + e.getMessage(), e); + } + + } + + @OnMessage + public void onMessage(final Session session, final String message) { + try { + final Message m = JsonParser.getObjectMapper().readValue(message, Message.class); + + switch (m.getType()) { + case LOGIN: + UserSession userSession= new UserSession(); + userSession.setUserName(m.getContent().get(Message.FIELD_SENDER_NAME)); + userSession.setSession(session); + userSessionMap.put(session.getId(), userSession); + + Message loginMessage = new Message(); + loginMessage.setType(Type.LOGIN); + loginMessage.getContent().put(Message.FIELD_MESSAGE, "OK"); + _send(session, loginMessage); + + Message enteredMessage = new Message(); + enteredMessage.setType(Type.SERVER); + enteredMessage.getContent().put(Message.FIELD_MESSAGE, userSession.getUserName() + " entered the room."); + _sendAll(session, enteredMessage, session.getId()); + break; + case MSG: + _sendAll(session, m, session.getId()); + break; + case TOPIC: + Message welcomeMessage = new Message(); + welcomeMessage.setType(Type.TOPIC); + welcomeMessage.getContent().put(Message.FIELD_MESSAGE, "Welcome to Migor Chat. At the moment there are " + userSessionMap.size() + " users in this room."); + _send(session, welcomeMessage); + break; + } + + } catch (Exception e) { + logger.warn("Couldn't read message for " + session.getId() + ": " + e.getMessage(), e); + } + + } + + private void _send(final Session session, final Message message) { + try { + if (session.isOpen()) { + session.getBasicRemote().sendText(JsonParser.getObjectMapper().writeValueAsString(message)); + } + } catch (IOException e) { + logger.warn("Couldn't deliver message from " + session.getId() + ": " + e.getMessage(), e); + } + } + + private void _sendAll(final Session session, final Message message, final String except) { + for (Session s : session.getOpenSessions()) { + if (!StringUtils.equals(except, s.getId())) { + _send(s, message); + } + } + } + + @OnClose + public void onConnectionClose(final Session session) { + logger.info("Connection closed for " + session.getId()); + + Message enteredMessage = new Message(); + enteredMessage.setType(Type.SERVER); + enteredMessage.getContent().put(Message.FIELD_MESSAGE, userSessionMap.get(session.getId()).getUserName() + " left the room."); + _sendAll(session, enteredMessage, session.getId()); + + userSessionMap.remove(session.getId()); + } + +} diff --git a/org.migor.service/src/main/java/org/migor/service/sockets/data/Message.java b/org.migor.service/src/main/java/org/migor/service/sockets/data/Message.java new file mode 100644 index 0000000..4553d81 --- /dev/null +++ b/org.migor.service/src/main/java/org/migor/service/sockets/data/Message.java @@ -0,0 +1,39 @@ +package org.migor.service.sockets.data; + +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Daniel Scheidle + * @since 11/23/13 5:33 PM + */ +public class Message { + + public static final String FIELD_SENDER_NAME = "senderName"; + public static final String FIELD_MESSAGE = "message"; + + @JsonProperty("type") + private Type type; + + @JsonProperty("content") + private Map content = new HashMap(); + + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + public Map getContent() { + return content; + } + + public void setContent(Map content) { + this.content = content; + } +} diff --git a/org.migor.service/src/main/java/org/migor/service/sockets/data/Type.java b/org.migor.service/src/main/java/org/migor/service/sockets/data/Type.java new file mode 100644 index 0000000..b8c8f78 --- /dev/null +++ b/org.migor.service/src/main/java/org/migor/service/sockets/data/Type.java @@ -0,0 +1,13 @@ +package org.migor.service.sockets.data; + +/** + * @author Daniel Scheidle + * @since 11/23/13 5:35 PM + */ +public enum Type { + + MSG, + LOGIN, + SERVER, + TOPIC +} diff --git a/org.migor.service/src/main/java/org/migor/service/sockets/data/UserSession.java b/org.migor.service/src/main/java/org/migor/service/sockets/data/UserSession.java new file mode 100644 index 0000000..22f3d19 --- /dev/null +++ b/org.migor.service/src/main/java/org/migor/service/sockets/data/UserSession.java @@ -0,0 +1,30 @@ +package org.migor.service.sockets.data; + +import javax.websocket.Session; + +/** + * @author Daniel Scheidle + * @since 11/24/13 10:14 AM + */ +public class UserSession { + + private String userName; + + private Session session; + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Session getSession() { + return session; + } + + public void setSession(Session session) { + this.session = session; + } +} diff --git a/org.migor.service/src/main/webapp/WEB-INF/web.xml b/org.migor.service/src/main/webapp/WEB-INF/web.xml index 8d0e72b..467e617 100644 --- a/org.migor.service/src/main/webapp/WEB-INF/web.xml +++ b/org.migor.service/src/main/webapp/WEB-INF/web.xml @@ -24,6 +24,6 @@ RESTEasy JSAPI - /rest/js + /rest/rest.js diff --git a/org.migor.shared/src/main/java/org/migor/shared/StatusCode.java b/org.migor.shared/src/main/java/org/migor/shared/StatusCode.java index 506048d..e4d6542 100644 --- a/org.migor.shared/src/main/java/org/migor/shared/StatusCode.java +++ b/org.migor.shared/src/main/java/org/migor/shared/StatusCode.java @@ -6,17 +6,23 @@ package org.migor.shared; */ public enum StatusCode { - OK(0), - ERROR(1), - PERMISSION_DENIED(2); + OK(0, "ok"), + ERROR(1, "error"), + PERMISSION_DENIED(2, "permission denied"); private int code; + private String message; - private StatusCode(int code) { + private StatusCode(int code, String message) { this.code = code; + this.message = message; } public int getCode() { return code; } + + public String getMessage() { + return message; + } } diff --git a/org.migor.webclient.admin/src/main/webapp/index.jsp b/org.migor.webclient.admin/src/main/webapp/index.jsp index cc27846..fd04f3c 100644 --- a/org.migor.webclient.admin/src/main/webapp/index.jsp +++ b/org.migor.webclient.admin/src/main/webapp/index.jsp @@ -28,7 +28,7 @@ <%-- ############### JS ############### --%> <%-- RESReasy Stub; on this userLocation you can find all js requst methods generated by RESTeasy --%> <%--suppress JspAbsolutePathInspection, HtmlUnknownTarget --%> - + <%-- Plugins --%> diff --git a/org.migor.webclient.admin/src/main/webapp/js/rest.js b/org.migor.webclient.admin/src/main/webapp/js/rest.js index cf2f800..83236af 100644 --- a/org.migor.webclient.admin/src/main/webapp/js/rest.js +++ b/org.migor.webclient.admin/src/main/webapp/js/rest.js @@ -1,4 +1,4 @@ -migor.rest = new function () { +rest = new function () { /** * @@ -42,7 +42,7 @@ migor.rest = new function () { break; } } else { - migor.dialog.openErrorDialog(code + ': ' + request.responseText); + //dialog.openErrorDialog(code + ': ' + request.responseText); } }; diff --git a/org.migor.webclient.mobile/src/main/webapp/chat.jsp b/org.migor.webclient.mobile/src/main/webapp/chat.jsp index 18a951e..fbaab1a 100644 --- a/org.migor.webclient.mobile/src/main/webapp/chat.jsp +++ b/org.migor.webclient.mobile/src/main/webapp/chat.jsp @@ -1,71 +1,38 @@ -<%@ page import="java.util.Date" %> - Migor Location Chat + - <% - String buildDate = "${timestamp}"; - %> + + - - - - - <%-- Plugins --%> - - - - - - - - - - - + + -
+
-
-

Migor Location Chat

+
+

Migor Chat

-
+
+
- +
- +
+
diff --git a/org.migor.webclient.mobile/src/main/webapp/css/migor-mobile.css b/org.migor.webclient.mobile/src/main/webapp/css/migor-mobile.css index 98c5255..7c1bf9c 100644 --- a/org.migor.webclient.mobile/src/main/webapp/css/migor-mobile.css +++ b/org.migor.webclient.mobile/src/main/webapp/css/migor-mobile.css @@ -6,4 +6,17 @@ right: 0; bottom: 0; left: 0; +} + +#chat-content .userName { + font-style: normal; + font-weight: bold; + font-size: larger; +} + +#chat-content .userName.own { + font-style: normal; + font-weight: bold; + font-size: larger; + color: #00415e; } \ No newline at end of file diff --git a/org.migor.webclient.mobile/src/main/webapp/index.jsp b/org.migor.webclient.mobile/src/main/webapp/index.jsp index 6bf7545..461a5fe 100644 --- a/org.migor.webclient.mobile/src/main/webapp/index.jsp +++ b/org.migor.webclient.mobile/src/main/webapp/index.jsp @@ -4,6 +4,8 @@ Migor Location Chat + + <% long buildDate = new Date().getTime(); %> @@ -12,61 +14,129 @@ <%-- Plugins --%> + + + - - -
+
-
-

Migor Location Chat

+
+

Migor Chat

- +

- +

diff --git a/org.migor.webclient.mobile/src/main/webapp/js/rest.js b/org.migor.webclient.mobile/src/main/webapp/js/rest.js new file mode 100644 index 0000000..8abd02d --- /dev/null +++ b/org.migor.webclient.mobile/src/main/webapp/js/rest.js @@ -0,0 +1,115 @@ +rest = new function () { + + /** + * + * @param restFunc + * @param [params] + * @param [successCallback] + * @param [validationCallback] + */ + this.request = function (restFunc, params, successCallback, validationCallback) { + + if (typeof(restFunc) === 'function') { + + if (params == null) { + params = {}; + } + + + params["$callback"] = function (code, request, response) { +// var response = ; + + if (response != null && response.status != null) { + switch (response.status) { + // Status OK + case 0: + if (typeof(successCallback) === 'function') { + successCallback.call(this, response.content, response.totalRecords) + } + break; + // Validation error + case 100: + if (typeof(validationCallback) === 'function') { + validationCallback.call(this, response.affectedFields) + } + break; + // Other errors + default : + // TODO + break; + } + } else { + migor.dialog.openErrorDialog(code + ': ' + request.responseText); + } + + }; + + restFunc.call(this, params); + } + }; + + + + /** + * + * @param url + * @param urlReplacements + * @returns {*} + */ + this.replaceInUrl = function (url, urlReplacements) { + var self = this; + + if (urlReplacements == null) + return url; + for (var key in urlReplacements) { + //noinspection JSUnfilteredForInLoop + var value = urlReplacements[key]; + if (value == null || value == "") { + //noinspection JSUnfilteredForInLoop + url = url.replace(key, " "); + } + else { + //noinspection JSUnfilteredForInLoop + url = url.replace(key, self.urlEncodePathParameter(value)); + } + } + return url; + }; + + /** + * Encode special characters which are known to + * cause problems when used in an URL as path + * parameter + * + * @param value string to encode + */ + this.urlEncodePathParameter = function (value) { + + // be on the safe side + if (value == null) { + return null; + } + var _value = '' + value; + + var encodeMe = { + "?": "%3F", + "%": "%25", + "/": "%2F" + }; + var result = ""; + for (var i = 0; i < _value.length; i++) { + result += encodeMe[_value.charAt(i)] == undefined ? _value.charAt(i) : encodeMe[_value.charAt(i)]; + } + return result; + }; + + this.block = function () { + $.blockUI({ message: $('#block'), css: { position: 'relative', top: '0px', left: '0px', width: '100%', height: '100%', 'vertical-align': 'middle', background: 'none', color: '#fff'} }); + }; + + this.unblock = function () { + $.unblockUI(); + }; + + +}; diff --git a/org.migor.webclient.mobile/src/main/webapp/js/widget/widget-chat.js b/org.migor.webclient.mobile/src/main/webapp/js/widget/widget-chat.js deleted file mode 100644 index 8c29bcd..0000000 --- a/org.migor.webclient.mobile/src/main/webapp/js/widget/widget-chat.js +++ /dev/null @@ -1,51 +0,0 @@ -$.widget("migor.chat", { - - socket: null, - - options: { - endpoint: '/migor/services/client/socket/chat' - }, - _create: function () { - var self = this; - - - if (window.WebSocket) { - var endpoint = 'ws://192.168.0.18:8080' + self.options.endpoint; - - self.socket = new WebSocket(endpoint); - self.socket.onmessage = function (event) { - self._onMessage(event.data); - }; - self.socket.onerror = function (event) { - self.element.prepend('

Cannot connect to web socket!!

'); - }; - } else { - self.element.prepend('

Web sockets are not supported!!

'); - } - - }, - _destroy: function () { - var self = this; - - if (self.socket) { - self.socket.close(); - self.socket = null; - } - }, - _setOptions: function () { - this._superApply(arguments); - }, - _onMessage: function (message) { - var self = this; - - self.element.prepend('

' + message + '

'); - }, - send: function (message) { - var self = this; - - if (self.socket) { - self.socket.send(message); - } - } -}); - diff --git a/org.migor.webclient.mobile/src/main/webapp/js/widget/widget-migorMobile.js b/org.migor.webclient.mobile/src/main/webapp/js/widget/widget-migorMobile.js deleted file mode 100644 index cda5aab..0000000 --- a/org.migor.webclient.mobile/src/main/webapp/js/widget/widget-migorMobile.js +++ /dev/null @@ -1,27 +0,0 @@ -$.widget("migor.mobile", { - - user: null, - - options: { - - }, - _create: function () { - var self = this; - - if (!self.user) { - - var loginTextField = $('').textinput({ preventFocusZoom: true }); - var loginButton = $('Start').buttonMarkup(); - - self.element.empty(); - self.element.append($('

').append('
 
')); - self.element.append($('

').append(loginTextField)); - self.element.append($('

').append(loginButton)); - } - - }, - _setOptions: function () { - this._superApply(arguments); - } -}); -