You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/12/12 16:53:22 UTC

[2/3] git commit: WICKET-4924 Websocket broadcast support does not work with OSGi

WICKET-4924 Websocket broadcast support does not work with OSGi

Do not use the same package names in several modules


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

Branch: refs/heads/master
Commit: 6540f0251e41b42e618f3784f90a0466595fc90b
Parents: d78132b
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Dec 12 17:51:59 2012 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Dec 12 17:53:14 2012 +0200

----------------------------------------------------------------------
 pom.xml                                            |   36 ++
 testing/wicket-common-tests/pom.xml                |   30 ++
 .../apache/wicket/ajax/AbstractAjaxResponse.java   |   16 +-
 .../org/apache/wicket/ajax/XmlAjaxResponse.java    |    4 +-
 .../apache/wicket/protocol/http/WicketFilter.java  |   46 ++-
 .../wicket/ajax/IWebSocketRequestHandler.java      |   45 ---
 .../wicket/ajax/WebSocketRequestHandler.java       |  270 --------------
 .../protocol/http/AbstractUpgradeFilter.java       |  258 --------------
 .../wicket/protocol/ws/AbstractUpgradeFilter.java  |  197 +++++++++++
 .../ws/api/AbstractWebSocketProcessor.java         |    1 -
 .../protocol/ws/api/IWebSocketRequestHandler.java  |   45 +++
 .../wicket/protocol/ws/api/WebSocketBehavior.java  |    1 -
 .../protocol/ws/api/WebSocketRequestHandler.java   |  272 +++++++++++++++
 .../ws/api/event/WebSocketBinaryPayload.java       |    2 +-
 .../ws/api/event/WebSocketClosedPayload.java       |    2 +-
 .../ws/api/event/WebSocketConnectedPayload.java    |    2 +-
 .../protocol/ws/api/event/WebSocketPayload.java    |    2 +-
 .../ws/api/event/WebSocketPushPayload.java         |    2 +-
 .../ws/api/event/WebSocketTextPayload.java         |    2 +-
 .../protocol/ws/util/tester/WebSocketTestPage.java |    2 +-
 .../protocol/http/Jetty7WebSocketFilter.java       |  107 ------
 .../protocol/ws/jetty/Jetty7WebSocketFilter.java   |  106 ++++++
 .../protocol/http/Jetty9WebSocketFilter.java       |  119 -------
 .../ws/jetty/Jetty9WebSocketConnection.java        |  113 ------
 .../ws/jetty/Jetty9WebSocketProcessor.java         |  102 ------
 .../ws/jetty9/Jetty9WebSocketConnection.java       |  113 ++++++
 .../protocol/ws/jetty9/Jetty9WebSocketFilter.java  |  117 ++++++
 .../ws/jetty9/Jetty9WebSocketProcessor.java        |  102 ++++++
 .../protocol/http/Tomcat7WebSocketFilter.java      |   90 -----
 .../ws/tomcat7/Tomcat7WebSocketFilter.java         |   91 +++++
 30 files changed, 1160 insertions(+), 1135 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 9f1fd2f..a859bc2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -289,6 +289,42 @@
 				<type>jar</type>
 			</dependency>
 			<dependency>
+				<groupId>org.apache.wicket</groupId>
+				<artifactId>wicket-native-websocket-core</artifactId>
+				<version>0.5-SNAPSHOT</version>
+				<type>jar</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.wicket</groupId>
+				<artifactId>wicket-native-websocket-jetty</artifactId>
+				<version>0.5-SNAPSHOT</version>
+				<type>jar</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.wicket</groupId>
+				<artifactId>wicket-native-websocket-jetty9</artifactId>
+				<version>0.5-SNAPSHOT</version>
+				<type>jar</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.wicket</groupId>
+				<artifactId>wicket-native-websocket-tomcat</artifactId>
+				<version>0.5-SNAPSHOT</version>
+				<type>jar</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.wicket</groupId>
+				<artifactId>wicket-atmosphere</artifactId>
+				<version>0.5-SNAPSHOT</version>
+				<type>jar</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.wicket</groupId>
+				<artifactId>wicket-bootstrap</artifactId>
+				<version>0.5-SNAPSHOT</version>
+				<type>jar</type>
+			</dependency>
+			<dependency>
 				<groupId>junit</groupId>
 				<artifactId>junit</artifactId>
 				<version>4.10</version>

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/testing/wicket-common-tests/pom.xml
----------------------------------------------------------------------
diff --git a/testing/wicket-common-tests/pom.xml b/testing/wicket-common-tests/pom.xml
index be3c007..ee4cafa 100644
--- a/testing/wicket-common-tests/pom.xml
+++ b/testing/wicket-common-tests/pom.xml
@@ -75,6 +75,36 @@
 			<scope>test</scope>
 		</dependency>
 		<dependency>
+			<groupId>org.apache.wicket</groupId>
+			<artifactId>wicket-native-websocket-core</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.wicket</groupId>
+			<artifactId>wicket-native-websocket-jetty</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.wicket</groupId>
+			<artifactId>wicket-native-websocket-jetty9</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.wicket</groupId>
+			<artifactId>wicket-native-websocket-tomcat</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.wicket</groupId>
+			<artifactId>wicket-atmosphere</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.wicket</groupId>
+			<artifactId>wicket-bootstrap</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
 		</dependency>

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxResponse.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxResponse.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxResponse.java
index d156dc9..80624bf 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxResponse.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxResponse.java
@@ -53,7 +53,7 @@ import org.slf4j.LoggerFactory;
  * A POJO-like that collects the data for the Ajax response written to the client
  * and serializes it to specific String-based format (XML, JSON, ...).
  */
-abstract class AbstractAjaxResponse
+public abstract class AbstractAjaxResponse
 {
 	private static final Logger LOG = LoggerFactory.getLogger(AbstractAjaxResponse.class);
 
@@ -134,7 +134,7 @@ abstract class AbstractAjaxResponse
 	 * @param encoding
 	 *      the encoding for the response
 	 */
-	void writeTo(final Response response, final String encoding)
+	public void writeTo(final Response response, final String encoding)
 	{
 		writeHeader(response, encoding);
 
@@ -300,7 +300,7 @@ abstract class AbstractAjaxResponse
 	 * @param javascript
 	 *      the javascript to execute
 	 */
-	final void appendJavaScript(final CharSequence javascript)
+	public final void appendJavaScript(final CharSequence javascript)
 	{
 		Args.notNull(javascript, "javascript");
 
@@ -313,7 +313,7 @@ abstract class AbstractAjaxResponse
 	 * @param javascript
 	 *      the javascript to execute
 	 */
-	final void prependJavaScript(CharSequence javascript)
+	public final void prependJavaScript(CharSequence javascript)
 	{
 		Args.notNull(javascript, "javascript");
 
@@ -332,7 +332,7 @@ abstract class AbstractAjaxResponse
 	 * @throws IllegalStateException
 	 *      thrown when components no more can be added for replacement.
 	 */
-	final void add(final Component component, final String markupId)
+	public final void add(final Component component, final String markupId)
 			throws IllegalArgumentException, IllegalStateException
 	{
 		Args.notEmpty(markupId, "markupId");
@@ -363,7 +363,7 @@ abstract class AbstractAjaxResponse
 	/**
 	 * @return a read-only collection of all components which have been added for replacement so far.
 	 */
-	final Collection<? extends Component> getComponents()
+	public final Collection<? extends Component> getComponents()
 	{
 		return Collections.unmodifiableCollection(markupIdToComponent.values());
 	}
@@ -374,7 +374,7 @@ abstract class AbstractAjaxResponse
 	 * @param requestCycle
 	 *      the current request cycle
 	 */
-	void detach(IRequestCycle requestCycle)
+	public void detach(IRequestCycle requestCycle)
 	{
 		Iterator<Component> iterator = markupIdToComponent.values().iterator();
 		while (iterator.hasNext())
@@ -423,7 +423,7 @@ abstract class AbstractAjaxResponse
 	 *
 	 * @return IHeaderResponse instance to use for the header contributions.
 	 */
-	IHeaderResponse getHeaderResponse()
+	public IHeaderResponse getHeaderResponse()
 	{
 		if (headerResponse == null)
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-core/src/main/java/org/apache/wicket/ajax/XmlAjaxResponse.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/XmlAjaxResponse.java b/wicket-core/src/main/java/org/apache/wicket/ajax/XmlAjaxResponse.java
index d94b371..4ab9381 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/XmlAjaxResponse.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/XmlAjaxResponse.java
@@ -39,11 +39,11 @@ import org.slf4j.LoggerFactory;
  *     </ul>
  * </p>
  */
-abstract class XmlAjaxResponse extends AbstractAjaxResponse
+public abstract class XmlAjaxResponse extends AbstractAjaxResponse
 {
 	private static final Logger LOG = LoggerFactory.getLogger(XmlAjaxResponse.class);
 
-	XmlAjaxResponse(final Page page)
+	public XmlAjaxResponse(final Page page)
 	{
 		super(page);
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
index 1394944..291bb30 100644
--- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
+++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
@@ -185,18 +185,7 @@ public class WicketFilter implements Filter
 					httpServletResponse);
 
 				RequestCycle requestCycle = application.createRequestCycle(webRequest, webResponse);
-				if (!requestCycle.processRequestAndDetach())
-				{
-					if (chain != null)
-					{
-						chain.doFilter(request, response);
-					}
-					res = false;
-				}
-				else
-				{
-					webResponse.flush();
-				}
+				res = processRequestCycle(requestCycle, webResponse, httpServletRequest, httpServletResponse, chain);
 			}
 			else
 			{
@@ -235,6 +224,39 @@ public class WicketFilter implements Filter
 	}
 
 	/**
+	 * Process the request cycle
+	 *
+	 * @param requestCycle
+	 * @param webResponse
+	 * @param httpServletRequest
+	 * @param httpServletResponse
+	 * @param chain
+	 * @return false, if the request could not be processed
+	 * @throws IOException
+	 * @throws ServletException
+	 */
+	protected boolean processRequestCycle(RequestCycle requestCycle, WebResponse webResponse,
+	    HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
+		final FilterChain chain) throws IOException, ServletException {
+		// Assume we are able to handle the request
+		boolean res = true;
+
+		if (!requestCycle.processRequestAndDetach())
+		{
+			if (chain != null)
+			{
+				chain.doFilter(httpServletRequest, httpServletResponse);
+			}
+			res = false;
+		}
+		else
+		{
+			webResponse.flush();
+		}
+		return res;
+	}
+
+	/**
 	 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
 	 *      javax.servlet.ServletResponse, javax.servlet.FilterChain)
 	 */

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/ajax/IWebSocketRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/ajax/IWebSocketRequestHandler.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/ajax/IWebSocketRequestHandler.java
deleted file mode 100644
index 45e9749..0000000
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/ajax/IWebSocketRequestHandler.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.ajax;
-
-/**
- * An interface for outbound communication with web socket clients
- *
- * @since 6.0
- */
-public interface IWebSocketRequestHandler
-{
-	/**
-	 * Pushes a text message to the client.
-	 *
-	 * @param message
-	 *      the text message to push to the client if the web socket connection is open
-	 */
-	void push(CharSequence message);
-
-	/**
-	 * Pushes a binary message to the client.
-	 *
-	 * @param message
-	 *      the binary message to push to the client if the web socket connection is open
-	 * @param offset
-	 *      the offset to start to read from the message
-	 * @param length
-	 *      how many bytes to read from the message
-	 */
-	void push(byte[] message, int offset, int length);
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/ajax/WebSocketRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/ajax/WebSocketRequestHandler.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/ajax/WebSocketRequestHandler.java
deleted file mode 100644
index 178022b..0000000
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/ajax/WebSocketRequestHandler.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * 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.ajax;
-
-import java.io.IOException;
-import java.util.Collection;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.Page;
-import org.apache.wicket.core.request.handler.logger.PageLogData;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
-import org.apache.wicket.request.ILogData;
-import org.apache.wicket.request.IRequestCycle;
-import org.apache.wicket.request.Response;
-import org.apache.wicket.request.component.IRequestablePage;
-import org.apache.wicket.request.http.WebRequest;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.util.lang.Args;
-import org.apache.wicket.util.string.Strings;
-import org.apache.wicket.util.visit.IVisit;
-import org.apache.wicket.util.visit.IVisitor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * An extension of AjaxRequestTarget that also supports pushing data from the server to the
- * client.
- *
- * @since 6.0
- */
-public class WebSocketRequestHandler implements AjaxRequestTarget, IWebSocketRequestHandler
-{                                                  
-	private static final Logger LOG = LoggerFactory.getLogger(WebSocketRequestHandler.class);
-
-	private final Page page;
-
-	private final IWebSocketConnection connection;
-
-	private final AbstractAjaxResponse ajaxResponse;
-
-	private PageLogData logData;
-
-	public WebSocketRequestHandler(final Component component, final IWebSocketConnection connection)
-	{
-		this.page = Args.notNull(component, "component").getPage();
-		this.connection = Args.notNull(connection, "connection");
-		this.ajaxResponse = new XmlAjaxResponse(page)
-		{
-			@Override
-			protected void fireOnAfterRespondListeners(Response response)
-			{
-			}
-
-			@Override
-			protected void fireOnBeforeRespondListeners()
-			{
-			}
-		};
-	}
-
-	@Override
-	public void push(CharSequence message)
-	{
-		if (connection.isOpen())
-		{
-			Args.notNull(message, "message");
-			try
-			{
-				connection.sendMessage(message.toString());
-			} catch (IOException iox)
-			{
-				LOG.error("An error occurred while pushing text message.", iox);
-			}
-		}
-		else
-		{
-			LOG.warn("The websocket connection is already closed. Cannot push the text message '{}'", message);
-		}
-	}
-
-	@Override
-	public void push(byte[] message, int offset, int length)
-	{
-		if (connection.isOpen())
-		{
-			Args.notNull(message, "message");
-			try
-			{
-				connection.sendMessage(message, offset, length);
-			} catch (IOException iox)
-			{
-				LOG.error("An error occurred while pushing binary message.", iox);
-			}
-		}
-		else
-		{
-			LOG.warn("The websocket connection is already closed. Cannot push the binary message '{}'", message);
-		}
-	}
-	
-	@Override
-	public void add(Component component, String markupId)
-	{
-		ajaxResponse.add(component, markupId);
-	}
-
-	@Override
-	public void add(Component... components)
-	{
-		for (final Component component : components)
-		{
-			Args.notNull(component, "component");
-
-			if (component.getOutputMarkupId() == false)
-			{
-				throw new IllegalArgumentException(
-						"cannot update component that does not have setOutputMarkupId property set to true. Component: " +
-								component.toString());
-			}
-			add(component, component.getMarkupId());
-		}
-	}
-
-	@Override
-	public final void addChildren(MarkupContainer parent, Class<?> childCriteria)
-	{
-		Args.notNull(parent, "parent");
-		Args.notNull(childCriteria, "childCriteria");
-
-		parent.visitChildren(childCriteria, new IVisitor<Component, Void>()
-		{
-			@Override
-			public void component(final Component component, final IVisit<Void> visit)
-			{
-				add(component);
-				visit.dontGoDeeper();
-			}
-		});
-	}
-
-	@Override
-	public void addListener(IListener listener)
-	{
-	}
-
-	@Override
-	public void appendJavaScript(CharSequence javascript)
-	{
-		ajaxResponse.appendJavaScript(javascript);
-	}
-
-	@Override
-	public void prependJavaScript(CharSequence javascript)
-	{
-		ajaxResponse.prependJavaScript(javascript);
-	}
-
-	@Override
-	public void registerRespondListener(ITargetRespondListener listener)
-	{
-	}
-
-	@Override
-	public Collection<? extends Component> getComponents()
-	{
-		return ajaxResponse.getComponents();
-	}
-
-	@Override
-	public final void focusComponent(Component component)
-	{
-		if (component != null && component.getOutputMarkupId() == false)
-		{
-			throw new IllegalArgumentException(
-					"cannot update component that does not have setOutputMarkupId property set to true. Component: " +
-							component.toString());
-		}
-		final String id = component != null ? ("'" + component.getMarkupId() + "'") : "null";
-		appendJavaScript("Wicket.Focus.setFocusOnId(" + id + ");");
-	}
-
-	@Override
-	public IHeaderResponse getHeaderResponse()
-	{
-		return ajaxResponse.getHeaderResponse();
-	}
-
-	@Override
-	public String getLastFocusedElementId()
-	{
-		WebRequest request = (WebRequest) page.getRequest();
-		String id = request.getHeader("Wicket-FocusedElementId");
-		return Strings.isEmpty(id) ? null : id;
-	}
-
-	@Override
-	public Page getPage()
-	{
-		return page;
-	}
-
-	@Override
-	public Integer getPageId()
-	{
-		return page.getPageId();
-	}
-
-	@Override
-	public boolean isPageInstanceCreated()
-	{
-		return true;
-	}
-
-	@Override
-	public Integer getRenderCount()
-	{
-		return page.getRenderCount();
-	}
-
-	@Override
-	public ILogData getLogData()
-	{
-		return logData;
-	}
-
-	@Override
-	public Class<? extends IRequestablePage> getPageClass()
-	{
-		return page.getPageClass();
-	}
-
-	@Override
-	public PageParameters getPageParameters()
-	{
-		return page.getPageParameters();
-	}
-
-	@Override
-	public void respond(IRequestCycle requestCycle)
-	{
-		ajaxResponse.writeTo(requestCycle.getResponse(), "UTF-8");
-	}
-
-	@Override
-	public void detach(IRequestCycle requestCycle)
-	{
-		if (logData == null)
-		{
-			logData = new PageLogData(page);
-		}
-		
-		ajaxResponse.detach(requestCycle);
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/http/AbstractUpgradeFilter.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/http/AbstractUpgradeFilter.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/http/AbstractUpgradeFilter.java
deleted file mode 100644
index fa76ecb..0000000
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/http/AbstractUpgradeFilter.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * 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.http;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.ThreadContext;
-import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.request.http.WebRequest;
-import org.apache.wicket.request.http.WebResponse;
-
-/**
- * An extension of WicketFilter that is used to check whether
- * the processed HttpServletRequest needs to upgrade its protocol
- * from HTTP to something else
- *
- * @since 6.0
- */
-public class AbstractUpgradeFilter extends WicketFilter
-{
-	/**
-	 * This is Wicket's main method to execute a request
-	 *
-	 * @param request
-	 *      the http request
-	 * @param response
-	 *      the http response
-	 * @param chain
-	 *      the filter chain
-	 * @return false, if the request could not be processed
-	 * @throws IOException
-	 * @throws ServletException
-	 */
-	// TODO improve WicketFilter#processRequest() to provide a hook instead of copy/pasting its whole code
-	@Override
-	boolean processRequest(ServletRequest request, final ServletResponse response,
-	                       final FilterChain chain) throws IOException, ServletException
-	{
-		final ThreadContext previousThreadContext = ThreadContext.detach();
-
-		// Assume we are able to handle the request
-		boolean res = true;
-
-		final ClassLoader previousClassLoader = Thread.currentThread().getContextClassLoader();
-		final ClassLoader newClassLoader = getClassLoader();
-
-		try
-		{
-			if (previousClassLoader != newClassLoader)
-			{
-				Thread.currentThread().setContextClassLoader(newClassLoader);
-			}
-
-			HttpServletRequest httpServletRequest = (HttpServletRequest)request;
-			HttpServletResponse httpServletResponse = (HttpServletResponse)response;
-
-			// Make sure getFilterPath() gets called before checkIfRedirectRequired()
-			String filterPath = getFilterPath(httpServletRequest);
-
-			if (filterPath == null)
-			{
-				throw new IllegalStateException("filter path was not configured");
-			}
-
-			WebApplication application = getApplication();
-			// No redirect; process the request
-			ThreadContext.setApplication(application);
-
-			WebRequest webRequest = application.createWebRequest(httpServletRequest, filterPath);
-			WebResponse webResponse = application.createWebResponse(webRequest,
-					httpServletResponse);
-
-			RequestCycle requestCycle = application.createRequestCycle(webRequest, webResponse);
-			ThreadContext.setRequestCycle(requestCycle);
-
-			if (acceptWebSocket(httpServletRequest, httpServletResponse, application) || httpServletResponse.isCommitted())
-			{
-				res = true;
-			}
-			else if (!requestCycle.processRequestAndDetach() && !httpServletResponse.isCommitted())
-			{
-				if (chain != null)
-				{
-					chain.doFilter(request, response);
-				}
-				res = false;
-			}
-			else
-			{
-				webResponse.flush();
-			}
-
-		}
-		finally
-		{
-			ThreadContext.restore(previousThreadContext);
-
-			if (newClassLoader != previousClassLoader)
-			{
-				Thread.currentThread().setContextClassLoader(previousClassLoader);
-			}
-
-			if (response.isCommitted())
-			{
-				response.flushBuffer();
-			}
-		}
-		return res;
-	}
-
-	protected boolean acceptWebSocket(HttpServletRequest req, HttpServletResponse resp, Application application)
-			throws ServletException, IOException
-	{
-		// Information required to send the server handshake message
-		String key;
-		String subProtocol = null;
-		List<String> extensions = Collections.emptyList();
-
-		if (!headerContainsToken(req, "upgrade", "websocket")) {
-//			resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
-			return false;
-		}
-
-		if (!headerContainsToken(req, "connection", "upgrade")) {
-			resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
-			return false;
-		}
-
-		if (!headerContainsToken(req, "sec-websocket-version", "13")) {
-			resp.setStatus(426);
-			resp.setHeader("Sec-WebSocket-Version", "13");
-			return false;
-		}
-
-		key = req.getHeader("Sec-WebSocket-Key");
-		if (key == null) {
-			resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
-			return false;
-		}
-
-		String origin = req.getHeader("Origin");
-		if (!verifyOrigin(origin)) {
-			resp.sendError(HttpServletResponse.SC_FORBIDDEN);
-			return false;
-		}
-
-		List<String> subProtocols = getTokensFromHeader(req,
-				"Sec-WebSocket-Protocol-Client");
-		if (!subProtocols.isEmpty()) {
-			subProtocol = selectSubProtocol(subProtocols);
-
-		}
-
-		resp.setHeader("upgrade", "websocket");
-		resp.setHeader("connection", "upgrade");
-
-		if (subProtocol != null) {
-			resp.setHeader("Sec-WebSocket-Protocol", subProtocol);
-		}
-
-		return true;
-	}
-
-	/*
-	 * This only works for tokens. Quoted strings need more sophisticated
-	 * parsing.
-	 */
-	private boolean headerContainsToken(HttpServletRequest req,
-	                                    String headerName, String target) {
-		Enumeration<String> headers = req.getHeaders(headerName);
-		while (headers.hasMoreElements()) {
-			String header = headers.nextElement();
-			String[] tokens = header.split(",");
-			for (String token : tokens) {
-				if (target.equalsIgnoreCase(token.trim())) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * This only works for tokens. Quoted strings need more sophisticated
-	 * parsing.
-	 */
-	protected List<String> getTokensFromHeader(HttpServletRequest req,
-	                                           String headerName) {
-		List<String> result = new ArrayList<String>();
-
-		Enumeration<String> headers = req.getHeaders(headerName);
-		while (headers.hasMoreElements()) {
-			String header = headers.nextElement();
-			String[] tokens = header.split(",");
-			for (String token : tokens) {
-				result.add(token.trim());
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Intended to be overridden by sub-classes that wish to verify the origin
-	 * of a WebSocket request before processing it.
-	 *
-	 * @param origin    The value of the origin header from the request which
-	 *                  may be <code>null</code>
-	 *
-	 * @return  <code>true</code> to accept the request. <code>false</code> to
-	 *          reject it. This default implementation always returns
-	 *          <code>true</code>.
-	 */
-	protected boolean verifyOrigin(String origin) {
-		return true;
-	}
-
-	/**
-	 * Intended to be overridden by sub-classes that wish to select a
-	 * sub-protocol if the client provides a list of supported protocols.
-	 *
-	 * @param subProtocols  The list of sub-protocols supported by the client
-	 *                      in client preference order. The server is under no
-	 *                      obligation to respect the declared preference
-	 * @return  <code>null</code> if no sub-protocol is selected or the name of
-	 *          the protocol which <b>must</b> be one of the protocols listed by
-	 *          the client. This default implementation always returns
-	 *          <code>null</code>.
-	 */
-	protected String selectSubProtocol(List<String> subProtocols) {
-		return null;
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/AbstractUpgradeFilter.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/AbstractUpgradeFilter.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/AbstractUpgradeFilter.java
new file mode 100644
index 0000000..0485170
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/AbstractUpgradeFilter.java
@@ -0,0 +1,197 @@
+/*
+ * 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;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.wicket.ThreadContext;
+import org.apache.wicket.protocol.http.WicketFilter;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.http.WebResponse;
+
+/**
+ * An extension of WicketFilter that is used to check whether
+ * the processed HttpServletRequest needs to upgrade its protocol
+ * from HTTP to something else
+ *
+ * @since 6.0
+ */
+public class AbstractUpgradeFilter extends WicketFilter
+{
+
+	protected boolean processRequestCycle(final RequestCycle requestCycle, final WebResponse webResponse,
+			final HttpServletRequest httpServletRequest, final HttpServletResponse httpServletResponse,
+			final FilterChain chain)
+		throws IOException, ServletException {
+
+		// Assume we are able to handle the request
+		boolean res = true;
+
+		ThreadContext.setRequestCycle(requestCycle);
+
+		if (acceptWebSocket(httpServletRequest, httpServletResponse) || httpServletResponse.isCommitted())
+		{
+			res = true;
+		}
+		else if (!requestCycle.processRequestAndDetach() && !httpServletResponse.isCommitted())
+		{
+			if (chain != null)
+			{
+				chain.doFilter(httpServletRequest, httpServletResponse);
+			}
+			res = false;
+		}
+		else
+		{
+			webResponse.flush();
+		}
+
+		return res;
+	}
+
+	protected boolean acceptWebSocket(HttpServletRequest req, HttpServletResponse resp)
+			throws ServletException, IOException
+	{
+		// Information required to send the server handshake message
+		String key;
+		String subProtocol = null;
+		List<String> extensions = Collections.emptyList();
+
+		if (!headerContainsToken(req, "upgrade", "websocket")) {
+//			resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
+			return false;
+		}
+
+		if (!headerContainsToken(req, "connection", "upgrade")) {
+			resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
+			return false;
+		}
+
+		if (!headerContainsToken(req, "sec-websocket-version", "13")) {
+			resp.setStatus(426);
+			resp.setHeader("Sec-WebSocket-Version", "13");
+			return false;
+		}
+
+		key = req.getHeader("Sec-WebSocket-Key");
+		if (key == null) {
+			resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
+			return false;
+		}
+
+		String origin = req.getHeader("Origin");
+		if (!verifyOrigin(origin)) {
+			resp.sendError(HttpServletResponse.SC_FORBIDDEN);
+			return false;
+		}
+
+		List<String> subProtocols = getTokensFromHeader(req,
+				"Sec-WebSocket-Protocol-Client");
+		if (!subProtocols.isEmpty()) {
+			subProtocol = selectSubProtocol(subProtocols);
+
+		}
+
+		resp.setHeader("upgrade", "websocket");
+		resp.setHeader("connection", "upgrade");
+
+		if (subProtocol != null) {
+			resp.setHeader("Sec-WebSocket-Protocol", subProtocol);
+		}
+
+
+		return true;
+	}
+
+	/*
+	 * This only works for tokens. Quoted strings need more sophisticated
+	 * parsing.
+	 */
+	private boolean headerContainsToken(HttpServletRequest req,
+	                                    String headerName, String target) {
+		Enumeration<String> headers = req.getHeaders(headerName);
+		while (headers.hasMoreElements()) {
+			String header = headers.nextElement();
+			String[] tokens = header.split(",");
+			for (String token : tokens) {
+				if (target.equalsIgnoreCase(token.trim())) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/*
+	 * This only works for tokens. Quoted strings need more sophisticated
+	 * parsing.
+	 */
+	protected List<String> getTokensFromHeader(HttpServletRequest req,
+	                                           String headerName) {
+		List<String> result = new ArrayList<String>();
+
+		Enumeration<String> headers = req.getHeaders(headerName);
+		while (headers.hasMoreElements()) {
+			String header = headers.nextElement();
+			String[] tokens = header.split(",");
+			for (String token : tokens) {
+				result.add(token.trim());
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Intended to be overridden by sub-classes that wish to verify the origin
+	 * of a WebSocket request before processing it.
+	 *
+	 * @param origin    The value of the origin header from the request which
+	 *                  may be <code>null</code>
+	 *
+	 * @return  <code>true</code> to accept the request. <code>false</code> to
+	 *          reject it. This default implementation always returns
+	 *          <code>true</code>.
+	 */
+	protected boolean verifyOrigin(String origin) {
+		return true;
+	}
+
+	/**
+	 * Intended to be overridden by sub-classes that wish to select a
+	 * sub-protocol if the client provides a list of supported protocols.
+	 *
+	 * @param subProtocols  The list of sub-protocols supported by the client
+	 *                      in client preference order. The server is under no
+	 *                      obligation to respect the declared preference
+	 * @return  <code>null</code> if no sub-protocol is selected or the name of
+	 *          the protocol which <b>must</b> be one of the protocols listed by
+	 *          the client. This default implementation always returns
+	 *          <code>null</code>.
+	 */
+	protected String selectSubProtocol(List<String> subProtocols) {
+		return null;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
index 15c4647..a61ec34 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
@@ -22,7 +22,6 @@ import org.apache.wicket.Application;
 import org.apache.wicket.Page;
 import org.apache.wicket.Session;
 import org.apache.wicket.ThreadContext;
-import org.apache.wicket.ajax.WebSocketRequestHandler;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.page.IPageManager;
 import org.apache.wicket.protocol.ws.IWebSocketSettings;

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketRequestHandler.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketRequestHandler.java
new file mode 100644
index 0000000..ba8ec9e
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketRequestHandler.java
@@ -0,0 +1,45 @@
+/*
+ * 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.api;
+
+/**
+ * An interface for outbound communication with web socket clients
+ *
+ * @since 6.0
+ */
+public interface IWebSocketRequestHandler
+{
+	/**
+	 * Pushes a text message to the client.
+	 *
+	 * @param message
+	 *      the text message to push to the client if the web socket connection is open
+	 */
+	void push(CharSequence message);
+
+	/**
+	 * Pushes a binary message to the client.
+	 *
+	 * @param message
+	 *      the binary message to push to the client if the web socket connection is open
+	 * @param offset
+	 *      the offset to start to read from the message
+	 * @param length
+	 *      how many bytes to read from the message
+	 */
+	void push(byte[] message, int offset, int length);
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
index 7beefd2..4da8da0 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
@@ -19,7 +19,6 @@ package org.apache.wicket.protocol.ws.api;
 import java.util.Map;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.ajax.WebSocketRequestHandler;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.event.IEvent;
 import org.apache.wicket.markup.head.IHeaderResponse;

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketRequestHandler.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketRequestHandler.java
new file mode 100644
index 0000000..8151480
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketRequestHandler.java
@@ -0,0 +1,272 @@
+/*
+ * 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.api;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.Page;
+import org.apache.wicket.ajax.AbstractAjaxResponse;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.XmlAjaxResponse;
+import org.apache.wicket.core.request.handler.logger.PageLogData;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.request.ILogData;
+import org.apache.wicket.request.IRequestCycle;
+import org.apache.wicket.request.Response;
+import org.apache.wicket.request.component.IRequestablePage;
+import org.apache.wicket.request.http.WebRequest;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.string.Strings;
+import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An extension of AjaxRequestTarget that also supports pushing data from the server to the
+ * client.
+ *
+ * @since 6.0
+ */
+public class WebSocketRequestHandler implements AjaxRequestTarget, IWebSocketRequestHandler
+{
+	private static final Logger LOG = LoggerFactory.getLogger(WebSocketRequestHandler.class);
+
+	private final Page page;
+
+	private final IWebSocketConnection connection;
+
+	private final AbstractAjaxResponse ajaxResponse;
+
+	private PageLogData logData;
+
+	public WebSocketRequestHandler(final Component component, final IWebSocketConnection connection)
+	{
+		this.page = Args.notNull(component, "component").getPage();
+		this.connection = Args.notNull(connection, "connection");
+		this.ajaxResponse = new XmlAjaxResponse(page)
+		{
+			@Override
+			protected void fireOnAfterRespondListeners(Response response)
+			{
+			}
+
+			@Override
+			protected void fireOnBeforeRespondListeners()
+			{
+			}
+		};
+	}
+
+	@Override
+	public void push(CharSequence message)
+	{
+		if (connection.isOpen())
+		{
+			Args.notNull(message, "message");
+			try
+			{
+				connection.sendMessage(message.toString());
+			} catch (IOException iox)
+			{
+				LOG.error("An error occurred while pushing text message.", iox);
+			}
+		}
+		else
+		{
+			LOG.warn("The websocket connection is already closed. Cannot push the text message '{}'", message);
+		}
+	}
+
+	@Override
+	public void push(byte[] message, int offset, int length)
+	{
+		if (connection.isOpen())
+		{
+			Args.notNull(message, "message");
+			try
+			{
+				connection.sendMessage(message, offset, length);
+			} catch (IOException iox)
+			{
+				LOG.error("An error occurred while pushing binary message.", iox);
+			}
+		}
+		else
+		{
+			LOG.warn("The websocket connection is already closed. Cannot push the binary message '{}'", message);
+		}
+	}
+
+	@Override
+	public void add(Component component, String markupId)
+	{
+		ajaxResponse.add(component, markupId);
+	}
+
+	@Override
+	public void add(Component... components)
+	{
+		for (final Component component : components)
+		{
+			Args.notNull(component, "component");
+
+			if (component.getOutputMarkupId() == false)
+			{
+				throw new IllegalArgumentException(
+						"cannot update component that does not have setOutputMarkupId property set to true. Component: " +
+								component.toString());
+			}
+			add(component, component.getMarkupId());
+		}
+	}
+
+	@Override
+	public final void addChildren(MarkupContainer parent, Class<?> childCriteria)
+	{
+		Args.notNull(parent, "parent");
+		Args.notNull(childCriteria, "childCriteria");
+
+		parent.visitChildren(childCriteria, new IVisitor<Component, Void>()
+		{
+			@Override
+			public void component(final Component component, final IVisit<Void> visit)
+			{
+				add(component);
+				visit.dontGoDeeper();
+			}
+		});
+	}
+
+	@Override
+	public void addListener(IListener listener)
+	{
+	}
+
+	@Override
+	public void appendJavaScript(CharSequence javascript)
+	{
+		ajaxResponse.appendJavaScript(javascript);
+	}
+
+	@Override
+	public void prependJavaScript(CharSequence javascript)
+	{
+		ajaxResponse.prependJavaScript(javascript);
+	}
+
+	@Override
+	public void registerRespondListener(ITargetRespondListener listener)
+	{
+	}
+
+	@Override
+	public Collection<? extends Component> getComponents()
+	{
+		return ajaxResponse.getComponents();
+	}
+
+	@Override
+	public final void focusComponent(Component component)
+	{
+		if (component != null && component.getOutputMarkupId() == false)
+		{
+			throw new IllegalArgumentException(
+					"cannot update component that does not have setOutputMarkupId property set to true. Component: " +
+							component.toString());
+		}
+		final String id = component != null ? ("'" + component.getMarkupId() + "'") : "null";
+		appendJavaScript("Wicket.Focus.setFocusOnId(" + id + ");");
+	}
+
+	@Override
+	public IHeaderResponse getHeaderResponse()
+	{
+		return ajaxResponse.getHeaderResponse();
+	}
+
+	@Override
+	public String getLastFocusedElementId()
+	{
+		WebRequest request = (WebRequest) page.getRequest();
+		String id = request.getHeader("Wicket-FocusedElementId");
+		return Strings.isEmpty(id) ? null : id;
+	}
+
+	@Override
+	public Page getPage()
+	{
+		return page;
+	}
+
+	@Override
+	public Integer getPageId()
+	{
+		return page.getPageId();
+	}
+
+	@Override
+	public boolean isPageInstanceCreated()
+	{
+		return true;
+	}
+
+	@Override
+	public Integer getRenderCount()
+	{
+		return page.getRenderCount();
+	}
+
+	@Override
+	public ILogData getLogData()
+	{
+		return logData;
+	}
+
+	@Override
+	public Class<? extends IRequestablePage> getPageClass()
+	{
+		return page.getPageClass();
+	}
+
+	@Override
+	public PageParameters getPageParameters()
+	{
+		return page.getPageParameters();
+	}
+
+	@Override
+	public void respond(IRequestCycle requestCycle)
+	{
+		ajaxResponse.writeTo(requestCycle.getResponse(), "UTF-8");
+	}
+
+	@Override
+	public void detach(IRequestCycle requestCycle)
+	{
+		if (logData == null)
+		{
+			logData = new PageLogData(page);
+		}
+
+		ajaxResponse.detach(requestCycle);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketBinaryPayload.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketBinaryPayload.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketBinaryPayload.java
index 05dad39..25e2af2 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketBinaryPayload.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketBinaryPayload.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.protocol.ws.api.event;
 
-import org.apache.wicket.ajax.WebSocketRequestHandler;
+import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.protocol.ws.api.message.BinaryMessage;
 import org.apache.wicket.util.lang.Args;
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketClosedPayload.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketClosedPayload.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketClosedPayload.java
index 121d64c..c866083 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketClosedPayload.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketClosedPayload.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.protocol.ws.api.event;
 
-import org.apache.wicket.ajax.WebSocketRequestHandler;
+import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
 
 /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketConnectedPayload.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketConnectedPayload.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketConnectedPayload.java
index 39534b1..22753c7 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketConnectedPayload.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketConnectedPayload.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.protocol.ws.api.event;
 
-import org.apache.wicket.ajax.WebSocketRequestHandler;
+import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
 
 /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketPayload.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketPayload.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketPayload.java
index aaf46d3..4ea7546 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketPayload.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketPayload.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.protocol.ws.api.event;
 
-import org.apache.wicket.ajax.WebSocketRequestHandler;
+import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.util.lang.Args;
 
 /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketPushPayload.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketPushPayload.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketPushPayload.java
index 4e05f68..2da4137 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketPushPayload.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketPushPayload.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.protocol.ws.api.event;
 
-import org.apache.wicket.ajax.WebSocketRequestHandler;
+import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage;
 import org.apache.wicket.util.lang.Args;
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketTextPayload.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketTextPayload.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketTextPayload.java
index a5cf369..7551c2f 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketTextPayload.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketTextPayload.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.protocol.ws.api.event;
 
-import org.apache.wicket.ajax.WebSocketRequestHandler;
+import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.protocol.ws.api.message.TextMessage;
 import org.apache.wicket.util.lang.Args;
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTestPage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTestPage.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTestPage.java
index 8dacf9f..39eef88 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTestPage.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTestPage.java
@@ -17,7 +17,7 @@
 package org.apache.wicket.protocol.ws.util.tester;
 
 import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.ajax.WebSocketRequestHandler;
+import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.markup.IMarkupResourceStreamProvider;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.protocol.ws.api.WebSocketBehavior;

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/src/main/java/org/apache/wicket/protocol/http/Jetty7WebSocketFilter.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/src/main/java/org/apache/wicket/protocol/http/Jetty7WebSocketFilter.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/src/main/java/org/apache/wicket/protocol/http/Jetty7WebSocketFilter.java
deleted file mode 100644
index b906457..0000000
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/src/main/java/org/apache/wicket/protocol/http/Jetty7WebSocketFilter.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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.http;
-
-import java.io.IOException;
-
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.protocol.ws.jetty.JettyWebSocketProcessor;
-import org.eclipse.jetty.websocket.WebSocket;
-import org.eclipse.jetty.websocket.WebSocketFactory;
-
-/**
- * An upgrade filter that uses Jetty's WebSocketFactory to decide whether to upgrade or not.
- */
-public class Jetty7WebSocketFilter extends AbstractUpgradeFilter implements WebSocketFactory.Acceptor
-{
-	private WebSocketFactory _webSocketFactory;
-
-	@Override
-	public void init(final boolean isServlet, final FilterConfig filterConfig)
-		throws ServletException
-	{
-		super.init(isServlet, filterConfig);
-
-		try
-		{
-			String bs = filterConfig.getInitParameter("bufferSize");
-			_webSocketFactory = new WebSocketFactory(this, bs == null ? 8192 : Integer.parseInt(bs));
-			_webSocketFactory.start();
-
-			String max = filterConfig.getInitParameter("maxIdleTime");
-			if (max != null)
-				_webSocketFactory.setMaxIdleTime(Integer.parseInt(max));
-
-			max = filterConfig.getInitParameter("maxTextMessageSize");
-			if (max != null)
-				_webSocketFactory.setMaxTextMessageSize(Integer.parseInt(max));
-
-			max = filterConfig.getInitParameter("maxBinaryMessageSize");
-			if (max != null)
-				_webSocketFactory.setMaxBinaryMessageSize(Integer.parseInt(max));
-		}
-		catch (ServletException x)
-		{
-			throw x;
-		}
-		catch (Exception x)
-		{
-			throw new ServletException(x);
-		}
-	}
-
-	@Override
-	protected boolean acceptWebSocket(HttpServletRequest req, HttpServletResponse resp, Application application) throws ServletException, IOException
-	{
-		return super.acceptWebSocket(req, resp, application) && _webSocketFactory.acceptWebSocket(req, resp);
-	}
-
-	@Override
-	public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
-	{
-		JettyWebSocketProcessor webSocketHandler = new JettyWebSocketProcessor(request, getApplication());
-		return webSocketHandler.new JettyWebSocket();
-	}
-
-	/* ------------------------------------------------------------ */
-	@Override
-	public boolean checkOrigin(HttpServletRequest request, String origin)
-	{
-		return true;
-	}
-
-	/* ------------------------------------------------------------ */
-	@Override
-	public void destroy()
-	{
-		try
-		{
-			_webSocketFactory.stop();
-		}
-		catch (Exception x)
-		{
-			x.printStackTrace();
-		}
-
-		super.destroy();
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty7WebSocketFilter.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty7WebSocketFilter.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty7WebSocketFilter.java
new file mode 100644
index 0000000..d4f749a
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty7WebSocketFilter.java
@@ -0,0 +1,106 @@
+/*
+ * 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.jetty;
+
+import java.io.IOException;
+
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.websocket.WebSocket;
+import org.eclipse.jetty.websocket.WebSocketFactory;
+import org.apache.wicket.protocol.ws.AbstractUpgradeFilter;
+
+/**
+ * An upgrade filter that uses Jetty's WebSocketFactory to decide whether to upgrade or not.
+ */
+public class Jetty7WebSocketFilter extends AbstractUpgradeFilter implements WebSocketFactory.Acceptor
+{
+	private WebSocketFactory _webSocketFactory;
+
+	@Override
+	public void init(final boolean isServlet, final FilterConfig filterConfig)
+		throws ServletException
+	{
+		super.init(isServlet, filterConfig);
+
+		try
+		{
+			String bs = filterConfig.getInitParameter("bufferSize");
+			_webSocketFactory = new WebSocketFactory(this, bs == null ? 8192 : Integer.parseInt(bs));
+			_webSocketFactory.start();
+
+			String max = filterConfig.getInitParameter("maxIdleTime");
+			if (max != null)
+				_webSocketFactory.setMaxIdleTime(Integer.parseInt(max));
+
+			max = filterConfig.getInitParameter("maxTextMessageSize");
+			if (max != null)
+				_webSocketFactory.setMaxTextMessageSize(Integer.parseInt(max));
+
+			max = filterConfig.getInitParameter("maxBinaryMessageSize");
+			if (max != null)
+				_webSocketFactory.setMaxBinaryMessageSize(Integer.parseInt(max));
+		}
+		catch (ServletException x)
+		{
+			throw x;
+		}
+		catch (Exception x)
+		{
+			throw new ServletException(x);
+		}
+	}
+
+	@Override
+	protected boolean acceptWebSocket(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+	{
+		return super.acceptWebSocket(req, resp) && _webSocketFactory.acceptWebSocket(req, resp);
+	}
+
+	@Override
+	public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
+	{
+		JettyWebSocketProcessor webSocketHandler = new JettyWebSocketProcessor(request, getApplication());
+		return webSocketHandler.new JettyWebSocket();
+	}
+
+	/* ------------------------------------------------------------ */
+	@Override
+	public boolean checkOrigin(HttpServletRequest request, String origin)
+	{
+		return true;
+	}
+
+	/* ------------------------------------------------------------ */
+	@Override
+	public void destroy()
+	{
+		try
+		{
+			_webSocketFactory.stop();
+		}
+		catch (Exception x)
+		{
+			x.printStackTrace();
+		}
+
+		super.destroy();
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/http/Jetty9WebSocketFilter.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/http/Jetty9WebSocketFilter.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/http/Jetty9WebSocketFilter.java
deleted file mode 100644
index 2ecfb7a..0000000
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/http/Jetty9WebSocketFilter.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * 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.http;
-
-import java.io.IOException;
-
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.protocol.ws.jetty.Jetty9WebSocketProcessor;
-import org.eclipse.jetty.websocket.core.api.UpgradeRequest;
-import org.eclipse.jetty.websocket.core.api.UpgradeResponse;
-import org.eclipse.jetty.websocket.core.api.WebSocketPolicy;
-import org.eclipse.jetty.websocket.server.WebSocketCreator;
-import org.eclipse.jetty.websocket.server.WebSocketServerFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * An upgrade filter that uses Jetty9's WebSocketServerFactory to decide whether to upgrade or not.
- */
-public class Jetty9WebSocketFilter extends AbstractUpgradeFilter
-{
-	private static final Logger LOG = LoggerFactory.getLogger(Jetty9WebSocketFilter.class);
-
-	private WebSocketServerFactory _webSocketFactory;
-
-	@Override
-	public void init(final boolean isServlet, final FilterConfig filterConfig)
-		throws ServletException
-	{
-		super.init(isServlet, filterConfig);
-
-		try
-		{
-			WebSocketPolicy serverPolicy = WebSocketPolicy.newServerPolicy();
-			String bs = filterConfig.getInitParameter("bufferSize");
-			if (bs != null)
-				serverPolicy.setBufferSize(Integer.parseInt(bs));
-			String max = filterConfig.getInitParameter("maxIdleTime");
-			if (max != null)
-				serverPolicy.setIdleTimeout(Integer.parseInt(max));
-
-			max = filterConfig.getInitParameter("maxTextMessageSize");
-			if (max != null)
-				serverPolicy.setMaxTextMessageSize(Integer.parseInt(max));
-
-			max = filterConfig.getInitParameter("maxBinaryMessageSize");
-			if (max != null)
-				serverPolicy.setMaxBinaryMessageSize(Integer.parseInt(max));
-			_webSocketFactory = new WebSocketServerFactory(serverPolicy);
-
-			_webSocketFactory.setCreator(new WebSocketCreator()
-			{
-				@Override
-				public Object createWebSocket(UpgradeRequest upgradeRequest,
-					UpgradeResponse upgradeResponse)
-				{
-					return new Jetty9WebSocketProcessor(upgradeRequest, upgradeResponse,
-						getApplication());
-				}
-			});
-
-			_webSocketFactory.start();
-		}
-		catch (ServletException x)
-		{
-			throw x;
-		}
-		catch (Exception x)
-		{
-			throw new ServletException(x);
-		}
-	}
-
-	@Override
-	protected boolean acceptWebSocket(HttpServletRequest req, HttpServletResponse resp,
-		Application application) throws ServletException, IOException
-	{
-		return super.acceptWebSocket(req, resp, application) &&
-			_webSocketFactory.acceptWebSocket(req, resp);
-	}
-
-	/* ------------------------------------------------------------ */
-	@Override
-	public void destroy()
-	{
-		try
-		{
-			if (_webSocketFactory != null)
-			{
-				_webSocketFactory.stop();
-			}
-		}
-		catch (Exception x)
-		{
-			LOG.warn("A problem occurred while stopping the web socket factory", x);
-		}
-
-		super.destroy();
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty9WebSocketConnection.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty9WebSocketConnection.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty9WebSocketConnection.java
deleted file mode 100644
index 01f5d98..0000000
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty9WebSocketConnection.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * 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.jetty;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.util.concurrent.ExecutionException;
-
-import org.apache.wicket.protocol.ws.api.AbstractWebSocketConnection;
-import org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor;
-import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
-import org.apache.wicket.util.lang.Args;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.FutureCallback;
-import org.eclipse.jetty.websocket.core.api.WebSocketConnection;
-
-/**
- * A wrapper around Jetty9's native WebSocketConnection.
- *
- * @since 6.2
- */
-public class Jetty9WebSocketConnection extends AbstractWebSocketConnection
-{
-	private final WebSocketConnection connection;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param connection
-	 *            the jetty websocket connection
-	 */
-	public Jetty9WebSocketConnection(WebSocketConnection connection, AbstractWebSocketProcessor webSocketProcessor)
-	{
-		super(webSocketProcessor);
-		this.connection = Args.notNull(connection, "connection");
-	}
-
-	@Override
-	public boolean isOpen()
-	{
-		return connection.isOpen();
-	}
-
-	@Override
-	public void close(int code, String reason)
-	{
-		if (isOpen())
-		{
-			connection.close(code, reason);
-		}
-	}
-
-	@Override
-	public IWebSocketConnection sendMessage(String message) throws IOException
-	{
-		checkClosed();
-
-		FutureCallback<Void> waiter = new FutureCallback<Void>();
-		connection.write(null, waiter, message);
-		waitForMessageSent(waiter);
-		return this;
-	}
-
-	@Override
-	public IWebSocketConnection sendMessage(byte[] message, int offset, int length)
-		throws IOException
-	{
-		checkClosed();
-
-		FutureCallback<Void> waiter = new FutureCallback<Void>();
-		connection.write(null, new Callback.Empty<Void>(), message, offset, length);
-		waitForMessageSent(waiter);
-		return this;
-	}
-
-	private void waitForMessageSent(FutureCallback<?> waiter) throws IOException
-	{
-		try
-		{
-			waiter.get();
-		}
-		catch (InterruptedException e)
-		{
-			throw new InterruptedIOException();
-		}
-		catch (ExecutionException e)
-		{
-			FutureCallback.rethrow(e);
-		}
-	}
-
-	private void checkClosed()
-	{
-		if (!isOpen())
-		{
-			throw new IllegalStateException("The connection is closed.");
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty9WebSocketProcessor.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty9WebSocketProcessor.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty9WebSocketProcessor.java
deleted file mode 100644
index a2a3734..0000000
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty/Jetty9WebSocketProcessor.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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.jetty;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor;
-import org.eclipse.jetty.websocket.core.annotations.WebSocket;
-import org.eclipse.jetty.websocket.core.api.UpgradeRequest;
-import org.eclipse.jetty.websocket.core.api.UpgradeResponse;
-import org.eclipse.jetty.websocket.core.api.WebSocketConnection;
-import org.eclipse.jetty.websocket.core.api.WebSocketException;
-import org.eclipse.jetty.websocket.core.api.WebSocketListener;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * An {@link org.apache.wicket.protocol.ws.api.IWebSocketProcessor processor} that integrates with
- * Jetty 9.x {@link WebSocket web socket} implementation.
- *
- * @since 6.2
- */
-public class Jetty9WebSocketProcessor extends AbstractWebSocketProcessor
-	implements
-		WebSocketListener
-{
-	private static final Logger LOG = LoggerFactory.getLogger(Jetty9WebSocketProcessor.class);
-
-	/**
-	 * Constructor.
-	 *
-	 * @param upgradeRequest
-	 *            the jetty upgrade request
-	 * @param upgradeResponse
-	 *            the jetty upgrade response
-	 * @param application
-	 *            the current Wicket Application
-	 */
-	public Jetty9WebSocketProcessor(final UpgradeRequest upgradeRequest,
-		final UpgradeResponse upgradeResponse, final Application application)
-	{
-		super((HttpServletRequest)((HttpServletRequestWrapper)upgradeRequest).getRequest(),
-			application);
-	}
-
-	@Override
-	public void onWebSocketConnect(WebSocketConnection connection)
-	{
-		onConnect(new Jetty9WebSocketConnection(connection, this));
-	}
-
-	@Override
-	public void onWebSocketText(String message)
-	{
-		onMessage(message);
-	}
-
-	@Override
-	public void onWebSocketBinary(byte[] payload, int offset, int len)
-	{
-		onMessage(payload, offset, len);
-	}
-
-	@Override
-	public void onWebSocketClose(int statusCode, String reason)
-	{
-		onClose(statusCode, reason);
-	}
-
-	@Override
-	public void onWebSocketException(WebSocketException error)
-	{
-		LOG.error("An error occurred when using WebSocket.", error);
-	}
-
-	@Override
-	public void onOpen(Object connection)
-	{
-		if (!(connection instanceof WebSocketConnection))
-		{
-			throw new IllegalArgumentException(WebSocketConnection.class.getName() +
-				" can work only with " + WebSocketConnection.class.getName());
-		}
-		onWebSocketConnect((WebSocketConnection)connection);
-	}
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketConnection.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketConnection.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketConnection.java
new file mode 100644
index 0000000..a57bcad
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketConnection.java
@@ -0,0 +1,113 @@
+/*
+ * 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.jetty9;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.util.concurrent.ExecutionException;
+
+import org.apache.wicket.protocol.ws.api.AbstractWebSocketConnection;
+import org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor;
+import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
+import org.apache.wicket.util.lang.Args;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.FutureCallback;
+import org.eclipse.jetty.websocket.core.api.WebSocketConnection;
+
+/**
+ * A wrapper around Jetty9's native WebSocketConnection.
+ *
+ * @since 6.2
+ */
+public class Jetty9WebSocketConnection extends AbstractWebSocketConnection
+{
+	private final WebSocketConnection connection;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param connection
+	 *            the jetty websocket connection
+	 */
+	public Jetty9WebSocketConnection(WebSocketConnection connection, AbstractWebSocketProcessor webSocketProcessor)
+	{
+		super(webSocketProcessor);
+		this.connection = Args.notNull(connection, "connection");
+	}
+
+	@Override
+	public boolean isOpen()
+	{
+		return connection.isOpen();
+	}
+
+	@Override
+	public void close(int code, String reason)
+	{
+		if (isOpen())
+		{
+			connection.close(code, reason);
+		}
+	}
+
+	@Override
+	public IWebSocketConnection sendMessage(String message) throws IOException
+	{
+		checkClosed();
+
+		FutureCallback<Void> waiter = new FutureCallback<Void>();
+		connection.write(null, waiter, message);
+		waitForMessageSent(waiter);
+		return this;
+	}
+
+	@Override
+	public IWebSocketConnection sendMessage(byte[] message, int offset, int length)
+		throws IOException
+	{
+		checkClosed();
+
+		FutureCallback<Void> waiter = new FutureCallback<Void>();
+		connection.write(null, new Callback.Empty<Void>(), message, offset, length);
+		waitForMessageSent(waiter);
+		return this;
+	}
+
+	private void waitForMessageSent(FutureCallback<?> waiter) throws IOException
+	{
+		try
+		{
+			waiter.get();
+		}
+		catch (InterruptedException e)
+		{
+			throw new InterruptedIOException();
+		}
+		catch (ExecutionException e)
+		{
+			FutureCallback.rethrow(e);
+		}
+	}
+
+	private void checkClosed()
+	{
+		if (!isOpen())
+		{
+			throw new IllegalStateException("The connection is closed.");
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/6540f025/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketFilter.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketFilter.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketFilter.java
new file mode 100644
index 0000000..fd67ce5
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/src/main/java/org/apache/wicket/protocol/ws/jetty9/Jetty9WebSocketFilter.java
@@ -0,0 +1,117 @@
+/*
+ * 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.jetty9;
+
+import java.io.IOException;
+
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.wicket.protocol.ws.AbstractUpgradeFilter;
+import org.eclipse.jetty.websocket.core.api.UpgradeRequest;
+import org.eclipse.jetty.websocket.core.api.UpgradeResponse;
+import org.eclipse.jetty.websocket.core.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.server.WebSocketCreator;
+import org.eclipse.jetty.websocket.server.WebSocketServerFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An upgrade filter that uses Jetty9's WebSocketServerFactory to decide whether to upgrade or not.
+ */
+public class Jetty9WebSocketFilter extends AbstractUpgradeFilter
+{
+	private static final Logger LOG = LoggerFactory.getLogger(Jetty9WebSocketFilter.class);
+
+	private WebSocketServerFactory _webSocketFactory;
+
+	@Override
+	public void init(final boolean isServlet, final FilterConfig filterConfig)
+		throws ServletException
+	{
+		super.init(isServlet, filterConfig);
+
+		try
+		{
+			WebSocketPolicy serverPolicy = WebSocketPolicy.newServerPolicy();
+			String bs = filterConfig.getInitParameter("bufferSize");
+			if (bs != null)
+				serverPolicy.setBufferSize(Integer.parseInt(bs));
+			String max = filterConfig.getInitParameter("maxIdleTime");
+			if (max != null)
+				serverPolicy.setIdleTimeout(Integer.parseInt(max));
+
+			max = filterConfig.getInitParameter("maxTextMessageSize");
+			if (max != null)
+				serverPolicy.setMaxTextMessageSize(Integer.parseInt(max));
+
+			max = filterConfig.getInitParameter("maxBinaryMessageSize");
+			if (max != null)
+				serverPolicy.setMaxBinaryMessageSize(Integer.parseInt(max));
+			_webSocketFactory = new WebSocketServerFactory(serverPolicy);
+
+			_webSocketFactory.setCreator(new WebSocketCreator()
+			{
+				@Override
+				public Object createWebSocket(UpgradeRequest upgradeRequest,
+					UpgradeResponse upgradeResponse)
+				{
+					return new Jetty9WebSocketProcessor(upgradeRequest, upgradeResponse,
+						getApplication());
+				}
+			});
+
+			_webSocketFactory.start();
+		}
+		catch (ServletException x)
+		{
+			throw x;
+		}
+		catch (Exception x)
+		{
+			throw new ServletException(x);
+		}
+	}
+
+	@Override
+	protected boolean acceptWebSocket(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+	{
+		return super.acceptWebSocket(req, resp) &&
+			_webSocketFactory.acceptWebSocket(req, resp);
+	}
+
+	/* ------------------------------------------------------------ */
+	@Override
+	public void destroy()
+	{
+		try
+		{
+			if (_webSocketFactory != null)
+			{
+				_webSocketFactory.stop();
+			}
+		}
+		catch (Exception x)
+		{
+			LOG.warn("A problem occurred while stopping the web socket factory", x);
+		}
+
+		super.destroy();
+	}
+}