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 744ab7c6..24242048 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 00000000..8363cca7
--- /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 00000000..7b0c4eeb
--- /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 00000000..2cf8e666
--- /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 cdb1ae9a..1c3c4fd4 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 7965f9f5..b289f010 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