From a449dc84d0a20e8bc94c7ebd5bba8b82d7adc515 Mon Sep 17 00:00:00 2001 From: Julian Hochstetter <julian.hochstetter@mni.thm.de> Date: Wed, 12 Sep 2012 21:46:09 +0200 Subject: [PATCH] Task #3851: make the server a singleton and use p:property style remove websocketcontroller and let sessioncontroller do the authorization add toString to User entity --- .../de/thm/arsnova/SessionController.java | 26 ++++++++++++++ .../de/thm/arsnova/WebSocketController.java | 35 ------------------- .../java/de/thm/arsnova/entities/User.java | 4 +++ .../thm/arsnova/services/SessionService.java | 10 +++--- .../arsnova/socket/ARSnovaSocketIOServer.java | 2 -- .../webapp/WEB-INF/spring/spring-main.xml | 5 ++- 6 files changed, 38 insertions(+), 44 deletions(-) delete mode 100644 src/main/java/de/thm/arsnova/WebSocketController.java diff --git a/src/main/java/de/thm/arsnova/SessionController.java b/src/main/java/de/thm/arsnova/SessionController.java index 87460a3c0..cb6e9516d 100644 --- a/src/main/java/de/thm/arsnova/SessionController.java +++ b/src/main/java/de/thm/arsnova/SessionController.java @@ -20,8 +20,13 @@ package de.thm.arsnova; import javax.servlet.http.HttpServletResponse; +import net.sf.json.JSONObject; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -30,13 +35,34 @@ import org.springframework.web.bind.annotation.RequestMethod; import de.thm.arsnova.entities.Session; import de.thm.arsnova.services.ISessionService; +import de.thm.arsnova.services.IUserService; +import de.thm.arsnova.socket.ARSnovaSocketIOServer; @Controller public class SessionController { + public static final Logger logger = LoggerFactory.getLogger(SessionController.class); + @Autowired ISessionService sessionService; + @Autowired + IUserService userService; + + @Autowired + ARSnovaSocketIOServer server; + + @RequestMapping(method = RequestMethod.POST, value = "/authorize") + public void authorize(@RequestBody Object sessionObject, HttpServletResponse response) { + String sessionkey = (String) JSONObject.fromObject(sessionObject).get("session"); + if(sessionkey == null) { + return; + } + logger.info("authorize session: " + sessionkey + ", user is: " + userService.getUser(SecurityContextHolder.getContext().getAuthentication())); + boolean result = server.authorize(sessionkey, userService.getUser(SecurityContextHolder.getContext().getAuthentication())); + response.setStatus(result ? HttpStatus.CREATED.value() : HttpStatus.UNAUTHORIZED.value()); + } + @RequestMapping(value="/session/{sessionkey}", method=RequestMethod.GET) public Session getSession(@PathVariable String sessionkey, HttpServletResponse response) { Session session = sessionService.getSession(sessionkey); diff --git a/src/main/java/de/thm/arsnova/WebSocketController.java b/src/main/java/de/thm/arsnova/WebSocketController.java deleted file mode 100644 index 60e8876c7..000000000 --- a/src/main/java/de/thm/arsnova/WebSocketController.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.thm.arsnova; - -import javax.servlet.http.HttpServletResponse; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -import de.thm.arsnova.services.IUserService; -import de.thm.arsnova.socket.ARSnovaSocketIOServer; - -@Controller -public class WebSocketController { - - @Autowired - ARSnovaSocketIOServer server; - - @Autowired - IUserService userService; - - public static final Logger logger = LoggerFactory.getLogger(WebSocketController.class); - - @RequestMapping(method = RequestMethod.POST, value = "/authorize") - public void authorize(@RequestBody String session, HttpServletResponse response) { - boolean result = server.authorize(session, userService.getUser(SecurityContextHolder.getContext().getAuthentication())); - response.setStatus(result ? HttpStatus.CREATED.value() : HttpStatus.SERVICE_UNAVAILABLE.value()); - } - -} diff --git a/src/main/java/de/thm/arsnova/entities/User.java b/src/main/java/de/thm/arsnova/entities/User.java index 4f2863631..84d564ccb 100644 --- a/src/main/java/de/thm/arsnova/entities/User.java +++ b/src/main/java/de/thm/arsnova/entities/User.java @@ -42,5 +42,9 @@ public class User { public void setUsername(String username) { this.username = username; } + + public String toString() { + return "User, username: " + this.username; + } } diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java index f3bcf269a..29abd915f 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import net.sf.json.JSONObject; @@ -58,7 +57,7 @@ public class SessionService implements ISessionService { private Database database; - private Map<String, String> user2session = new ConcurrentHashMap<String, String>(); + private static final ConcurrentHashMap<String, String> user2session = new ConcurrentHashMap<String, String>(); public static final Logger logger = LoggerFactory.getLogger(SessionService.class); @@ -219,12 +218,15 @@ public class SessionService implements ISessionService { @Override public boolean isUserInSession(de.thm.arsnova.entities.User user, String keyword) { if (keyword == null) return false; - return (this.user2session.get(user.getUsername()).equals(keyword)); + String session = user2session.get(user.getUsername()); + if(session == null) return false; + return keyword.equals(session); } @Override + @Transactional(isolation=Isolation.READ_COMMITTED) public void addUserToSessionMap(String username, String keyword) { - this.user2session.put(username, keyword); + user2session.putIfAbsent(username, keyword); } private String getSessionId(String keyword) { diff --git a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java index e606cd445..b13de0ce9 100644 --- a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java +++ b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java @@ -51,14 +51,12 @@ public class ARSnovaSocketIOServer { new DataListener<Feedback>() { @Override public void onData(SocketIOClient client, Feedback data) { - logger.info("setFeedback.onData: Client: {}, message: {}", new Object[] {client, data}); User u = session2user.get(client.getSessionId().toString()); if(u == null || sessionService.isUserInSession(u, data.getSessionkey()) == false) { return; } sessionService.postFeedback(data.getSessionkey(), data.getValue(), u); de.thm.arsnova.entities.Feedback fb = sessionService.getFeedback(data.getSessionkey()); - logger.info("fb: {}", fb); server.getBroadcastOperations().sendEvent("updateFeedback", fb.getValues()); } }); diff --git a/src/main/webapp/WEB-INF/spring/spring-main.xml b/src/main/webapp/WEB-INF/spring/spring-main.xml index d46fe5909..d59b0ac63 100644 --- a/src/main/webapp/WEB-INF/spring/spring-main.xml +++ b/src/main/webapp/WEB-INF/spring/spring-main.xml @@ -26,8 +26,7 @@ <context:component-scan base-package="de.thm.arsnova" /> <context:annotation-config /> - <bean id="socketServer" class="de.thm.arsnova.socket.ARSnovaSocketIOServer" init-method="startServer" destroy-method="stopServer"> - <property name="portNumber" value="18018"></property> - </bean> + <bean id="socketServer" class="de.thm.arsnova.socket.ARSnovaSocketIOServer" init-method="startServer" destroy-method="stopServer" scope="singleton" + p:portNumber="18018" /> </beans> -- GitLab