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;
 }