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();
+ }
+}