mirror of
https://github.com/Dansen999/migor.git
synced 2026-01-11 05:24:16 +00:00
Initial import (partially)
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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 + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user