From c5ef88438a6715244b362e2c16f074d3d5e281ad Mon Sep 17 00:00:00 2001 From: Julian Hochstetter <julian.hochstetter@mni.thm.de> Date: Wed, 12 Sep 2012 10:49:35 +0200 Subject: [PATCH] Task #3851: initial netty-socket.io server --- pom.xml | 23 ++++- .../arsnova/socket/ARSnovaSocketIOServer.java | 87 +++++++++++++++++++ .../thm/arsnova/socket/message/Authorize.java | 24 +++++ .../thm/arsnova/socket/message/Feedback.java | 29 +++++++ .../webapp/WEB-INF/spring/spring-main.xml | 4 + src/main/webapp/WEB-INF/web.xml | 2 +- 6 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java create mode 100644 src/main/java/de/thm/arsnova/socket/message/Authorize.java create mode 100644 src/main/java/de/thm/arsnova/socket/message/Feedback.java diff --git a/pom.xml b/pom.xml index 744ab7c60..242420480 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ <url>http://maven.mni.thm.de/content/groups/public</url> </repository> <repository> - <id>sonatype-snapshots</id> + <id>sonatypesnapshots</id> <name>Sonatype Snapshot Repository</name> <url>https://oss.sonatype.org/content/repositories/snapshots/</url> </repository> @@ -138,6 +138,16 @@ <artifactId>spring-security-oauth-client</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency> + <dependency> + <groupId>io.netty</groupId> + <artifactId>netty</artifactId> + <version>3.5.7.Final</version> + </dependency> + <dependency> + <groupId>com.corundumstudio.socketio</groupId> + <artifactId>netty-socketio</artifactId> + <version>1.0.0-SNAPSHOT</version> + </dependency> </dependencies> <build> <plugins> @@ -154,6 +164,17 @@ <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>7.6.5.v20120716</version> + <!-- + <configuration> + <scanIntervalSeconds>5</scanIntervalSeconds> + <webApp> + <contextPath>/</contextPath> + <baseResource implementation="org.eclipse.jetty.util.resource.ResourceCollection"> + <resourcesAsCSV>src/main/webapp,../arsnova-js/src/main/webapp,../arsnova-legacy-js/src/main/webapp,../dojo-war/src/main/webapp</resourcesAsCSV> + </baseResource> + </webApp> + </configuration> + --> </plugin> </plugins> </build> diff --git a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java new file mode 100644 index 000000000..8363cca7d --- /dev/null +++ b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java @@ -0,0 +1,87 @@ +package de.thm.arsnova.socket; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Required; + +import com.corundumstudio.socketio.Configuration; +import com.corundumstudio.socketio.SocketIOClient; +import com.corundumstudio.socketio.SocketIOServer; +import com.corundumstudio.socketio.listener.ConnectListener; +import com.corundumstudio.socketio.listener.DataListener; +import com.corundumstudio.socketio.listener.DisconnectListener; + +import de.thm.arsnova.services.ISessionService; +import de.thm.arsnova.socket.message.Authorize; +import de.thm.arsnova.socket.message.Feedback; + +public class ARSnovaSocketIOServer { + + @Autowired + private ISessionService sessionService; + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + private int portNumber; + private final Configuration config; + private SocketIOServer server; + + + public ARSnovaSocketIOServer() { + config = new Configuration(); + } + + public void startServer() throws Exception { + config.setPort(portNumber); + config.setHostname("localhost"); + server = new SocketIOServer(config); + + server.addEventListener("setFeedback", Feedback.class, + new DataListener<Feedback>() { + @Override + public void onData(SocketIOClient client, Feedback data) { + logger.info("setFeedback.onData: Client: {}, message: {}", new Object[] {client, data}); + sessionService.postFeedback(data.getKeyword(), data.getValue()); + server.getBroadcastOperations().sendEvent("updateFeedback", data); + } + }); + + + + + server.addConnectListener(new ConnectListener() { + @Override + public void onConnect(SocketIOClient client) { + logger.info("addConnectListener.onConnect: Client: {}", new Object[] {client}); + } + }); + + server.addDisconnectListener(new DisconnectListener() { + @Override + public void onDisconnect(SocketIOClient client) { + logger.info("addDisconnectListener.onDisconnect: Client: {}", new Object[] {client}); + } + }); + + server.start(); + } + + public void stopServer() throws Exception { + logger.debug("In stopServer method of class: {}", getClass().getName()); + for(SocketIOClient client : server.getAllClients()) { + client.disconnect(); + } + server.stop(); + + } + + public int getPortNumber() { + return portNumber; + } + + @Required + public void setPortNumber(int portNumber) { + this.portNumber = portNumber; + } +} \ No newline at end of file diff --git a/src/main/java/de/thm/arsnova/socket/message/Authorize.java b/src/main/java/de/thm/arsnova/socket/message/Authorize.java new file mode 100644 index 000000000..7b0c4eeb8 --- /dev/null +++ b/src/main/java/de/thm/arsnova/socket/message/Authorize.java @@ -0,0 +1,24 @@ +package de.thm.arsnova.socket.message; + +public class Authorize { + private String user; + private String socketid; + public String getUser() { + return user; + } + public void setUser(String user) { + this.user = user; + } + public String getSocketid() { + return socketid; + } + public void setSocketid(String socketid) { + this.socketid = socketid; + } + + @Override + public String toString() { + return "user: " + user + ", socketid: " + socketid; + + } +} diff --git a/src/main/java/de/thm/arsnova/socket/message/Feedback.java b/src/main/java/de/thm/arsnova/socket/message/Feedback.java new file mode 100644 index 000000000..2cf8e6665 --- /dev/null +++ b/src/main/java/de/thm/arsnova/socket/message/Feedback.java @@ -0,0 +1,29 @@ +package de.thm.arsnova.socket.message; + +public class Feedback { + + private int value; + private String sessionkey; + + public String getSessionkey() { + return sessionkey; + } + + public void setSessionkey(String keyword) { + this.sessionkey = keyword; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + @Override + public String toString() { + return "Feedback, sessionkey: " + sessionkey + ", value: " + value; + } + +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/spring/spring-main.xml b/src/main/webapp/WEB-INF/spring/spring-main.xml index cdb1ae9ab..1c3c4fd43 100644 --- a/src/main/webapp/WEB-INF/spring/spring-main.xml +++ b/src/main/webapp/WEB-INF/spring/spring-main.xml @@ -23,4 +23,8 @@ <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> + </beans> diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 7965f9f53..b289f0105 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -31,7 +31,7 @@ <servlet-name>api</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping> - <filter> + <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> -- GitLab