Added ping to age-out idle or stale connections.
Repushing due to a javadoc inherited from the master.

Change-Id: I375fc114079ba7d0a2897791ba05fa41762db80b
diff --git a/web/gui/src/main/java/org/onlab/onos/gui/GuiWebSocketServlet.java b/web/gui/src/main/java/org/onlab/onos/gui/GuiWebSocketServlet.java
index 02b46ed..aa00a863 100644
--- a/web/gui/src/main/java/org/onlab/onos/gui/GuiWebSocketServlet.java
+++ b/web/gui/src/main/java/org/onlab/onos/gui/GuiWebSocketServlet.java
@@ -20,19 +20,56 @@
 import org.onlab.osgi.DefaultServiceDirectory;
 import org.onlab.osgi.ServiceDirectory;
 
+import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
 
 /**
  * Web socket servlet capable of creating various sockets for the user interface.
  */
 public class GuiWebSocketServlet extends WebSocketServlet {
 
+    private static final long PING_DELAY_MS = 5000;
+
     private ServiceDirectory directory = new DefaultServiceDirectory();
 
+    private final Set<TopologyWebSocket> sockets = new HashSet<>();
+    private final Timer timer = new Timer();
+    private final TimerTask pruner = new Pruner();
+
+    @Override
+    public void init() throws ServletException {
+        super.init();
+        timer.schedule(pruner, PING_DELAY_MS, PING_DELAY_MS);
+    }
+
     @Override
     public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
-
-        return new TopologyWebSocket(directory);
+        TopologyWebSocket socket = new TopologyWebSocket(directory);
+        synchronized (sockets) {
+            sockets.add(socket);
+        }
+        return socket;
     }
 
+    // Task for pruning web-sockets that are idle.
+    private class Pruner extends TimerTask {
+        @Override
+        public void run() {
+            synchronized (sockets) {
+                Iterator<TopologyWebSocket> it = sockets.iterator();
+                while (it.hasNext()) {
+                    TopologyWebSocket socket = it.next();
+                    if (socket.isIdle()) {
+                        it.remove();
+                        socket.close();
+                    }
+                }
+            }
+        }
+    }
 }