You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2011/07/23 18:58:00 UTC
svn commit: r1150151 - in
/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5:
internal/services/ComponentInstantiatorSourceImpl.java
services/ComponentEventHandler.java
services/transform/TransformationSupport.java
Author: hlship
Date: Sat Jul 23 16:57:59 2011
New Revision: 1150151
URL: http://svn.apache.org/viewvc?rev=1150151&view=rev
Log:
TAP5-1508: Add method addEventHandler() to TransformationSupport
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentEventHandler.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/TransformationSupport.java
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java?rev=1150151&r1=1150150&r2=1150151&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java Sat Jul 23 16:57:59 2011
@@ -14,9 +14,6 @@
package org.apache.tapestry5.internal.services;
-import java.util.Map;
-import java.util.Set;
-
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.SymbolConstants;
import org.apache.tapestry5.internal.InternalComponentResources;
@@ -42,30 +39,20 @@ import org.apache.tapestry5.ioc.services
import org.apache.tapestry5.ioc.services.PlasticProxyFactory;
import org.apache.tapestry5.model.ComponentModel;
import org.apache.tapestry5.model.MutableComponentModel;
-import org.apache.tapestry5.plastic.ClassInstantiator;
-import org.apache.tapestry5.plastic.InstructionBuilder;
-import org.apache.tapestry5.plastic.InstructionBuilderCallback;
-import org.apache.tapestry5.plastic.MethodDescription;
-import org.apache.tapestry5.plastic.PlasticClass;
-import org.apache.tapestry5.plastic.PlasticClassEvent;
-import org.apache.tapestry5.plastic.PlasticClassListener;
-import org.apache.tapestry5.plastic.PlasticField;
-import org.apache.tapestry5.plastic.PlasticManager;
+import org.apache.tapestry5.plastic.*;
import org.apache.tapestry5.plastic.PlasticManager.PlasticManagerBuilder;
-import org.apache.tapestry5.plastic.PlasticManagerDelegate;
-import org.apache.tapestry5.plastic.PlasticUtils;
-import org.apache.tapestry5.plastic.TransformationOption;
import org.apache.tapestry5.runtime.Component;
+import org.apache.tapestry5.runtime.ComponentEvent;
import org.apache.tapestry5.runtime.ComponentResourcesAware;
-import org.apache.tapestry5.services.ComponentClassResolver;
-import org.apache.tapestry5.services.InvalidationListener;
-import org.apache.tapestry5.services.UpdateListener;
-import org.apache.tapestry5.services.UpdateListenerHub;
+import org.apache.tapestry5.services.*;
import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
import org.apache.tapestry5.services.transform.ControlledPackageType;
import org.apache.tapestry5.services.transform.TransformationSupport;
import org.slf4j.Logger;
+import java.util.Map;
+import java.util.Set;
+
/**
* A wrapper around a {@link PlasticManager} that allows certain classes to be modified as they are loaded.
*/
@@ -91,7 +78,7 @@ public final class ComponentInstantiator
private final InternalComponentInvalidationEventHub invalidationHub;
private final boolean productionMode;
-
+
private final ComponentClassResolver resolver;
// These change whenever the invalidation event hub sends an invalidation notification
@@ -111,28 +98,28 @@ public final class ComponentInstantiator
public ComponentInstantiatorSourceImpl(Logger logger,
- LoggerSource loggerSource,
+ LoggerSource loggerSource,
+
+ @Builtin
+ PlasticProxyFactory proxyFactory,
- @Builtin
- PlasticProxyFactory proxyFactory,
+ @Primary
+ ComponentClassTransformWorker2 transformerChain,
- @Primary
- ComponentClassTransformWorker2 transformerChain,
+ InternalRequestGlobals internalRequestGlobals,
- InternalRequestGlobals internalRequestGlobals,
+ ClasspathURLConverter classpathURLConverter,
- ClasspathURLConverter classpathURLConverter,
+ OperationTracker tracker,
- OperationTracker tracker,
+ Map<String, ControlledPackageType> configuration,
- Map<String, ControlledPackageType> configuration,
+ @Symbol(SymbolConstants.PRODUCTION_MODE)
+ boolean productionMode,
- @Symbol(SymbolConstants.PRODUCTION_MODE)
- boolean productionMode,
-
- ComponentClassResolver resolver,
+ ComponentClassResolver resolver,
- InternalComponentInvalidationEventHub invalidationHub)
+ InternalComponentInvalidationEventHub invalidationHub)
{
this.parent = proxyFactory.getClassLoader();
this.transformerChain = transformerChain;
@@ -298,7 +285,7 @@ public final class ComponentInstantiator
if (isRoot
&& !(parentClassName.equals("java.lang.Object") || parentClassName
- .equals("groovy.lang.GroovyObjectSupport")))
+ .equals("groovy.lang.GroovyObjectSupport")))
{
String suggestedPackageName = buildSuggestedPackageName(className);
@@ -324,7 +311,7 @@ public final class ComponentInstantiator
boolean isPage = resolver.isPage(className);
- MutableComponentModel model = new MutableComponentModelImpl(className, logger, baseResource,
+ final MutableComponentModel model = new MutableComponentModelImpl(className, logger, baseResource,
parentModel, isPage);
transformerChain.transform(plasticClass, new TransformationSupport()
@@ -334,8 +321,7 @@ public final class ComponentInstantiator
try
{
return PlasticInternalUtils.toClass(manager.getClassLoader(), typeName);
- }
- catch (ClassNotFoundException ex)
+ } catch (ClassNotFoundException ex)
{
throw new RuntimeException(String.format(
"Unable to convert type '%s' to a Class: %s", typeName,
@@ -347,6 +333,50 @@ public final class ComponentInstantiator
{
return isRoot;
}
+
+ public void addEventHandler(final String eventType, final int minContextValues, final String operationDescription, final ComponentEventHandler handler)
+ {
+ assert InternalUtils.isNonBlank(eventType);
+ assert minContextValues >= 0;
+ assert handler != null;
+
+ MethodAdvice advice = new MethodAdvice()
+ {
+ public void advise(MethodInvocation invocation)
+ {
+ final ComponentEvent event = (ComponentEvent) invocation.getParameter(0);
+
+ boolean matches = event.matches(eventType, "", minContextValues);
+
+ if (matches)
+ {
+ final Component instance = (Component) invocation.getInstance();
+
+ tracker.invoke(operationDescription, new Invokable<Object>()
+ {
+ public Object invoke()
+ {
+ handler.handleEvent(instance, event);
+
+ return null;
+ }
+ });
+ }
+
+ // Order of operations is key here. This logic takes precedence; base class event dispatch and event handler methods
+ // in the class come AFTER.
+
+ invocation.proceed();
+
+ if (matches)
+ {
+ invocation.setReturnValue(true);
+ }
+ }
+ };
+
+ plasticClass.introduceMethod(TransformConstants.DISPATCH_COMPONENT_EVENT_DESCRIPTION).addAdvice(advice);
+ }
}, model);
classToModel.put(className, model);
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentEventHandler.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentEventHandler.java?rev=1150151&r1=1150150&r2=1150151&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentEventHandler.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentEventHandler.java Sat Jul 23 16:57:59 2011
@@ -1,4 +1,4 @@
-// Copyright 2010 The Apache Software Foundation
+// Copyright 2010, 2011 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -18,12 +18,15 @@ import org.apache.tapestry5.runtime.Comp
import org.apache.tapestry5.runtime.ComponentEvent;
/**
- * Interface used with {@link ClassTransformation#addComponentEventHandler(String, int, String, ComponentEventHandler)}.
- *
+ * Interface used with {@link org.apache.tapestry5.services.transform.TransformationSupport#addEventHandler(String, int, ComponentEventHandler)}} (and, in the old
+ * API, {@link ClassTransformation#addComponentEventHandler(String, int, String, ComponentEventHandler)}).
+ *
* @since 5.2.0
*/
public interface ComponentEventHandler
{
- /** Handles the event. */
+ /**
+ * Handles the event.
+ */
void handleEvent(Component instance, ComponentEvent event);
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/TransformationSupport.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/TransformationSupport.java?rev=1150151&r1=1150150&r2=1150151&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/TransformationSupport.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/TransformationSupport.java Sat Jul 23 16:57:59 2011
@@ -15,17 +15,17 @@
package org.apache.tapestry5.services.transform;
import org.apache.tapestry5.plastic.PlasticClass;
+import org.apache.tapestry5.services.ComponentEventHandler;
/**
* Additional utilities, beyond {@link PlasticClass}, needed when transforming.
- *
+ *
* @since 5.3
*/
public interface TransformationSupport
{
/**
- * @param typeName
- * Java type name (which may be a primitive type or array, or fully qualified class name)
+ * @param typeName Java type name (which may be a primitive type or array, or fully qualified class name)
* @return corresponding Java Class
*/
Class toClass(String typeName);
@@ -33,8 +33,20 @@ public interface TransformationSupport
/**
* Returns true if the class being transformed is a root class: it does not inherit
* from another transformed class, but instead inherits from Object.
- *
+ *
* @return true if root
*/
boolean isRootTransformation();
+
+ /**
+ * Adds an event handler. Added event handlers execute <em>before</em> calls to super-class event handlers,
+ * or calls to event handler methods.
+ *
+ * @param eventType type of event
+ * @param minContextValues number of context values required to activate the handler
+ * @param operationDescription Used with {@link org.apache.tapestry5.ioc.OperationTracker} when invoking the handler
+ * @param handler code to execute when the event matches
+ */
+ void addEventHandler(String eventType, int minContextValues, String operationDescription, ComponentEventHandler handler);
+
}