You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pa...@apache.org on 2012/11/26 08:26:59 UTC
[2/2] git commit: WICKET-4879: added a context aware filter to allow
filtering on the receiver
WICKET-4879: added a context aware filter to allow filtering on the receiver
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a0b2dd19
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a0b2dd19
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a0b2dd19
Branch: refs/heads/master
Commit: a0b2dd194c096bb17e5703e03f7d83b7e872e65a
Parents: c9a3e09
Author: Emond Papegaaij <pa...@apache.org>
Authored: Mon Nov 26 08:16:56 2012 +0100
Committer: Emond Papegaaij <pa...@apache.org>
Committed: Mon Nov 26 08:26:32 2012 +0100
----------------------------------------------------------------------
.../wicket/examples/atmosphere/ChatMessage.java | 42 +++++++++++++++
.../wicket/examples/atmosphere/HomePage.html | 1 +
.../wicket/examples/atmosphere/HomePage.java | 11 +++--
.../wicket/examples/atmosphere/ReceiverFilter.java | 40 ++++++++++++++
.../atmosphere/AtmosphereRequestHandler.java | 24 ++++++---
.../wicket/atmosphere/EventSubscription.java | 20 ++++++--
.../org/apache/wicket/atmosphere/Subscribe.java | 14 +++++-
7 files changed, 136 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/a0b2dd19/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/ChatMessage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/ChatMessage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/ChatMessage.java
new file mode 100644
index 0000000..27450fe
--- /dev/null
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/ChatMessage.java
@@ -0,0 +1,42 @@
+/*
+ * 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.examples.atmosphere;
+
+import java.io.Serializable;
+
+public class ChatMessage implements Serializable
+{
+
+ private String receiver;
+ private String message;
+
+ public ChatMessage(String receiver, String message)
+ {
+ this.receiver = receiver;
+ this.message = message;
+ }
+
+ public String getReceiver()
+ {
+ return receiver;
+ }
+
+ public String getMessage()
+ {
+ return message;
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/a0b2dd19/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.html
index be814a5..2980c27 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.html
@@ -13,6 +13,7 @@
Message received: <span wicket:id="message"></span>
</p>
<form wicket:id="form">
+ <div>Session id of receiver: <input wicket:id="receiver" /></div>
<input wicket:id="input" /> <a href="#" wicket:id="send">Send
message</a>
</form>
http://git-wip-us.apache.org/repos/asf/wicket/blob/a0b2dd19/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.java
index bd3a068..f475d29 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.java
@@ -36,6 +36,7 @@ public class HomePage extends WicketExamplePage
private Component timeLabel;
private Component messageLabel;
+ private TextField<String> receiver;
private TextField<String> input;
public HomePage(final PageParameters parameters)
@@ -47,6 +48,7 @@ public class HomePage extends WicketExamplePage
Form<Void> form = new Form<Void>("form");
add(form);
+ form.add(receiver = new TextField<String>("receiver", Model.of("")));
form.add(input = new TextField<String>("input", Model.of("")));
form.add(new AjaxSubmitLink("send", form)
{
@@ -55,7 +57,8 @@ public class HomePage extends WicketExamplePage
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form)
{
- EventBus.get().post(input.getModelObject());
+ EventBus.get().post(
+ new ChatMessage(receiver.getModelObject(), input.getModelObject()));
}
@Override
@@ -74,10 +77,10 @@ public class HomePage extends WicketExamplePage
target.add(timeLabel);
}
- @Subscribe
- public void receiveMessage(AjaxRequestTarget target, String message)
+ @Subscribe(contextAwareFilter = ReceiverFilter.class)
+ public void receiveMessage(AjaxRequestTarget target, ChatMessage message)
{
- messageLabel.setDefaultModelObject(message);
+ messageLabel.setDefaultModelObject(message.getMessage());
target.add(messageLabel);
}
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/a0b2dd19/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/ReceiverFilter.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/ReceiverFilter.java b/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/ReceiverFilter.java
new file mode 100644
index 0000000..b5be228
--- /dev/null
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/ReceiverFilter.java
@@ -0,0 +1,40 @@
+/*
+ * 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.examples.atmosphere;
+
+import org.apache.wicket.Session;
+
+import com.google.common.base.Predicate;
+
+public class ReceiverFilter implements Predicate<Object>
+{
+ public ReceiverFilter()
+ {
+ }
+
+ @Override
+ public boolean apply(Object input)
+ {
+ if (input instanceof ChatMessage)
+ {
+ ChatMessage msg = (ChatMessage)input;
+ return msg.getReceiver() == null || msg.getReceiver().isEmpty() ||
+ msg.getReceiver().equals(Session.get().getId());
+ }
+ return false;
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/a0b2dd19/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
index ebd1d95..4df5c02 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
@@ -28,6 +28,7 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.IRequestCycle;
import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.cycle.RequestCycle;
/**
* Handles pseudo requests triggered by an event. An {@link AjaxRequestTarget} is scheduled and the
@@ -43,6 +44,8 @@ public class AtmosphereRequestHandler implements IRequestHandler
private Collection<EventSubscription> subscriptions;
+ private boolean ajaxRequestScheduled = false;
+
/**
* Construct.
*
@@ -63,7 +66,6 @@ public class AtmosphereRequestHandler implements IRequestHandler
{
Page page = (Page)Application.get().getMapperContext().getPageInstance(pageKey.getPageId());
AjaxRequestTarget target = WebApplication.get().newAjaxRequestTarget(page);
- requestCycle.scheduleRequestHandlerAfterCurrent(target);
executeHandlers(target, page);
}
@@ -71,12 +73,15 @@ public class AtmosphereRequestHandler implements IRequestHandler
{
for (EventSubscription curSubscription : subscriptions)
{
- Component component = page.get(curSubscription.getComponentPath());
- if (curSubscription.getBehaviorIndex() == null)
- invokeMethod(target, curSubscription, component);
- else
- invokeMethod(target, curSubscription,
- component.getBehaviorById(curSubscription.getBehaviorIndex()));
+ if (curSubscription.getContextAwareFilter().apply(event))
+ {
+ Component component = page.get(curSubscription.getComponentPath());
+ if (curSubscription.getBehaviorIndex() == null)
+ invokeMethod(target, curSubscription, component);
+ else
+ invokeMethod(target, curSubscription,
+ component.getBehaviorById(curSubscription.getBehaviorIndex()));
+ }
}
}
@@ -89,6 +94,11 @@ public class AtmosphereRequestHandler implements IRequestHandler
{
try
{
+ if (!ajaxRequestScheduled)
+ {
+ ajaxRequestScheduled = true;
+ RequestCycle.get().scheduleRequestHandlerAfterCurrent(target);
+ }
curMethod.setAccessible(true);
curMethod.invoke(base, target, event);
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/a0b2dd19/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventSubscription.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventSubscription.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventSubscription.java
index 041cb38..dd3d22d 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventSubscription.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventSubscription.java
@@ -42,6 +42,8 @@ public class EventSubscription
private Predicate<Object> filter;
+ private Predicate<Object> contextAwareFilter;
+
/**
* Construct.
*
@@ -54,17 +56,18 @@ public class EventSubscription
componentPath = component.getPageRelativePath();
behaviorIndex = behavior == null ? null : component.getBehaviorId(behavior);
Class<?> eventType = method.getParameterTypes()[1];
- filter = Predicates.and(Predicates.instanceOf(eventType), createFilter(method));
+ Subscribe subscribe = method.getAnnotation(Subscribe.class);
+ filter = Predicates.and(Predicates.instanceOf(eventType), createFilter(subscribe.filter()));
+ contextAwareFilter = createFilter(subscribe.contextAwareFilter());
methodName = method.getName();
}
@SuppressWarnings("unchecked")
- private static Predicate<Object> createFilter(Method method)
+ private static Predicate<Object> createFilter(Class<? extends Predicate<?>> filterClass)
{
- Subscribe subscribe = method.getAnnotation(Subscribe.class);
try
{
- return (Predicate<Object>)subscribe.filter().newInstance();
+ return (Predicate<Object>)filterClass.newInstance();
}
catch (InstantiationException e)
{
@@ -103,6 +106,15 @@ public class EventSubscription
}
/**
+ * @return The context ware filter on incomming events, constructed from the
+ * {@link Subscribe#contextAwareFilter()} parameter.
+ */
+ public Predicate<Object> getContextAwareFilter()
+ {
+ return contextAwareFilter;
+ }
+
+ /**
* @return The method that is subscribed
*/
public String getMethodName()
http://git-wip-us.apache.org/repos/asf/wicket/blob/a0b2dd19/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/Subscribe.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/Subscribe.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/Subscribe.java
index ba9eea9..f90eeef 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/Subscribe.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/Subscribe.java
@@ -47,9 +47,21 @@ import com.google.common.base.Predicate;
public @interface Subscribe {
/**
* An optional filter on events to be received by the method. The filter cannot rely on any
- * context. For example, the {@link RequestCycle} may not be available.
+ * context. For example, the {@link RequestCycle} may not be available. For events filtered by
+ * this filter, Wicket-Atmosphere will not have to setup initiate the Wicket request cycle,
+ * which is quite expensive.
*
* @return The filter on events, defaults to no filter.
*/
Class<? extends Predicate<?>> filter() default NoFilterPredicate.class;
+
+ /**
+ * An optional filter on events to be received by the method. This filter has access to the
+ * Wicket context, such as the {@link Session} and the {@link RequestCycle}. If your filter does
+ * not require this context, you should use {@link #filter()} to prevent unnecessary setup of
+ * the request cycle.
+ *
+ * @return The filter on events, defaults to no filter.
+ */
+ Class<? extends Predicate<?>> contextAwareFilter() default NoFilterPredicate.class;
}