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 2013/01/14 08:31:51 UTC

git commit: WICKET-4971: cache subscribed methods per class

Updated Branches:
  refs/heads/master 40b8e890b -> f7d3ad2d7


WICKET-4971: cache subscribed methods per class


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

Branch: refs/heads/master
Commit: f7d3ad2d7a2788ca60bed39ca76c624e49671f48
Parents: 40b8e89
Author: Emond Papegaaij <em...@topicus.nl>
Authored: Mon Jan 14 07:47:37 2013 +0100
Committer: Emond Papegaaij <em...@topicus.nl>
Committed: Mon Jan 14 08:31:01 2013 +0100

----------------------------------------------------------------------
 .../AtmosphereEventSubscriptionCollector.java      |   49 ++++++++++++---
 1 files changed, 39 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/f7d3ad2d/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereEventSubscriptionCollector.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereEventSubscriptionCollector.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereEventSubscriptionCollector.java
index db5f50b..f3c749d 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereEventSubscriptionCollector.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereEventSubscriptionCollector.java
@@ -17,6 +17,8 @@
 package org.apache.wicket.atmosphere;
 
 import java.lang.reflect.Method;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.Page;
@@ -25,6 +27,10 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.application.IComponentOnBeforeRenderListener;
 import org.apache.wicket.behavior.Behavior;
 
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.ImmutableList;
+
 /**
  * Collects {@linkplain Subscribe event subscriptions} on components. Subscriptions are refreshed on
  * every render of component. If a page contains a component with a subscription, an
@@ -35,6 +41,7 @@ import org.apache.wicket.behavior.Behavior;
  */
 public class AtmosphereEventSubscriptionCollector implements IComponentOnBeforeRenderListener
 {
+	private Cache<Class<?>, Iterable<Method>> subscribedMethodsCache;
 	private EventBus eventBus;
 
 	/**
@@ -45,29 +52,51 @@ public class AtmosphereEventSubscriptionCollector implements IComponentOnBeforeR
 	public AtmosphereEventSubscriptionCollector(EventBus eventBus)
 	{
 		this.eventBus = eventBus;
+		subscribedMethodsCache = CacheBuilder.newBuilder().build();
 	}
 
 	@Override
 	public void onBeforeRender(Component component)
 	{
-		for (Method curMethod : component.getClass().getMethods())
+		for (Method curMethod : findSubscribedMethods(component.getClass()))
+		{
+			subscribeComponent(component, null, curMethod);
+		}
+		for (Behavior curBehavior : component.getBehaviors())
 		{
-			if (curMethod.isAnnotationPresent(Subscribe.class))
+			for (Method curMethod : findSubscribedMethods(curBehavior.getClass()))
 			{
 				verifyMethodParameters(curMethod);
-				subscribeComponent(component, null, curMethod);
+				subscribeComponent(component, curBehavior, curMethod);
 			}
 		}
-		for (Behavior curBehavior : component.getBehaviors())
+	}
+
+	private Iterable<Method> findSubscribedMethods(final Class<?> clazz)
+	{
+		try
 		{
-			for (Method curMethod : curBehavior.getClass().getMethods())
+			return subscribedMethodsCache.get(clazz, new Callable<Iterable<Method>>()
 			{
-				if (curMethod.isAnnotationPresent(Subscribe.class))
+				@Override
+				public Iterable<Method> call() throws Exception
 				{
-					verifyMethodParameters(curMethod);
-					subscribeComponent(component, curBehavior, curMethod);
+					ImmutableList.Builder<Method> ret = ImmutableList.builder();
+					for (Method curMethod : clazz.getMethods())
+					{
+						if (curMethod.isAnnotationPresent(Subscribe.class))
+						{
+							verifyMethodParameters(curMethod);
+							ret.add(curMethod);
+						}
+					}
+					return ret.build();
 				}
-			}
+			});
+		}
+		catch (ExecutionException e)
+		{
+			throw new WicketRuntimeException(e);
 		}
 	}
 
@@ -77,7 +106,7 @@ public class AtmosphereEventSubscriptionCollector implements IComponentOnBeforeR
 		if (params.length != 2 || !params[0].equals(AjaxRequestTarget.class))
 			throw new WicketRuntimeException("@Subscribe can only be used on " +
 				"methods with 2 params, of which the first is AjaxRequestTarget. " + method +
-				" does conform to this signature.");
+				" does not conform to this signature.");
 	}
 
 	private void subscribeComponent(Component component, Behavior behavior, Method method)