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)