Initial import (partially)

This commit is contained in:
2013-11-24 12:13:27 +01:00
parent 2082b0bba6
commit 8681fe2548
27 changed files with 677 additions and 168 deletions

View File

@@ -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) {

View File

@@ -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());
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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();
}
}

View File

@@ -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 + '\'' +
'}';
}
}

View File

@@ -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());
}
}

View File

@@ -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<String, UserSession> userSessionMap = new HashMap<String, UserSession>();
@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());
}
}

View File

@@ -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<String, String> content = new HashMap<String, String>();
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
public Map<String, String> getContent() {
return content;
}
public void setContent(Map<String, String> content) {
this.content = content;
}
}

View File

@@ -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
}

View File

@@ -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;
}
}

View File

@@ -24,6 +24,6 @@
<servlet-mapping>
<servlet-name>RESTEasy JSAPI</servlet-name>
<url-pattern>/rest/js</url-pattern>
<url-pattern>/rest/rest.js</url-pattern>
</servlet-mapping>
</web-app>