2013/2/14  <ma...@apache.org>:
> Author: markt
> Date: Wed Feb 13 20:02:38 2013
> New Revision: 1445893
>
> URL: http://svn.apache.org/r1445893
> Log:
> Implement getOpenSessions
>
> Modified:
>     tomcat/trunk/java/javax/websocket/Session.java
>     tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
>     tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
>     
> tomcat/trunk/java/org/apache/tomcat/websocket/server/ServerContainerImpl.java
>     
> tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java
>     tomcat/trunk/test/org/apache/tomcat/websocket/TestWsSession.java
>     
> tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
>


> --- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original)
> +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Wed Feb 13 
> 20:02:38 2013
(...)
> @@ -240,8 +240,7 @@ public class WsSession implements Sessio
>
>      @Override
>      public Set<Session> getOpenSessions() {
> -        // TODO Auto-generated method stub
> -        return null;
> +        return webSocketContainer.getOpenSession(localEndpoint.getClass());

Inconsistent method names. s/getOpenSession/getOpenSessions/

>      }
>
>

(...)

> --- tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java 
> (original)
> +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java 
> Wed Feb 13 20:02:38 2013
> @@ -25,6 +25,7 @@ import java.nio.channels.AsynchronousSoc
>  import java.nio.charset.Charset;
>  import java.util.ArrayList;
>  import java.util.HashMap;
> +import java.util.HashSet;
>  import java.util.Iterator;
>  import java.util.List;
>  import java.util.Map;
> @@ -53,6 +54,10 @@ public class WsWebSocketContainer implem
>      private static final Charset iso88591 = Charset.forName("ISO-8859-1");
>      private static final byte[] crlf = new byte[] {13, 10};
>
> +    private final Map<Class<?>, Set<WsSession>> endpointSessionMap =
> +            new HashMap<>();
> +    private final Object endPointSessionMapLock = new Object();
> +
>      private long defaultAsyncTimeout = -1;
>      private int maxBinaryMessageBufferSize = Constants.DEFAULT_BUFFER_SIZE;
>      private int maxTextMessageBufferSize = Constants.DEFAULT_BUFFER_SIZE;
> @@ -147,8 +152,8 @@ public class WsWebSocketContainer implem
>          }
>          WsSession wsSession =
>                  new WsSession(endpoint, wsRemoteEndpointClient, this);
> -
>          endpoint.onOpen(wsSession, clientEndpointConfiguration);
> +        registerSession(clazz, wsSession);
>
>          // Object creation will trigger input processing
>          @SuppressWarnings("unused")
> @@ -159,6 +164,37 @@ public class WsWebSocketContainer implem
>      }
>
>
> +    protected void registerSession(Class<?> endpoint, WsSession wsSession) {
> +        synchronized (endPointSessionMapLock) {
> +            Set<WsSession> wsSessions = endpointSessionMap.get(endpoint);
> +            if (wsSessions == null) {
> +                wsSessions = new HashSet<>();
> +                endpointSessionMap.put(endpoint, wsSessions);
> +            }
> +            wsSessions.add(wsSession);
> +        }
> +    }
> +
> +
> +    protected void unregisterSession(Class<?> endpoint, WsSession wsSession) 
> {
> +        synchronized (endPointSessionMapLock) {
> +            Set<WsSession> wsSessions = endpointSessionMap.get(endpoint);
> +            if (wsSessions != null) {
> +                wsSessions.remove(wsSession);
> +                if (wsSessions.size() == 0) {
> +                    endpointSessionMap.remove(endpoint);
> +                }
> +            }
> +        }
> +    }
> +
> +
> +    Set<Session> getOpenSession(Class<?> endpoint) {
> +        HashSet<Session> result = new HashSet<>();
> +        result.addAll(endpointSessionMap.get(endpoint));
> +        return result;

endpointSessionMap is a mere HashMap.
I think a lock is needed here, or a ConcurrentHashMap.

(It can be a ReadWriteLock as this is not a WeakHashMap, but I doubt
that will improve much).

> +    }
> +
>      private Map<String,List<String>> createRequestHeaders(String host,
>              int port) {
>

Best regards,
Konstantin Kolinko

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to