Rework JSR356 impl to bootstrap with ServerApplicationConfig.

This way it is web container independant.
Glassfish still doesn't work because of more bugs in it.


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/b50dcfed
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/b50dcfed
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/b50dcfed

Branch: refs/heads/master
Commit: b50dcfed1781ccf46648b0268550f7f9bb972744
Parents: efce377
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Thu Jan 30 09:23:04 2014 +0100
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Thu Jan 30 09:23:04 2014 +0100

----------------------------------------------------------------------
 .../ws/javax/JavaxUpgradeHttpRequest.java       |  30 +--
 .../protocol/ws/javax/JavaxWebSocketFilter.java | 193 +------------------
 .../ws/javax/JavaxWebSocketProcessor.java       |   4 -
 .../protocol/ws/javax/WicketEndpoint.java       |  50 ++++-
 .../ws/javax/WicketServerApplicationConfig.java |  48 +++++
 .../ws/javax/WicketServerEndpointConfig.java    | 189 ++++++++++++++++++
 .../src/test/webapp/WEB-INF/web.xml             |   5 +-
 7 files changed, 305 insertions(+), 214 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/b50dcfed/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxUpgradeHttpRequest.java
----------------------------------------------------------------------
diff --git 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxUpgradeHttpRequest.java
 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxUpgradeHttpRequest.java
index a4bd1a4..e318c93 100644
--- 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxUpgradeHttpRequest.java
+++ 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxUpgradeHttpRequest.java
@@ -59,25 +59,29 @@ public class JavaxUpgradeHttpRequest implements 
HttpServletRequest
        private final String requestUri;
        private final Map<String, String[]> parametersMap;
        private final Map<String, List<String>> headers;
-       private final String contextPath = ""; // artificial
 
        public JavaxUpgradeHttpRequest(final Session session)
        {
                Map<String, Object> userProperties = 
session.getUserProperties();
+
                this.httpSession = (HttpSession) userProperties.get("session");
                this.headers = (Map<String, List<String>>) 
userProperties.get("headers");
-               this.queryString = (String) userProperties.get("queryString");
-               this.userPrincipal = (Principal) 
userProperties.get("userPrincipal");
-               this.requestUri = userProperties.get("requestURI").toString();
+               this.queryString = session.getQueryString();
+               this.userPrincipal = session.getUserPrincipal();
+               Object requestURI = session.getRequestURI();
+               this.requestUri = requestURI != null ? requestURI.toString() : 
"";
 
                this.parametersMap = new HashMap<>();
 
-               Map<String, List<String>> parameters = (Map<String, 
List<String>>) userProperties.get("parameterMap");
-               for (Map.Entry<String, List<String>> entry : 
parameters.entrySet())
+               Map<String, List<String>> parameters = 
session.getRequestParameterMap();
+               if (parameters != null)
                {
-                       String name = entry.getKey();
-                       List<String> value = entry.getValue();
-                       parametersMap.put(name, value.toArray(new 
String[value.size()]));
+                       for (Map.Entry<String, List<String>> entry : 
parameters.entrySet())
+                       {
+                               String name = entry.getKey();
+                               List<String> value = entry.getValue();
+                               parametersMap.put(name, value.toArray(new 
String[value.size()]));
+                       }
                }
        }
 
@@ -107,7 +111,7 @@ public class JavaxUpgradeHttpRequest implements 
HttpServletRequest
                if (headers != null)
                {
                        List<String> headerValues = headers.get(name);
-                       if (headerValues.isEmpty() == false)
+                       if (headerValues != null && !headerValues.isEmpty())
                        {
                                value = headerValues.get(0);
                        }
@@ -122,7 +126,7 @@ public class JavaxUpgradeHttpRequest implements 
HttpServletRequest
                if (headers != null)
                {
                        List<String> headerValues = headers.get(name);
-                       if (headerValues.isEmpty() == false)
+                       if (headerValues != null && !headerValues.isEmpty())
                        {
                                final Iterator<String> iterator = 
headerValues.iterator();
                                values = new Enumeration<String>()
@@ -151,7 +155,7 @@ public class JavaxUpgradeHttpRequest implements 
HttpServletRequest
                if (headers != null)
                {
                        Set<String> headerNames = headers.keySet();
-                       if (headerNames.isEmpty() == false)
+                       if (!headerNames.isEmpty())
                        {
                                final Iterator<String> iterator = 
headerNames.iterator();
                                names = new Enumeration<String>()
@@ -201,7 +205,7 @@ public class JavaxUpgradeHttpRequest implements 
HttpServletRequest
        @Override
        public String getContextPath()
        {
-               return contextPath;
+               return "";
        }
 
        @Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/b50dcfed/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketFilter.java
----------------------------------------------------------------------
diff --git 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketFilter.java
 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketFilter.java
index c198a2a..28dfa02 100644
--- 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketFilter.java
+++ 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketFilter.java
@@ -16,23 +16,11 @@
  */
 package org.apache.wicket.protocol.ws.javax;
 
-import java.net.URI;
-import java.security.Principal;
 import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
 
 import javax.servlet.FilterConfig;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
-import javax.websocket.Decoder;
-import javax.websocket.DeploymentException;
-import javax.websocket.Encoder;
-import javax.websocket.Extension;
-import javax.websocket.HandshakeResponse;
-import javax.websocket.server.HandshakeRequest;
-import javax.websocket.server.ServerContainer;
-import javax.websocket.server.ServerEndpointConfig;
 
 import org.apache.wicket.protocol.http.WicketFilter;
 import org.apache.wicket.protocol.ws.AbstractUpgradeFilter;
@@ -43,35 +31,10 @@ import org.apache.wicket.util.string.Strings;
  */
 public class JavaxWebSocketFilter extends AbstractUpgradeFilter
 {
-       /**
-        * A fake mount path used for WebSocket endpoint.
-        * WicketFilter should not process this path.
-        * @see WicketFilter#ignorePaths
-        */
-       private static final String WICKET_WEB_SOCKET_PATH = 
"/wicket/websocket";
-
-       /**
-        * A key used to store the application object in WebSocket's Endpoint 
user properties
-        */
-       static final String APPLICATION_KEY = "wicket.application";
-
        @Override
        public void init(final boolean isServlet, final FilterConfig 
filterConfig) throws ServletException
        {
                super.init(isServlet, new 
JavaxWebSocketFilterConfig(filterConfig));
-
-               try
-               {
-                       ServerEndpointConfig config = new 
WicketServerEndpointConfig(ServerEndpointConfig.Builder.create(WicketEndpoint.class,
 WICKET_WEB_SOCKET_PATH).build());
-                       config.getUserProperties().put(APPLICATION_KEY, 
getApplication());
-
-                       ServletContext servletContext = 
filterConfig.getServletContext();
-                       ServerContainer sc = (ServerContainer) 
servletContext.getAttribute(ServerContainer.class.getName());
-                       sc.addEndpoint(config);
-               }
-               catch (DeploymentException e) {
-                       throw new IllegalStateException(e);
-               }
        }
 
        /**
@@ -108,11 +71,11 @@ public class JavaxWebSocketFilter extends 
AbstractUpgradeFilter
                        {
                                if (Strings.isEmpty(result))
                                {
-                                       result = WICKET_WEB_SOCKET_PATH;
+                                       result = 
WicketServerEndpointConfig.WICKET_WEB_SOCKET_PATH;
                                }
                                else
                                {
-                                       result = result + ',' + 
WICKET_WEB_SOCKET_PATH;
+                                       result = result + ',' + 
WicketServerEndpointConfig.WICKET_WEB_SOCKET_PATH;
                                }
                        }
 
@@ -125,156 +88,4 @@ public class JavaxWebSocketFilter extends 
AbstractUpgradeFilter
                        return delegate.getInitParameterNames();
                }
        }
-
-       /**
-        * A ServerEndpointConfig that uses custom Configurator to collect
-        * all available information from the passed HandshakeRequest
-        */
-       private static class WicketServerEndpointConfig implements 
ServerEndpointConfig
-       {
-               private final ServerEndpointConfig delegate;
-               private Configurator configurator;
-
-               private WicketServerEndpointConfig(ServerEndpointConfig 
delegate)
-               {
-                       this.delegate = delegate;
-               }
-
-               @Override
-               public Class<?> getEndpointClass()
-               {
-                       return delegate.getEndpointClass();
-               }
-
-               @Override
-               public String getPath()
-               {
-                       return delegate.getPath();
-               }
-
-               @Override
-               public List<String> getSubprotocols()
-               {
-                       return delegate.getSubprotocols();
-               }
-
-               @Override
-               public List<Extension> getExtensions()
-               {
-                       return delegate.getExtensions();
-               }
-
-               @Override
-               public Configurator getConfigurator()
-               {
-                       if (configurator == null)
-                       {
-                               configurator = new 
JavaxWebSocketConfigurator(delegate.getConfigurator());
-                       }
-                       return configurator;
-               }
-
-               @Override
-               public List<Class<? extends Encoder>> getEncoders()
-               {
-                       return delegate.getEncoders();
-               }
-
-               @Override
-               public List<Class<? extends Decoder>> getDecoders()
-               {
-                       return delegate.getDecoders();
-               }
-
-               @Override
-               public Map<String, Object> getUserProperties()
-               {
-                       return delegate.getUserProperties();
-               }
-       }
-
-       /**
-        * A custom Configurator that collects all available information from 
the HandshakeRequest
-        */
-       private static class JavaxWebSocketConfigurator extends 
ServerEndpointConfig.Configurator
-       {
-               private final ServerEndpointConfig.Configurator delegate;
-
-               public 
JavaxWebSocketConfigurator(ServerEndpointConfig.Configurator delegate)
-               {
-                       this.delegate = delegate;
-               }
-
-               @Override
-               public void modifyHandshake(ServerEndpointConfig sec, 
HandshakeRequest request, HandshakeResponse response)
-               {
-                       delegate.modifyHandshake(sec, request, response);
-
-                       // do not store null keys/values because Tomcat 8 uses 
ConcurrentMap for UserProperties
-
-                       Map<String, Object> userProperties = 
sec.getUserProperties();
-                       Object httpSession = request.getHttpSession();
-                       if (httpSession != null)
-                       {
-                               userProperties.put("session", httpSession);
-                       }
-
-                       Map<String, List<String>> headers = 
request.getHeaders();
-                       if (headers != null)
-                       {
-                               userProperties.put("headers", headers);
-                       }
-
-
-                       Map<String, List<String>> parameterMap = 
request.getParameterMap();
-                       if (parameterMap != null)
-                       {
-                               userProperties.put("parameterMap", 
parameterMap);
-                       }
-
-
-                       String queryString = request.getQueryString();
-                       if (queryString != null)
-                       {
-                               userProperties.put("queryString", queryString);
-                       }
-
-
-                       URI requestURI = request.getRequestURI();
-                       if (requestURI != null)
-                       {
-                               userProperties.put("requestURI", requestURI);
-                       }
-
-                       Principal userPrincipal = request.getUserPrincipal();
-                       if (userPrincipal != null)
-                       {
-                               userProperties.put("userPrincipal", 
userPrincipal);
-                       }
-               }
-
-               @Override
-               public String getNegotiatedSubprotocol(List<String> supported, 
List<String> requested)
-               {
-                       return delegate.getNegotiatedSubprotocol(supported, 
requested);
-               }
-
-               @Override
-               public List<Extension> getNegotiatedExtensions(List<Extension> 
installed, List<Extension> requested)
-               {
-                       return delegate.getNegotiatedExtensions(installed, 
requested);
-               }
-
-               @Override
-               public boolean checkOrigin(String originHeaderValue)
-               {
-                       return delegate.checkOrigin(originHeaderValue);
-               }
-
-               @Override
-               public <T> T getEndpointInstance(Class<T> endpointClass) throws 
InstantiationException
-               {
-                       return super.getEndpointInstance(endpointClass);
-               }
-       }
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/b50dcfed/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java
----------------------------------------------------------------------
diff --git 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java
 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java
index 06a6bc3..3462e34 100644
--- 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java
+++ 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java
@@ -23,8 +23,6 @@ import javax.websocket.Session;
 
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * An {@link org.apache.wicket.protocol.ws.api.IWebSocketProcessor processor} 
that integrates with
@@ -34,8 +32,6 @@ import org.slf4j.LoggerFactory;
  */
 public class JavaxWebSocketProcessor extends AbstractWebSocketProcessor
 {
-       private static final Logger LOG = 
LoggerFactory.getLogger(JavaxWebSocketProcessor.class);
-
        /**
         * Constructor.
         *

http://git-wip-us.apache.org/repos/asf/wicket/blob/b50dcfed/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java
----------------------------------------------------------------------
diff --git 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java
 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java
index 11b843c..6a9a74a 100644
--- 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java
+++ 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java
@@ -16,6 +16,9 @@
  */
 package org.apache.wicket.protocol.ws.javax;
 
+import java.util.List;
+import java.util.Map;
+
 import javax.websocket.CloseReason;
 import javax.websocket.Endpoint;
 import javax.websocket.EndpointConfig;
@@ -23,6 +26,8 @@ import javax.websocket.Session;
 
 import org.apache.wicket.ThreadContext;
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.util.lang.Checks;
+import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,12 +38,19 @@ public class WicketEndpoint extends Endpoint
 {
        private static final Logger LOG = 
LoggerFactory.getLogger(WicketEndpoint.class);
 
+       /**
+        * The name of the request parameter that holds the application name
+        */
+       private static final String WICKET_APP_PARAM_NAME = "wicket-app-name";
+
        private JavaxWebSocketProcessor javaxWebSocketProcessor;
 
        @Override
        public void onOpen(Session session, EndpointConfig endpointConfig)
        {
-               WebApplication app = (WebApplication) 
session.getUserProperties().get(JavaxWebSocketFilter.APPLICATION_KEY);
+               String appName = getApplicationName(session);
+
+               WebApplication app = (WebApplication) 
WebApplication.get(appName);
 
                try
                {
@@ -49,7 +61,6 @@ public class WicketEndpoint extends Endpoint
                {
                        ThreadContext.detach();
                }
-
        }
 
        @Override
@@ -63,8 +74,41 @@ public class WicketEndpoint extends Endpoint
        @Override
        public void onError(Session session, Throwable t)
        {
+               LOG.error("An error occurred in web socket connection with id : 
" + session.getId(), t);
                super.onError(session, t);
+       }
 
-               LOG.error("An error occurred in web socket connection with id : 
" + session.getId(), t);
+       private String getApplicationName(Session session)
+       {
+               String appName = null;
+
+               @SuppressWarnings("unchecked")
+               Map<String, List<String>> parameters = 
session.getRequestParameterMap();
+               if (parameters != null)
+               {
+                       appName = parameters.get(WICKET_APP_PARAM_NAME).get(0);
+               }
+               else
+               {
+                       // Glassfish 4 has null parameters map and non-null 
query string ...
+                       String queryString = session.getQueryString();
+                       if (!Strings.isEmpty(queryString))
+                       {
+                               String[] params = Strings.split(queryString, 
'&');
+                               for (String paramPair : params)
+                               {
+                                       String[] nameValues = 
Strings.split(paramPair, '=');
+                                       if 
(WICKET_APP_PARAM_NAME.equals(nameValues[0]))
+                                       {
+                                               appName = nameValues[1];
+                                       }
+                               }
+                       }
+               }
+
+               Checks.notNull(appName, "The application name cannot be read 
from the upgrade request's parameters");
+
+               return appName;
        }
+
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/b50dcfed/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketServerApplicationConfig.java
----------------------------------------------------------------------
diff --git 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketServerApplicationConfig.java
 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketServerApplicationConfig.java
new file mode 100644
index 0000000..f30e37b
--- /dev/null
+++ 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketServerApplicationConfig.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.ws.javax;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.websocket.Endpoint;
+import javax.websocket.server.ServerApplicationConfig;
+import javax.websocket.server.ServerEndpointConfig;
+
+/**
+ * Configures WicketServerEndpointConfig that will setup {@link 
org.apache.wicket.protocol.ws.javax.WicketEndpoint}
+ * and a custom {@link 
javax.websocket.server.ServerEndpointConfig.Configurator} to collect the
+ * useful information from the upgrade http request
+ */
+@SuppressWarnings("unused") // loaded with class-scan
+public class WicketServerApplicationConfig implements ServerApplicationConfig
+{
+       @Override
+       public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends 
Endpoint>> classes)
+       {
+               Set<ServerEndpointConfig> configs = new HashSet<>();
+               configs.add(new WicketServerEndpointConfig());
+               return configs;
+       }
+
+       @Override
+       public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> classes)
+       {
+               return Collections.emptySet();
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/b50dcfed/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketServerEndpointConfig.java
----------------------------------------------------------------------
diff --git 
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketServerEndpointConfig.java
 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketServerEndpointConfig.java
new file mode 100644
index 0000000..e3a039b
--- /dev/null
+++ 
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketServerEndpointConfig.java
@@ -0,0 +1,189 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.ws.javax;
+
+import java.net.URI;
+import java.security.Principal;
+import java.util.List;
+import java.util.Map;
+
+import javax.websocket.Decoder;
+import javax.websocket.Encoder;
+import javax.websocket.Extension;
+import javax.websocket.HandshakeResponse;
+import javax.websocket.server.HandshakeRequest;
+import javax.websocket.server.ServerEndpointConfig;
+
+/**
+ * A ServerEndpointConfig that uses custom Configurator to collect
+ * all available information from the passed HandshakeRequest
+ */
+class WicketServerEndpointConfig implements ServerEndpointConfig
+{
+       /**
+        * A fake mount path used for WebSocket endpoint.
+        * WicketFilter should not process this path.
+        * @see org.apache.wicket.protocol.http.WicketFilter#ignorePaths
+        */
+       static final String WICKET_WEB_SOCKET_PATH = "/wicket/websocket";
+
+       private final ServerEndpointConfig delegate;
+
+       private Configurator configurator;
+
+       WicketServerEndpointConfig()
+       {
+               this.delegate = 
ServerEndpointConfig.Builder.create(WicketEndpoint.class, 
WICKET_WEB_SOCKET_PATH).build();
+       }
+
+       @Override
+       public Class<?> getEndpointClass()
+       {
+               return delegate.getEndpointClass();
+       }
+
+       @Override
+       public String getPath()
+       {
+               return delegate.getPath();
+       }
+
+       @Override
+       public List<String> getSubprotocols()
+       {
+               return delegate.getSubprotocols();
+       }
+
+       @Override
+       public List<Extension> getExtensions()
+       {
+               return delegate.getExtensions();
+       }
+
+       @Override
+       public Configurator getConfigurator()
+       {
+               if (configurator == null)
+               {
+                       configurator = new 
JavaxWebSocketConfigurator(delegate.getConfigurator());
+               }
+               return configurator;
+       }
+
+       @Override
+       public List<Class<? extends Encoder>> getEncoders()
+       {
+               return delegate.getEncoders();
+       }
+
+       @Override
+       public List<Class<? extends Decoder>> getDecoders()
+       {
+               return delegate.getDecoders();
+       }
+
+       @Override
+       public Map<String, Object> getUserProperties()
+       {
+               return delegate.getUserProperties();
+       }
+
+       /**
+        * A custom Configurator that collects all available information from 
the HandshakeRequest
+        */
+       private static class JavaxWebSocketConfigurator extends 
ServerEndpointConfig.Configurator
+       {
+               private final ServerEndpointConfig.Configurator delegate;
+
+               public 
JavaxWebSocketConfigurator(ServerEndpointConfig.Configurator delegate)
+               {
+                       this.delegate = delegate;
+               }
+
+               @Override
+               public void modifyHandshake(ServerEndpointConfig sec, 
HandshakeRequest request, HandshakeResponse response)
+               {
+                       delegate.modifyHandshake(sec, request, response);
+
+                       // do not store null keys/values because Tomcat 8 uses 
ConcurrentMap for UserProperties
+
+                       Map<String, Object> userProperties = 
sec.getUserProperties();
+                       Object httpSession = request.getHttpSession();
+                       if (httpSession != null)
+                       {
+                               userProperties.put("session", httpSession);
+                       }
+
+                       Map<String, List<String>> headers = 
request.getHeaders();
+                       if (headers != null)
+                       {
+                               userProperties.put("headers", headers);
+                       }
+
+
+                       Map<String, List<String>> parameterMap = 
request.getParameterMap();
+                       if (parameterMap != null)
+                       {
+                               userProperties.put("parameterMap", 
parameterMap);
+                       }
+
+
+                       String queryString = request.getQueryString();
+                       if (queryString != null)
+                       {
+                               userProperties.put("queryString", queryString);
+                       }
+
+
+                       URI requestURI = request.getRequestURI();
+                       if (requestURI != null)
+                       {
+                               userProperties.put("requestURI", requestURI);
+                       }
+
+                       Principal userPrincipal = request.getUserPrincipal();
+                       if (userPrincipal != null)
+                       {
+                               userProperties.put("userPrincipal", 
userPrincipal);
+                       }
+               }
+
+               @Override
+               public String getNegotiatedSubprotocol(List<String> supported, 
List<String> requested)
+               {
+                       return delegate.getNegotiatedSubprotocol(supported, 
requested);
+               }
+
+               @Override
+               public List<Extension> getNegotiatedExtensions(List<Extension> 
installed, List<Extension> requested)
+               {
+                       return delegate.getNegotiatedExtensions(installed, 
requested);
+               }
+
+               @Override
+               public boolean checkOrigin(String originHeaderValue)
+               {
+                       return delegate.checkOrigin(originHeaderValue);
+               }
+
+               @Override
+               public <T> T getEndpointInstance(Class<T> endpointClass) throws 
InstantiationException
+               {
+                       return delegate.getEndpointInstance(endpointClass);
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/b50dcfed/wicket-native-websocket/wicket-native-websocket-javax/src/test/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git 
a/wicket-native-websocket/wicket-native-websocket-javax/src/test/webapp/WEB-INF/web.xml
 
b/wicket-native-websocket/wicket-native-websocket-javax/src/test/webapp/WEB-INF/web.xml
index 3631a2e..187950d 100644
--- 
a/wicket-native-websocket/wicket-native-websocket-javax/src/test/webapp/WEB-INF/web.xml
+++ 
b/wicket-native-websocket/wicket-native-websocket-javax/src/test/webapp/WEB-INF/web.xml
@@ -15,10 +15,9 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
-<web-app xmlns="http://java.sun.com/xml/ns/javaee";
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee";
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
-         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd";
+         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd";
          version="3.1">
 
        <display-name>JSR356 WebSockets</display-name>

Reply via email to