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 2013/11/21 15:16:06 UTC
git commit: WICKET-5423 Create IResource based implementation of
Native Web Sockets
Updated Branches:
refs/heads/master e04cac45d -> ff6a79e51
WICKET-5423 Create IResource based implementation of Native Web Sockets
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/ff6a79e5
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/ff6a79e5
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/ff6a79e5
Branch: refs/heads/master
Commit: ff6a79e5183317af3acf281025b009c5145c3007
Parents: e04cac4
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Nov 21 16:04:54 2013 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Nov 21 16:04:54 2013 +0200
----------------------------------------------------------------------
pom.xml | 8 +-
.../java/org/apache/wicket/SharedResources.java | 16 ++-
.../wicket-native-websocket/pom.xml | 2 +-
.../wicket-native-websocket-core/pom.xml | 3 +-
.../ws/api/AbstractWebSocketProcessor.java | 132 +++++++++++++++--
.../protocol/ws/api/BaseWebSocketBehavior.java | 114 +++++++++++++++
.../ws/api/IWebSocketConnectionRegistry.java | 20 +--
.../api/SimpleWebSocketConnectionRegistry.java | 36 ++---
.../protocol/ws/api/WebSocketBehavior.java | 53 ++-----
.../ws/api/WebSocketPushBroadcaster.java | 5 +-
.../protocol/ws/api/WebSocketResource.java | 85 +++++++++++
.../protocol/ws/api/message/ClosedMessage.java | 11 +-
.../ws/api/message/ConnectedMessage.java | 11 +-
.../wicket/protocol/ws/api/registry/IKey.java | 24 ++++
.../protocol/ws/api/registry/PageIdKey.java | 51 +++++++
.../ws/api/registry/ResourceNameKey.java | 51 +++++++
.../ws/api/res/js/wicket-websocket-jquery.js | 7 +-
.../api/res/js/wicket-websocket-setup.js.tmpl | 5 +-
.../ws/util/tester/WebSocketTesterTest.java | 3 +-
.../wicket-native-websocket-javax/pom.xml | 3 +-
.../wicket/protocol/ws/javax/app/HomePage.html | 7 +-
.../wicket/protocol/ws/javax/app/HomePage.java | 9 --
.../ws/javax/app/JSR356Application.java | 6 +
.../ws/javax/app/WebSocketBehaviorDemoPage.html | 18 +++
.../ws/javax/app/WebSocketBehaviorDemoPage.java | 43 ++++++
.../ws/javax/app/WebSocketResourceDemoPage.html | 18 +++
.../ws/javax/app/WebSocketResourceDemoPage.java | 32 +++++
.../ws/javax/app/charts/ChartUpdater.java | 140 +++++++++++++++++++
.../app/charts/ChartWebSocketResource.java | 36 +++++
.../ws/javax/app/charts/WebSocketChart.java | 123 ----------------
.../wicket-native-websocket-jetty/pom.xml | 3 +-
.../wicket-native-websocket-jetty9/pom.xml | 3 +-
.../wicket-native-websocket-tomcat/pom.xml | 3 +-
33 files changed, 836 insertions(+), 245 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 12d005d..b00878e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -328,25 +328,25 @@
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-native-websocket-core</artifactId>
- <version>0.9-SNAPSHOT</version>
+ <version>0.16-SNAPSHOT</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-native-websocket-jetty</artifactId>
- <version>0.9-SNAPSHOT</version>
+ <version>0.16-SNAPSHOT</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-native-websocket-jetty9</artifactId>
- <version>0.9-SNAPSHOT</version>
+ <version>0.16-SNAPSHOT</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-native-websocket-tomcat</artifactId>
- <version>0.9-SNAPSHOT</version>
+ <version>0.16-SNAPSHOT</version>
<type>jar</type>
</dependency>
<dependency>
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-core/src/main/java/org/apache/wicket/SharedResources.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/SharedResources.java b/wicket-core/src/main/java/org/apache/wicket/SharedResources.java
index 0173ac9..68fe470 100644
--- a/wicket-core/src/main/java/org/apache/wicket/SharedResources.java
+++ b/wicket-core/src/main/java/org/apache/wicket/SharedResources.java
@@ -22,6 +22,7 @@ import org.apache.wicket.request.resource.IResource;
import org.apache.wicket.request.resource.ResourceReference;
import org.apache.wicket.request.resource.ResourceReference.Key;
import org.apache.wicket.request.resource.ResourceReferenceRegistry;
+import org.apache.wicket.util.lang.Args;
/**
* Class which holds shared resources. Resources can be shared by name. An optional scope can be
@@ -44,7 +45,7 @@ public class SharedResources
*/
public SharedResources(ResourceReferenceRegistry registry)
{
- this.registry = registry;
+ this.registry = Args.notNull(registry, "registry");
}
/**
@@ -123,6 +124,19 @@ public class SharedResources
}
/**
+ * Resolves a {@link ResourceReference} for a shared resource by using
+ * {@link org.apache.wicket.Application} as a scope and {@code null} for
+ * locale, style and variation.
+ *
+ * @param name
+ * Logical name of resource
+ */
+ public final ResourceReference get(String name)
+ {
+ return get(Application.class, name, null, null, null, false);
+ }
+
+ /**
* Resolves a {@link ResourceReference} for a shared resource.
*
* @param scope
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/pom.xml
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/pom.xml b/wicket-experimental/wicket-native-websocket/pom.xml
index a2f8c05..be3b275 100644
--- a/wicket-experimental/wicket-native-websocket/pom.xml
+++ b/wicket-experimental/wicket-native-websocket/pom.xml
@@ -24,7 +24,7 @@
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>wicket-native-websocket</artifactId>
- <version>0.9-SNAPSHOT</version>
+ <version>0.16-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Wicket Native WebSocket Parent</name>
<description>Wicket Native WebSocket provides native integration for WebSocket support with Servlet web containers.</description>
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/pom.xml
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/pom.xml b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/pom.xml
index 5b6c888..72c22b6 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/pom.xml
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/pom.xml
@@ -21,13 +21,12 @@
<parent>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-native-websocket</artifactId>
- <version>0.9-SNAPSHOT</version>
+ <version>0.16-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>wicket-native-websocket-core</artifactId>
<packaging>jar</packaging>
- <version>0.9-SNAPSHOT</version>
<name>Wicket Native WebSocket Core</name>
<description>Provides the common code needed for the different integrations with web container's WebSocket implementations</description>
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/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 3ac7625..2dade93 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
@@ -21,10 +21,13 @@ import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import org.apache.wicket.Application;
+import org.apache.wicket.MarkupContainer;
import org.apache.wicket.Page;
import org.apache.wicket.Session;
import org.apache.wicket.ThreadContext;
import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.page.IPageManager;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.protocol.http.WicketFilter;
@@ -41,13 +44,23 @@ import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
import org.apache.wicket.protocol.ws.api.message.IWebSocketMessage;
import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage;
import org.apache.wicket.protocol.ws.api.message.TextMessage;
+import org.apache.wicket.protocol.ws.api.registry.IKey;
+import org.apache.wicket.protocol.ws.api.registry.PageIdKey;
+import org.apache.wicket.protocol.ws.api.registry.ResourceNameKey;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.cycle.RequestCycleContext;
import org.apache.wicket.request.http.WebRequest;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.request.resource.SharedResourceReference;
import org.apache.wicket.session.ISessionStore;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.lang.Checks;
+import org.apache.wicket.util.lang.Classes;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.apache.wicket.util.string.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -61,6 +74,11 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
{
private static final Logger LOG = LoggerFactory.getLogger(AbstractWebSocketProcessor.class);
+ /**
+ * A pageId indicating that the endpoint is WebSocketResource
+ */
+ private static final int NO_PAGE_ID = -1;
+
private static final Method GET_FILTER_PATH_METHOD;
static
{
@@ -76,6 +94,7 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
private final WebRequest webRequest;
private final int pageId;
+ private final String resourceName;
private final Url baseUrl;
private final WebApplication application;
private final String sessionId;
@@ -94,8 +113,19 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
this.sessionId = request.getSession(true).getId();
String pageId = request.getParameter("pageId");
- Checks.notEmpty(pageId, "Request parameter 'pageId' is required!");
- this.pageId = Integer.parseInt(pageId, 10);
+ resourceName = request.getParameter("resourceName");
+ if (Strings.isEmpty(pageId) && Strings.isEmpty(resourceName))
+ {
+ throw new IllegalArgumentException("The request should have either 'pageId' or 'resourceName' parameter!");
+ }
+ if (Strings.isEmpty(pageId) == false)
+ {
+ this.pageId = Integer.parseInt(pageId, 10);
+ }
+ else
+ {
+ this.pageId = NO_PAGE_ID;
+ }
String baseUrl = request.getParameter(WebRequest.PARAM_AJAX_BASE_URL);
Checks.notNull(baseUrl, String.format("Request parameter '%s' is required!", WebRequest.PARAM_AJAX_BASE_URL));
@@ -145,15 +175,17 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
*/
protected final void onConnect(final IWebSocketConnection connection)
{
- connectionRegistry.setConnection(getApplication(), getSessionId(), pageId, connection);
- broadcastMessage(new ConnectedMessage(getApplication(), getSessionId(), pageId));
+ IKey key = getRegistryKey();
+ connectionRegistry.setConnection(getApplication(), getSessionId(), key, connection);
+ broadcastMessage(new ConnectedMessage(getApplication(), getSessionId(), key));
}
@Override
public void onClose(int closeCode, String message)
{
- broadcastMessage(new ClosedMessage(getApplication(), getSessionId(), pageId));
- connectionRegistry.removeConnection(getApplication(), getSessionId(), pageId);
+ IKey key = getRegistryKey();
+ broadcastMessage(new ClosedMessage(getApplication(), getSessionId(), key));
+ connectionRegistry.removeConnection(getApplication(), getSessionId(), key);
}
/**
@@ -170,7 +202,8 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
*/
public final void broadcastMessage(final IWebSocketMessage message)
{
- IWebSocketConnection connection = connectionRegistry.getConnection(application, sessionId, pageId);
+ IKey key = getRegistryKey();
+ IWebSocketConnection connection = connectionRegistry.getConnection(application, sessionId, key);
if (connection != null && connection.isOpen())
{
@@ -213,12 +246,13 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
IPageManager pageManager = session.getPageManager();
try
{
- Page page = (Page) pageManager.getPage(pageId);
+ Page page = getPage(pageManager);
+
WebSocketRequestHandler requestHandler = new WebSocketRequestHandler(page, connection);
WebSocketPayload payload = createEventPayload(message, requestHandler);
- page.send(application, Broadcast.BREADTH, payload);
+ sendPayload(payload, page);
if (!(message instanceof ConnectedMessage || message instanceof ClosedMessage))
{
@@ -254,6 +288,59 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
}
}
+ /**
+ * Sends the payload either to the page (and its WebSocketBehavior)
+ * or to the WebSocketResource with name {@linkplain #resourceName}
+ *
+ * @param payload
+ * The payload with the web socket message
+ * @param page
+ * The page that owns the WebSocketBehavior, in case of behavior usage
+ */
+ private void sendPayload(WebSocketPayload payload, Page page)
+ {
+ if (pageId != NO_PAGE_ID)
+ {
+ page.send(application, Broadcast.BREADTH, payload);
+ }
+ else
+ {
+ ResourceReference reference = new SharedResourceReference(resourceName);
+ IResource resource = reference.getResource();
+ if (resource instanceof WebSocketResource)
+ {
+ WebSocketResource wsResource = (WebSocketResource) resource;
+ wsResource.onPayload(payload);
+ }
+ else
+ {
+ throw new IllegalStateException(
+ String.format("Shared resource with name '%s' is not a %s but %s",
+ resourceName, WebSocketResource.class.getSimpleName(),
+ Classes.name(resource.getClass())));
+ }
+ }
+ }
+
+ /**
+ * @param pageManager
+ * the page manager to use when finding a page by id
+ * @return the page to use when creating WebSocketRequestHandler
+ */
+ private Page getPage(IPageManager pageManager)
+ {
+ Page page;
+ if (pageId != -1)
+ {
+ page = (Page) pageManager.getPage(pageId);
+ }
+ else
+ {
+ page = new WebSocketResourcePage();
+ }
+ return page;
+ }
+
protected final WebApplication getApplication()
{
return application;
@@ -293,4 +380,31 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
}
return payload;
}
+
+ private IKey getRegistryKey()
+ {
+ IKey key;
+ if (Strings.isEmpty(resourceName))
+ {
+ key = new PageIdKey(pageId);
+ }
+ else
+ {
+ key = new ResourceNameKey(resourceName);
+ }
+ return key;
+ }
+
+ /**
+ * A dummy page that is used to create a new WebSocketRequestHandler for
+ * web socket connections to WebSocketResource
+ */
+ private static class WebSocketResourcePage extends WebPage implements IMarkupResourceStreamProvider
+ {
+ @Override
+ public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass)
+ {
+ return new StringResourceStream("");
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/BaseWebSocketBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/BaseWebSocketBehavior.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/BaseWebSocketBehavior.java
new file mode 100644
index 0000000..d3999e9
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/BaseWebSocketBehavior.java
@@ -0,0 +1,114 @@
+/*
+ * 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.util.Map;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.lang.Generics;
+import org.apache.wicket.util.string.Strings;
+import org.apache.wicket.util.template.PackageTextTemplate;
+
+/**
+ * A behavior that contributes {@link WicketWebSocketJQueryResourceReference}
+ */
+public class BaseWebSocketBehavior extends Behavior
+{
+ private final String resourceName;
+
+ /**
+ * Constructor.
+ *
+ * Contributes WebSocket initialization code that will
+ * work with {@link org.apache.wicket.protocol.ws.api.WebSocketBehavior}
+ */
+ protected BaseWebSocketBehavior()
+ {
+ this.resourceName = null;
+ }
+
+ /**
+ * Constructor.
+ *
+ * Contributes WebSocket initialization code that will
+ * work with {@link org.apache.wicket.protocol.ws.api.WebSocketResource}
+ *
+ * To use WebSocketResource the application have to setup the
+ * resource as a shared one in its {@link org.apache.wicket.Application#init()}
+ * method:
+ * <code><pre>
+ * getSharedResources().add(resourceName, new MyWebSocketResource())
+ * </pre></code>
+ *
+ * @param resourceName
+ * the name of the shared {@link org.apache.wicket.protocol.ws.api.WebSocketResource}
+ */
+ public BaseWebSocketBehavior(String resourceName)
+ {
+ this.resourceName = Args.notEmpty(resourceName, "resourceName");
+ }
+
+ @Override
+ public void renderHead(Component component, IHeaderResponse response)
+ {
+ super.renderHead(component, response);
+
+ response.render(JavaScriptHeaderItem.forReference(WicketWebSocketJQueryResourceReference.get()));
+
+ PackageTextTemplate webSocketSetupTemplate =
+ new PackageTextTemplate(WicketWebSocketJQueryResourceReference.class,
+ "res/js/wicket-websocket-setup.js.tmpl");
+
+ Map<String, Object> variables = Generics.newHashMap();
+
+ // set falsy JS values for the non-used parameter
+ if (Strings.isEmpty(resourceName))
+ {
+ int pageId = component.getPage().getPageId();
+ variables.put("pageId", pageId);
+ variables.put("resourceName", "");
+ }
+ else
+ {
+ variables.put("resourceName", resourceName);
+ variables.put("pageId", 0);
+ }
+
+ Url baseUrl = component.getRequestCycle().getUrlRenderer().getBaseUrl();
+ CharSequence ajaxBaseUrl = Strings.escapeMarkup(baseUrl.toString());
+ variables.put("baseUrl", ajaxBaseUrl);
+
+ String contextPath = component.getRequest().getContextPath();
+ variables.put("contextPath", contextPath);
+
+ String webSocketSetupScript = webSocketSetupTemplate.asString(variables);
+
+ response.render(OnDomReadyHeaderItem.forScript(webSocketSetupScript));
+ }
+
+ @Override
+ public boolean getStatelessHint(Component component)
+ {
+ return false;
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionRegistry.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionRegistry.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionRegistry.java
index f2de9ad..8fc47b7 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionRegistry.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionRegistry.java
@@ -18,6 +18,7 @@ package org.apache.wicket.protocol.ws.api;
import java.util.Collection;
import org.apache.wicket.Application;
+import org.apache.wicket.protocol.ws.api.registry.IKey;
/**
* Tracks all currently connected WebSocket clients
@@ -31,11 +32,12 @@ public interface IWebSocketConnectionRegistry
* the web application to look in
* @param sessionId
* the web socket client session id
- * @param pageId
- * the web socket client page id
+ * @param key
+ * the web socket client key
* @return the web socket connection used by a client from the specified coordinates
*/
- IWebSocketConnection getConnection(Application application, String sessionId, Integer pageId);
+ IWebSocketConnection getConnection(Application application, String sessionId, IKey key);
+
/**
* @param application
@@ -51,12 +53,12 @@ public interface IWebSocketConnectionRegistry
* the web application to look in
* @param sessionId
* the web socket client session id
- * @param pageId
- * the web socket client page id
+ * @param key
+ * the web socket client key
* @param connection
* the web socket connection to add
*/
- void setConnection(Application application, String sessionId, Integer pageId, IWebSocketConnection connection);
+ void setConnection(Application application, String sessionId, IKey key, IWebSocketConnection connection);
/**
* Removes a web socket connection from the registry at the specified coordinates (application+session+page)
@@ -65,8 +67,8 @@ public interface IWebSocketConnectionRegistry
* the web application to look in
* @param sessionId
* the web socket client session id
- * @param pageId
- * the web socket client page id
+ * @param key
+ * the web socket client key
*/
- void removeConnection(Application application, String sessionId, Integer pageId);
+ void removeConnection(Application application, String sessionId, IKey key);
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/SimpleWebSocketConnectionRegistry.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/SimpleWebSocketConnectionRegistry.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/SimpleWebSocketConnectionRegistry.java
index 8a180f9..ab3652b 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/SimpleWebSocketConnectionRegistry.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/SimpleWebSocketConnectionRegistry.java
@@ -22,6 +22,7 @@ import java.util.concurrent.ConcurrentMap;
import org.apache.wicket.Application;
import org.apache.wicket.MetaDataKey;
+import org.apache.wicket.protocol.ws.api.registry.IKey;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.lang.Generics;
@@ -35,26 +36,26 @@ import org.apache.wicket.util.lang.Generics;
*/
public class SimpleWebSocketConnectionRegistry implements IWebSocketConnectionRegistry
{
- private static final MetaDataKey<ConcurrentMap<String, ConcurrentMap<Integer, IWebSocketConnection>>> KEY =
- new MetaDataKey<ConcurrentMap<String, ConcurrentMap<Integer, IWebSocketConnection>>>()
+ private static final MetaDataKey<ConcurrentMap<String, ConcurrentMap<IKey, IWebSocketConnection>>> KEY =
+ new MetaDataKey<ConcurrentMap<String, ConcurrentMap<IKey, IWebSocketConnection>>>()
{
};
@Override
- public IWebSocketConnection getConnection(Application application, String sessionId, Integer pageId)
+ public IWebSocketConnection getConnection(Application application, String sessionId, IKey key)
{
Args.notNull(application, "application");
Args.notNull(sessionId, "sessionId");
- Args.notNull(pageId, "pageId");
+ Args.notNull(key, "key");
IWebSocketConnection connection = null;
- ConcurrentMap<String, ConcurrentMap<Integer, IWebSocketConnection>> connectionsBySession = application.getMetaData(KEY);
+ ConcurrentMap<String, ConcurrentMap<IKey, IWebSocketConnection>> connectionsBySession = application.getMetaData(KEY);
if (connectionsBySession != null)
{
- ConcurrentMap<Integer, IWebSocketConnection> connectionsByPage = connectionsBySession.get(sessionId);
+ ConcurrentMap<IKey, IWebSocketConnection> connectionsByPage = connectionsBySession.get(sessionId);
if (connectionsByPage != null)
{
- connection = connectionsByPage.get(pageId);
+ connection = connectionsByPage.get(key);
}
}
return connection;
@@ -71,12 +72,11 @@ public class SimpleWebSocketConnectionRegistry implements IWebSocketConnectionRe
Args.notNull(application, "application");
Collection<IWebSocketConnection> connections = new ArrayList<>();
- ConcurrentMap<String, ConcurrentMap<Integer, IWebSocketConnection>> connectionsBySession = application.getMetaData(KEY);
+ ConcurrentMap<String, ConcurrentMap<IKey, IWebSocketConnection>> connectionsBySession = application.getMetaData(KEY);
if (connectionsBySession != null)
{
- for (ConcurrentMap<Integer, IWebSocketConnection> connectionsByPage : connectionsBySession.values())
+ for (ConcurrentMap<IKey, IWebSocketConnection> connectionsByPage : connectionsBySession.values())
{
-
connections.addAll(connectionsByPage.values());
}
}
@@ -84,13 +84,13 @@ public class SimpleWebSocketConnectionRegistry implements IWebSocketConnectionRe
}
@Override
- public void setConnection(Application application, String sessionId, Integer pageId, IWebSocketConnection connection)
+ public void setConnection(Application application, String sessionId, IKey key, IWebSocketConnection connection)
{
Args.notNull(application, "application");
Args.notNull(sessionId, "sessionId");
- Args.notNull(pageId, "pageId");
+ Args.notNull(key, "key");
- ConcurrentMap<String, ConcurrentMap<Integer, IWebSocketConnection>> connectionsBySession = application.getMetaData(KEY);
+ ConcurrentMap<String, ConcurrentMap<IKey, IWebSocketConnection>> connectionsBySession = application.getMetaData(KEY);
if (connectionsBySession == null)
{
synchronized (KEY)
@@ -104,7 +104,7 @@ public class SimpleWebSocketConnectionRegistry implements IWebSocketConnectionRe
}
}
- ConcurrentMap<Integer, IWebSocketConnection> connectionsByPage = connectionsBySession.get(sessionId);
+ ConcurrentMap<IKey, IWebSocketConnection> connectionsByPage = connectionsBySession.get(sessionId);
if (connectionsByPage == null && connection != null)
{
synchronized (connectionsBySession)
@@ -120,11 +120,11 @@ public class SimpleWebSocketConnectionRegistry implements IWebSocketConnectionRe
if (connection != null)
{
- connectionsByPage.put(pageId, connection);
+ connectionsByPage.put(key, connection);
}
else if (connectionsByPage != null)
{
- connectionsByPage.remove(pageId);
+ connectionsByPage.remove(key);
if (connectionsByPage.isEmpty())
{
connectionsBySession.remove(sessionId);
@@ -133,8 +133,8 @@ public class SimpleWebSocketConnectionRegistry implements IWebSocketConnectionRe
}
@Override
- public void removeConnection(Application application, String sessionId, Integer pageId)
+ public void removeConnection(Application application, String sessionId, IKey key)
{
- setConnection(application, sessionId, pageId, null);
+ setConnection(application, sessionId, key, null);
}
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/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 f7f1e5d..d33957b 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
@@ -16,14 +16,8 @@
*/
package org.apache.wicket.protocol.ws.api;
-import java.util.Map;
-
import org.apache.wicket.Component;
-import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.event.IEvent;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
-import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.protocol.ws.api.event.WebSocketBinaryPayload;
import org.apache.wicket.protocol.ws.api.event.WebSocketClosedPayload;
import org.apache.wicket.protocol.ws.api.event.WebSocketConnectedPayload;
@@ -33,22 +27,24 @@ import org.apache.wicket.protocol.ws.api.message.BinaryMessage;
import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
import org.apache.wicket.protocol.ws.api.message.TextMessage;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.util.lang.Generics;
-import org.apache.wicket.util.string.Strings;
-import org.apache.wicket.util.template.PackageTextTemplate;
/**
- * A behavior that contributes {@link WicketWebSocketJQueryResourceReference} and
- * provides optional callbacks for the WebSocket messages (connect, message, close)
+ * A behavior that provides optional callbacks for the WebSocket
+ * messages (connect, message, close)
*
* @since 6.0
*/
-public abstract class WebSocketBehavior extends Behavior
+public abstract class WebSocketBehavior extends BaseWebSocketBehavior
{
+ public WebSocketBehavior()
+ {
+ }
+
@Override
public void onEvent(Component component, IEvent<?> event)
{
+ super.onEvent(component, event);
+
Object payload = event.getPayload();
if (payload instanceof WebSocketPayload)
{
@@ -97,35 +93,4 @@ public abstract class WebSocketBehavior extends Behavior
protected void onMessage(WebSocketRequestHandler handler, BinaryMessage binaryMessage)
{
}
-
- @Override
- public void renderHead(Component component, IHeaderResponse response)
- {
- super.renderHead(component, response);
-
- response.render(JavaScriptHeaderItem.forReference(WicketWebSocketJQueryResourceReference.get()));
-
- PackageTextTemplate webSocketSetupTemplate =
- new PackageTextTemplate(WicketWebSocketJQueryResourceReference.class, "res/js/wicket-websocket-setup.js.tmpl");
- Map<String, Object> variables = Generics.newHashMap();
- int pageId = component.getPage().getPageId();
- variables.put("pageId", Integer.valueOf(pageId));
-
- Url baseUrl = component.getRequestCycle().getUrlRenderer().getBaseUrl();
- CharSequence ajaxBaseUrl = Strings.escapeMarkup(baseUrl.toString());
- variables.put("baseUrl", ajaxBaseUrl);
-
- String contextPath = component.getRequest().getContextPath();
- variables.put("contextPath", contextPath);
-
- String webSocketSetupScript = webSocketSetupTemplate.asString(variables);
-
- response.render(OnDomReadyHeaderItem.forScript(webSocketSetupScript));
- }
-
- @Override
- public boolean getStatelessHint(Component component)
- {
- return false;
- }
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketPushBroadcaster.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketPushBroadcaster.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketPushBroadcaster.java
index a2a81ef..24e4056 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketPushBroadcaster.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketPushBroadcaster.java
@@ -24,6 +24,7 @@ import org.apache.wicket.Application;
import org.apache.wicket.protocol.ws.IWebSocketSettings;
import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage;
+import org.apache.wicket.protocol.ws.api.registry.IKey;
import org.apache.wicket.protocol.ws.concurrent.Executor;
import org.apache.wicket.util.lang.Args;
@@ -68,8 +69,8 @@ public class WebSocketPushBroadcaster
Application application = connection.getApplication();
String sessionId = connection.getSessionId();
- Integer pageId = connection.getPageId();
- IWebSocketConnection wsConnection = registry.getConnection(application, sessionId, pageId);
+ IKey key = connection.getKey();
+ IWebSocketConnection wsConnection = registry.getConnection(application, sessionId, key);
if (wsConnection == null)
{
return;
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java
new file mode 100644
index 0000000..d17914c
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java
@@ -0,0 +1,85 @@
+/*
+ * 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 org.apache.wicket.protocol.ws.api.event.WebSocketBinaryPayload;
+import org.apache.wicket.protocol.ws.api.event.WebSocketClosedPayload;
+import org.apache.wicket.protocol.ws.api.event.WebSocketConnectedPayload;
+import org.apache.wicket.protocol.ws.api.event.WebSocketPayload;
+import org.apache.wicket.protocol.ws.api.event.WebSocketTextPayload;
+import org.apache.wicket.protocol.ws.api.message.BinaryMessage;
+import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
+import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
+import org.apache.wicket.protocol.ws.api.message.TextMessage;
+import org.apache.wicket.request.resource.IResource;
+
+/**
+ * An IResource that can be used as WebSocket endpoint
+ */
+public abstract class WebSocketResource implements IResource
+{
+ void onPayload(WebSocketPayload<?> payload)
+ {
+ WebSocketRequestHandler webSocketHandler = payload.getHandler();
+
+ if (payload instanceof WebSocketTextPayload)
+ {
+ WebSocketTextPayload textPayload = (WebSocketTextPayload) payload;
+ TextMessage data = textPayload.getMessage();
+ onMessage(webSocketHandler, data);
+ }
+ else if (payload instanceof WebSocketBinaryPayload)
+ {
+ WebSocketBinaryPayload binaryPayload = (WebSocketBinaryPayload) payload;
+ BinaryMessage binaryData = binaryPayload.getMessage();
+ onMessage(webSocketHandler, binaryData);
+ }
+ else if (payload instanceof WebSocketConnectedPayload)
+ {
+ WebSocketConnectedPayload connectedPayload = (WebSocketConnectedPayload) payload;
+ ConnectedMessage message = connectedPayload.getMessage();
+ onConnect(message);
+ }
+ else if (payload instanceof WebSocketClosedPayload)
+ {
+ WebSocketClosedPayload connectedPayload = (WebSocketClosedPayload) payload;
+ ClosedMessage message = connectedPayload.getMessage();
+ onClose(message);
+ }
+ }
+
+ protected void onConnect(ConnectedMessage message)
+ {
+ }
+
+ protected void onClose(ClosedMessage message)
+ {
+ }
+
+ protected void onMessage(WebSocketRequestHandler handler, TextMessage message)
+ {
+ }
+
+ protected void onMessage(WebSocketRequestHandler handler, BinaryMessage binaryMessage)
+ {
+ }
+
+ @Override
+ public final void respond(Attributes attributes)
+ {
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ClosedMessage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ClosedMessage.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ClosedMessage.java
index 9b2abc4..43046c0 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ClosedMessage.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ClosedMessage.java
@@ -17,6 +17,7 @@
package org.apache.wicket.protocol.ws.api.message;
import org.apache.wicket.Application;
+import org.apache.wicket.protocol.ws.api.registry.IKey;
import org.apache.wicket.util.lang.Args;
/**
@@ -29,13 +30,13 @@ public class ClosedMessage implements IWebSocketMessage
{
private final Application application;
private final String sessionId;
- private final Integer pageId;
+ private final IKey key;
- public ClosedMessage(Application application, String sessionId, Integer pageId)
+ public ClosedMessage(Application application, String sessionId, IKey key)
{
this.application = Args.notNull(application, "application");
this.sessionId = Args.notNull(sessionId, "sessionId");
- this.pageId = Args.notNull(pageId, "pageId");
+ this.key = Args.notNull(key, "key");
}
public Application getApplication()
@@ -48,9 +49,9 @@ public class ClosedMessage implements IWebSocketMessage
return sessionId;
}
- public Integer getPageId()
+ public IKey getKey()
{
- return pageId;
+ return key;
}
@Override
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ConnectedMessage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ConnectedMessage.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ConnectedMessage.java
index 17a142e..ab085ce 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ConnectedMessage.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ConnectedMessage.java
@@ -17,6 +17,7 @@
package org.apache.wicket.protocol.ws.api.message;
import org.apache.wicket.Application;
+import org.apache.wicket.protocol.ws.api.registry.IKey;
import org.apache.wicket.util.lang.Args;
/**
@@ -29,13 +30,13 @@ public class ConnectedMessage implements IWebSocketMessage
{
private final Application application;
private final String sessionId;
- private final Integer pageId;
+ private final IKey key;
- public ConnectedMessage(Application application, String sessionId, Integer pageId)
+ public ConnectedMessage(Application application, String sessionId, IKey key)
{
this.application = Args.notNull(application, "application");
this.sessionId = Args.notNull(sessionId, "sessionId");
- this.pageId = Args.notNull(pageId, "pageId");
+ this.key = Args.notNull(key, "key");
}
public Application getApplication()
@@ -48,9 +49,9 @@ public class ConnectedMessage implements IWebSocketMessage
return sessionId;
}
- public Integer getPageId()
+ public IKey getKey()
{
- return pageId;
+ return key;
}
@Override
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/IKey.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/IKey.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/IKey.java
new file mode 100644
index 0000000..cecda06
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/IKey.java
@@ -0,0 +1,24 @@
+/*
+ * 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.registry;
+
+/**
+ * A marker interface for keys that are used to find a web socket
+ * connection in {@link org.apache.wicket.protocol.ws.api.IWebSocketConnectionRegistry}
+ */
+public interface IKey
+{}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/PageIdKey.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/PageIdKey.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/PageIdKey.java
new file mode 100644
index 0000000..84eee23
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/PageIdKey.java
@@ -0,0 +1,51 @@
+/*
+ * 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.registry;
+
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A key based on page's id
+ */
+public class PageIdKey implements IKey
+{
+ private final Integer pageId;
+
+ public PageIdKey(Integer pageId)
+ {
+ this.pageId = Args.notNull(pageId, "pageId");
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ PageIdKey pageIdKey = (PageIdKey) o;
+
+ if (!pageId.equals(pageIdKey.pageId)) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return pageId.hashCode();
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/ResourceNameKey.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/ResourceNameKey.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/ResourceNameKey.java
new file mode 100644
index 0000000..4f45aed
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/registry/ResourceNameKey.java
@@ -0,0 +1,51 @@
+/*
+ * 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.registry;
+
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A key based on shared resource's name
+ */
+public class ResourceNameKey implements IKey
+{
+ private final String resourceName;
+
+ public ResourceNameKey(String resourceName)
+ {
+ this.resourceName = Args.notNull(resourceName, "resourceName");
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ResourceNameKey that = (ResourceNameKey) o;
+
+ if (!resourceName.equals(that.resourceName)) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return resourceName.hashCode();
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js
index 7423c47..e879663 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js
@@ -46,7 +46,12 @@
url = protocol + '//' + document.location.host + Wicket.WebSocket.contextPath + '/wicket/websocket';
- url += '?pageId=' + Wicket.WebSocket.pageId;
+ if (Wicket.WebSocket.pageId) {
+ url += '?pageId=' + Wicket.WebSocket.pageId;
+ } else if (Wicket.WebSocket.resourceName) {
+ url += '?resourceName=' + Wicket.WebSocket.resourceName;
+ }
+
url += '&wicket-ajax-baseurl=' + Wicket.WebSocket.baseUrl;
self.ws = new WebSocket(url);
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-setup.js.tmpl
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-setup.js.tmpl b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-setup.js.tmpl
index 6d2f8a3..fe81fdc 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-setup.js.tmpl
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-setup.js.tmpl
@@ -1,8 +1,9 @@
;(function(undefined) {
'use strict';
- if (!Wicket.WebSocket.pageId) {
- jQuery.extend(Wicket.WebSocket, { pageId: ${pageId}, baseUrl: '${baseUrl}', contextPath: '${contextPath}' });
+ if (!Wicket.WebSocket.key) {
+ jQuery.extend(Wicket.WebSocket, { pageId: ${pageId}, resourceName: '${resourceName}',
+ baseUrl: '${baseUrl}', contextPath: '${contextPath}' });
Wicket.WebSocket.createDefaultConnection();
}
})();
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterTest.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterTest.java
index 995bd9d..cb66c0d 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterTest.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterTest.java
@@ -25,6 +25,7 @@ import org.apache.wicket.protocol.ws.api.WebSocketPushBroadcaster;
import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage;
+import org.apache.wicket.protocol.ws.api.registry.PageIdKey;
import org.apache.wicket.util.string.Strings;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.After;
@@ -153,7 +154,7 @@ public class WebSocketTesterTest extends Assert
IWebSocketSettings webSocketSettings = IWebSocketSettings.Holder.get(tester.getApplication());
WebSocketPushBroadcaster broadcaster = new WebSocketPushBroadcaster(webSocketSettings.getConnectionRegistry());
ConnectedMessage wsMessage = new ConnectedMessage(tester.getApplication(),
- tester.getHttpSession().getId(), page.getPageId());
+ tester.getHttpSession().getId(), new PageIdKey(page.getPageId()));
broadcaster.broadcast(wsMessage, new BroadcastMessage(message));
assertEquals(true, messageReceived.get());
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/pom.xml
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/pom.xml b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/pom.xml
index 65f7d93..da05b89 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/pom.xml
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/pom.xml
@@ -21,13 +21,12 @@
<parent>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-native-websocket</artifactId>
- <version>0.9-SNAPSHOT</version>
+ <version>0.16-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>wicket-native-websocket-javax</artifactId>
<packaging>jar</packaging>
- <version>0.9-SNAPSHOT</version>
<name>Wicket Native WebSocket Javax</name>
<description>Provides the common code needed for the different integrations with web container's WebSocket implementations</description>
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/HomePage.html
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/HomePage.html b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/HomePage.html
index efb084d..c7de054 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/HomePage.html
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/HomePage.html
@@ -13,6 +13,11 @@
<h1>Apache Wicket</h1>
</div>
</div>
- <div wicket:id="chartPanel"></div>
+ <wicket:link>
+ <ul>
+ <li><a href="WebSocketBehaviorDemoPage.html">demo with WebSocketBehavior</a></li>
+ <li><a href="WebSocketResourceDemoPage.html">demo with WebSocketResource</a></li>
+ </ul>
+ </wicket:link>
</body>
</html>
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/HomePage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/HomePage.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/HomePage.java
index bfd63bb..62db885 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/HomePage.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/HomePage.java
@@ -17,17 +17,8 @@
package org.apache.wicket.protocol.ws.javax.app;
import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.protocol.ws.javax.app.charts.WebSocketChart;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
//@RequireHttps
public class HomePage extends WebPage
{
- private static final long serialVersionUID = 1L;
-
- public HomePage(final PageParameters parameters) {
- super(parameters);
-
- add(new WebSocketChart("chartPanel"));
- }
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/JSR356Application.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/JSR356Application.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/JSR356Application.java
index 6064565..9cef063 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/JSR356Application.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/JSR356Application.java
@@ -19,6 +19,7 @@ package org.apache.wicket.protocol.ws.javax.app;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.protocol.https.HttpsConfig;
import org.apache.wicket.protocol.https.HttpsMapper;
+import org.apache.wicket.protocol.ws.javax.app.charts.ChartWebSocketResource;
/**
* Application object for your web application. If you want to run this application without deploying, run the Start class.
@@ -44,6 +45,11 @@ public class JSR356Application extends WebApplication
{
super.init();
+ mountPage("/behavior", WebSocketBehaviorDemoPage.class);
+ mountPage("/resource", WebSocketResourceDemoPage.class);
+
setRootRequestMapper(new HttpsMapper(getRootRequestMapper(), new HttpsConfig()));
+
+ getSharedResources().add(ChartWebSocketResource.NAME, new ChartWebSocketResource());
}
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketBehaviorDemoPage.html
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketBehaviorDemoPage.html b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketBehaviorDemoPage.html
new file mode 100644
index 0000000..efb084d
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketBehaviorDemoPage.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+ <head>
+ <meta charset="utf-8" />
+ <title>Apache Wicket Quickstart</title>
+ <link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:regular,bold' rel='stylesheet' type='text/css' />
+ <link rel="stylesheet" href="style.css" type="text/css" media="screen" title="Stylesheet" />
+ </head>
+ <body>
+ <div id="hd">
+ <div id="logo">
+ <img src="logo.png" width="50px" height="50px" alt="Wicket Logo" />
+ <h1>Apache Wicket</h1>
+ </div>
+ </div>
+ <div wicket:id="chartPanel"></div>
+ </body>
+</html>
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketBehaviorDemoPage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketBehaviorDemoPage.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketBehaviorDemoPage.java
new file mode 100644
index 0000000..846ef04
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketBehaviorDemoPage.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.ws.javax.app;
+
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
+import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
+import org.apache.wicket.protocol.ws.javax.app.charts.ChartUpdater;
+import org.apache.wicket.protocol.ws.javax.app.charts.WebSocketChart;
+
+//@RequireHttps
+public class WebSocketBehaviorDemoPage extends WebPage
+{
+ public WebSocketBehaviorDemoPage()
+ {
+ WebSocketChart chartPanel = new WebSocketChart("chartPanel");
+ chartPanel.add(new WebSocketBehavior()
+ {
+ @Override
+ protected void onConnect(ConnectedMessage message)
+ {
+ super.onConnect(message);
+
+ ChartUpdater.start(message);
+ }
+ });
+ add(chartPanel);
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketResourceDemoPage.html
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketResourceDemoPage.html b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketResourceDemoPage.html
new file mode 100644
index 0000000..efb084d
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketResourceDemoPage.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+ <head>
+ <meta charset="utf-8" />
+ <title>Apache Wicket Quickstart</title>
+ <link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:regular,bold' rel='stylesheet' type='text/css' />
+ <link rel="stylesheet" href="style.css" type="text/css" media="screen" title="Stylesheet" />
+ </head>
+ <body>
+ <div id="hd">
+ <div id="logo">
+ <img src="logo.png" width="50px" height="50px" alt="Wicket Logo" />
+ <h1>Apache Wicket</h1>
+ </div>
+ </div>
+ <div wicket:id="chartPanel"></div>
+ </body>
+</html>
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketResourceDemoPage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketResourceDemoPage.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketResourceDemoPage.java
new file mode 100644
index 0000000..75f7855
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/WebSocketResourceDemoPage.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.ws.javax.app;
+
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.protocol.ws.api.BaseWebSocketBehavior;
+import org.apache.wicket.protocol.ws.javax.app.charts.ChartWebSocketResource;
+import org.apache.wicket.protocol.ws.javax.app.charts.WebSocketChart;
+
+public class WebSocketResourceDemoPage extends WebPage
+{
+ public WebSocketResourceDemoPage()
+ {
+ WebSocketChart chartPanel = new WebSocketChart("chartPanel");
+ chartPanel.add(new BaseWebSocketBehavior(ChartWebSocketResource.NAME));
+ add(chartPanel);
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/ChartUpdater.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/ChartUpdater.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/ChartUpdater.java
new file mode 100644
index 0000000..de3be73
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/ChartUpdater.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.ws.javax.app.charts;
+
+import java.util.Random;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.protocol.ws.IWebSocketSettings;
+import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
+import org.apache.wicket.protocol.ws.api.IWebSocketConnectionRegistry;
+import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
+import org.apache.wicket.protocol.ws.api.registry.IKey;
+
+/**
+ * A helper class that uses the web connection to push data to the
+ * client.
+ * To keep the demo simpler it doesn't use #onClose() to stop
+ * the thread.
+ */
+public class ChartUpdater
+{
+ public static void start(ConnectedMessage message)
+ {
+ Record[] data = generateData();
+
+ // create an asynchronous task that will write the data to the client
+ UpdateTask updateTask = new UpdateTask(message.getApplication(), message.getSessionId(), message.getKey(), data);
+ Executors.newScheduledThreadPool(1).schedule(updateTask, 1, TimeUnit.SECONDS);
+ }
+
+ /**
+ * Generates some random data to send to the client
+ * @return records with random data
+ */
+ private static Record[] generateData()
+ {
+ Random randomGenerator = new Random();
+ Record[] data = new Record[1000];
+ for (int i = 0; i < 1000; i++)
+ {
+ Record r = new Record();
+ r.year = 2000 + i;
+ r.field = (i % 2 == 0) ? "Company 1" : "Company 2";
+ r.value = randomGenerator.nextInt(1500);
+ data[i] = r;
+ }
+ return data;
+ }
+
+
+ /**
+ * A task that sends data to the client by pushing it to the web socket connection
+ */
+ private static class UpdateTask implements Runnable
+ {
+ private static final String JSON_SKELETON = "{ \"year\": \"%s\", \"field\": \"%s\", \"value\": %s }";
+
+ /**
+ * The following fields are needed to be able to lookup the IWebSocketConnection from
+ * IWebSocketConnectionRegistry
+ */
+ private final String applicationName;
+ private final String sessionId;
+ private final IKey key;
+
+ /**
+ * The data that has to be sent to the client
+ */
+ private final Record[] data;
+
+ private UpdateTask(Application application, String sessionId, IKey key, Record[] data)
+ {
+ this.applicationName = application.getName();
+ this.sessionId = sessionId;
+ this.key = key;
+ this.data = data;
+ }
+
+ @Override
+ public void run()
+ {
+ Application application = Application.get(applicationName);
+ IWebSocketSettings webSocketSettings = IWebSocketSettings.Holder.get(application);
+ IWebSocketConnectionRegistry webSocketConnectionRegistry = webSocketSettings.getConnectionRegistry();
+ IWebSocketConnection connection = webSocketConnectionRegistry.getConnection(application, sessionId, key);
+
+ int dataIndex = 0;
+
+ while (dataIndex < data.length)
+ {
+ try
+ {
+ Record record = data[dataIndex++];
+ String json = String.format(JSON_SKELETON, record.year, record.field, record.value);
+
+ if (connection == null || !connection.isOpen())
+ {
+ // stop if the web socket connection is closed
+ return;
+ }
+ connection.sendMessage(json);
+
+ // sleep for a while to simulate work
+ TimeUnit.SECONDS.sleep(1);
+ }
+ catch (Exception x)
+ {
+ x.printStackTrace();
+ return;
+ }
+ }
+ }
+ }
+
+ /**
+ * The data that is being sent to the client in JSON format
+ */
+ private static class Record
+ {
+ private int year;
+ private String field;
+ private int value;
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/ChartWebSocketResource.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/ChartWebSocketResource.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/ChartWebSocketResource.java
new file mode 100644
index 0000000..f7ff175
--- /dev/null
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/ChartWebSocketResource.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.ws.javax.app.charts;
+
+import org.apache.wicket.protocol.ws.api.WebSocketResource;
+import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
+
+/**
+ *
+ */
+public class ChartWebSocketResource extends WebSocketResource
+{
+ public static final String NAME = ChartWebSocketResource.class.getName();
+
+ @Override
+ protected void onConnect(ConnectedMessage message)
+ {
+ super.onConnect(message);
+
+ ChartUpdater.start(message);
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/WebSocketChart.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/WebSocketChart.java b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/WebSocketChart.java
index 2bf73b4..773b644 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/WebSocketChart.java
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-javax/src/test/java/org/apache/wicket/protocol/ws/javax/app/charts/WebSocketChart.java
@@ -16,19 +16,9 @@
*/
package org.apache.wicket.protocol.ws.javax.app.charts;
-import java.util.Random;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.wicket.Application;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.protocol.ws.IWebSocketSettings;
-import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
-import org.apache.wicket.protocol.ws.api.IWebSocketConnectionRegistry;
-import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
-import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
/**
* A panel that initializes a Google Line chart and uses WebSocketBehavior to register an asynchronous
@@ -39,8 +29,6 @@ public class WebSocketChart extends Panel
public WebSocketChart(final String id)
{
super(id);
-
- add(new ChartUpdatingBehavior());
}
@Override
@@ -50,115 +38,4 @@ public class WebSocketChart extends Panel
response.render(JavaScriptHeaderItem.forReference(new ChartsResourceReference()));
}
- /**
- * A web socket behavior that schedules an asynchronous task that will write some data when
- * a client connects
- */
- private static class ChartUpdatingBehavior extends WebSocketBehavior
- {
- @Override
- protected void onConnect(ConnectedMessage message)
- {
- super.onConnect(message);
-
- Record[] data = generateData();
-
- // create an asynchronous task that will write the data to the client
- UpdateTask updateTask = new UpdateTask(message.getApplication(), message.getSessionId(), message.getPageId(), data);
- Executors.newScheduledThreadPool(1).schedule(updateTask, 1, TimeUnit.SECONDS);
- }
-
- /**
- * Generates some random data to send to the client
- * @return records with random data
- */
- private Record[] generateData()
- {
- Random randomGenerator = new Random();
- Record[] data = new Record[1000];
- for (int i = 0; i < 1000; i++)
- {
- Record r = new Record();
- r.year = 2000 + i;
- r.field = (i % 2 == 0) ? "Company 1" : "Company 2";
- r.value = randomGenerator.nextInt(1500);
- data[i] = r;
- }
- return data;
- }
- }
-
- /**
- * A task that sends data to the client by pushing it to the web socket connection
- */
- private static class UpdateTask implements Runnable
- {
- private static final String JSON_SKELETON = "{ \"year\": \"%s\", \"field\": \"%s\", \"value\": %s }";
-
- /**
- * The following fields are needed to be able to lookup the IWebSocketConnection from
- * IWebSocketConnectionRegistry
- */
- private final String applicationName;
- private final String sessionId;
- private final int pageId;
-
- /**
- * The data that has to be sent to the client
- */
- private final Record[] data;
-
- private UpdateTask(Application application, String sessionId, int pageId, Record[] data)
- {
- this.applicationName = application.getName();
- this.sessionId = sessionId;
- this.pageId = pageId;
- this.data = data;
- }
-
- @Override
- public void run()
- {
- Application application = Application.get(applicationName);
- IWebSocketSettings webSocketSettings = IWebSocketSettings.Holder.get(application);
- IWebSocketConnectionRegistry webSocketConnectionRegistry = webSocketSettings.getConnectionRegistry();
- IWebSocketConnection connection = webSocketConnectionRegistry.getConnection(application, sessionId, pageId);
-
- int dataIndex = 0;
-
- while (dataIndex < data.length)
- {
- try
- {
- Record record = data[dataIndex++];
- String json = String.format(JSON_SKELETON, record.year, record.field, record.value);
-
- if (connection == null || !connection.isOpen())
- {
- // stop if the web socket connection is closed
- return;
- }
- connection.sendMessage(json);
-
- // sleep for a while to simulate work
- TimeUnit.SECONDS.sleep(1);
- }
- catch (Exception x)
- {
- x.printStackTrace();
- return;
- }
- }
- }
- }
-
- /**
- * The data that is being sent to the client in JSON format
- */
- private static class Record
- {
- private int year;
- private String field;
- private int value;
- }
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/pom.xml
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/pom.xml b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/pom.xml
index 6cb1fe2..9fd66b0 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/pom.xml
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty/pom.xml
@@ -20,12 +20,11 @@
<parent>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-native-websocket</artifactId>
- <version>0.9-SNAPSHOT</version>
+ <version>0.16-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>wicket-native-websocket-jetty</artifactId>
<packaging>jar</packaging>
- <version>0.9-SNAPSHOT</version>
<name>Wicket Native WebSocket Jetty</name>
<description>Provides the code specific to integrate with Jetty web container</description>
<dependencies>
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/pom.xml
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/pom.xml b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/pom.xml
index ce68e91..ce934a9 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/pom.xml
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-jetty9/pom.xml
@@ -20,12 +20,11 @@
<parent>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-native-websocket</artifactId>
- <version>0.9-SNAPSHOT</version>
+ <version>0.16-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>wicket-native-websocket-jetty9</artifactId>
<packaging>jar</packaging>
- <version>0.9-SNAPSHOT</version>
<name>Wicket Native WebSocket Jetty 9</name>
<description>Provides the code specific to integrate with Jetty 9 web container</description>
<dependencies>
http://git-wip-us.apache.org/repos/asf/wicket/blob/ff6a79e5/wicket-experimental/wicket-native-websocket/wicket-native-websocket-tomcat/pom.xml
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-tomcat/pom.xml b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-tomcat/pom.xml
index a4f1393..581d4e8 100644
--- a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-tomcat/pom.xml
+++ b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-tomcat/pom.xml
@@ -20,12 +20,11 @@
<parent>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-native-websocket</artifactId>
- <version>0.9-SNAPSHOT</version>
+ <version>0.16-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>wicket-native-websocket-tomcat</artifactId>
<packaging>jar</packaging>
- <version>0.9-SNAPSHOT</version>
<name>Wicket Native WebSocket Tomcat 7.x</name>
<description>Provides the code specific to integrate with Tomcat web container</description>