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/25 20:03:39 UTC
svn commit: r1150817 - in
/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5:
internal/pageload/ internal/services/ internal/structure/
internal/transform/ runtime/
Author: hlship
Date: Mon Jul 25 18:03:37 2011
New Revision: 1150817
URL: http://svn.apache.org/viewvc?rev=1150817&view=rev
Log:
TAP5-1508: Change the Component interface to not extend PageLifecycleListener
Only have components implement the interface as needed
Only have components register as listeners when they implement the interface
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/ComponentAssemblerImpl.java
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/internal/structure/ComponentPageElement.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/CachedWorker.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageLifecycleAnnotationWorker.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageResetAnnotationWorker.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/runtime/Component.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/runtime/PageLifecycleListener.java
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/ComponentAssemblerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/ComponentAssemblerImpl.java?rev=1150817&r1=1150816&r2=1150817&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/ComponentAssemblerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/ComponentAssemblerImpl.java Mon Jul 25 18:03:37 2011
@@ -105,8 +105,6 @@ class ComponentAssemblerImpl implements
pageAssembly.componentName.push(new ComponentName(pageAssembly.page.getName()));
- pageAssembly.page.addLifecycleListener(newElement);
-
addRootComponentMixins(newElement);
pushNewElement(pageAssembly, newElement);
@@ -174,8 +172,6 @@ class ComponentAssemblerImpl implements
ComponentPageElement newElement = container.newChild(embeddedId, embeddedName.nestedId,
embeddedName.completeId, elementName, instantiator, location);
- pageAssembly.page.addLifecycleListener(newElement);
-
pushNewElement(pageAssembly, newElement);
embeddedAssembler.addMixinsToElement(newElement);
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=1150817&r1=1150816&r2=1150817&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 Mon Jul 25 18:03:37 2011
@@ -44,6 +44,7 @@ import org.apache.tapestry5.plastic.Plas
import org.apache.tapestry5.runtime.Component;
import org.apache.tapestry5.runtime.ComponentEvent;
import org.apache.tapestry5.runtime.ComponentResourcesAware;
+import org.apache.tapestry5.runtime.PageLifecycleListener;
import org.apache.tapestry5.services.*;
import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
import org.apache.tapestry5.services.transform.ControlledPackageType;
@@ -65,8 +66,6 @@ public final class ComponentInstantiator
private final ClassLoader parent;
- private final InternalRequestGlobals internalRequestGlobals;
-
private final ComponentClassTransformWorker2 transformerChain;
private final LoggerSource loggerSource;
@@ -96,6 +95,16 @@ public final class ComponentInstantiator
private final Map<String, ComponentModel> classToModel = CollectionFactory.newMap();
+ private final ConstructorCallback REGISTER_AS_PAGE_LIFECYCLE_LISTENER = new ConstructorCallback()
+ {
+ public void onConstruct(Object instance, InstanceContext context)
+ {
+ InternalComponentResources resources = context.get(InternalComponentResources.class);
+
+ resources.addPageLifecycleListener((PageLifecycleListener) instance);
+ }
+ };
+
public ComponentInstantiatorSourceImpl(Logger logger,
LoggerSource loggerSource,
@@ -106,8 +115,6 @@ public final class ComponentInstantiator
@Primary
ComponentClassTransformWorker2 transformerChain,
- InternalRequestGlobals internalRequestGlobals,
-
ClasspathURLConverter classpathURLConverter,
OperationTracker tracker,
@@ -125,7 +132,6 @@ public final class ComponentInstantiator
this.transformerChain = transformerChain;
this.logger = logger;
this.loggerSource = loggerSource;
- this.internalRequestGlobals = internalRequestGlobals;
this.changeTracker = new URLChangeTracker(classpathURLConverter);
this.tracker = tracker;
this.invalidationHub = invalidationHub;
@@ -244,14 +250,6 @@ public final class ComponentInstantiator
});
}
- // synchronized may be overkill, but that's ok.
- public synchronized void addPackage(String packageName)
- {
- assert InternalUtils.isNonBlank(packageName);
-
- controlledPackageNames.add(packageName);
- }
-
public boolean exists(String className)
{
return parent.getResource(PlasticInternalUtils.toClassPath(className)) != null;
@@ -311,11 +309,18 @@ public final class ComponentInstantiator
boolean isPage = resolver.isPage(className);
+ boolean superClassImplementsPageLifecycle = plasticClass.isInterfaceImplemented(PageLifecycleListener.class);
+
final MutableComponentModel model = new MutableComponentModelImpl(className, logger, baseResource,
parentModel, isPage);
transformerChain.transform(plasticClass, new TransformationSupportImpl(plasticClass, isRoot, model), model);
+ if (!superClassImplementsPageLifecycle && plasticClass.isInterfaceImplemented(PageLifecycleListener.class))
+ {
+ plasticClass.onConstruct(REGISTER_AS_PAGE_LIFECYCLE_LISTENER);
+ }
+
classToModel.put(className, model);
}
});
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElement.java?rev=1150817&r1=1150816&r2=1150817&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElement.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElement.java Mon Jul 25 18:03:37 2011
@@ -22,14 +22,17 @@ import org.apache.tapestry5.internal.Int
import org.apache.tapestry5.internal.InternalComponentResourcesCommon;
import org.apache.tapestry5.internal.services.Instantiator;
import org.apache.tapestry5.ioc.Location;
-import org.apache.tapestry5.runtime.*;
+import org.apache.tapestry5.runtime.Component;
+import org.apache.tapestry5.runtime.ComponentEvent;
+import org.apache.tapestry5.runtime.RenderCommand;
+import org.apache.tapestry5.runtime.RenderQueue;
import org.slf4j.Logger;
/**
* Defines an element of a page that is a component elements that are, in fact, components (rather than just static
* markup).
*/
-public interface ComponentPageElement extends ComponentResourcesCommon, InternalComponentResourcesCommon, RenderCommand, BodyPageElement, PageLifecycleListener
+public interface ComponentPageElement extends ComponentResourcesCommon, InternalComponentResourcesCommon, RenderCommand, BodyPageElement
{
/**
* Returns the core component associated with this page element (as opposed to any mixins attached to the
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java?rev=1150817&r1=1150816&r2=1150817&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java Mon Jul 25 18:03:37 2011
@@ -58,7 +58,7 @@ import java.util.*;
* <p/>
* Modified for Tapestry 5.2 to adjust for the no-pooling approach (shared instances with externalized mutable state).
*/
-public class ComponentPageElementImpl extends BaseLocatable implements ComponentPageElement, PageLifecycleListener
+public class ComponentPageElementImpl extends BaseLocatable implements ComponentPageElement
{
/**
* Placeholder for the body used when the component has no real content.
@@ -78,38 +78,6 @@ public class ComponentPageElementImpl ex
private static final Block PLACEHOLDER_BLOCK = new PlaceholderBlock();
- private static final ComponentCallback RESTORE_STATE_BEFORE_PAGE_ATTACH = new LifecycleNotificationComponentCallback()
- {
- public void run(Component component)
- {
- component.restoreStateBeforePageAttach();
- }
- };
-
- private static final ComponentCallback CONTAINING_PAGE_DID_ATTACH = new LifecycleNotificationComponentCallback()
- {
- public void run(Component component)
- {
- component.containingPageDidAttach();
- }
- };
-
- private static final ComponentCallback CONTAINING_PAGE_DID_DETACH = new LifecycleNotificationComponentCallback()
- {
- public void run(Component component)
- {
- component.containingPageDidDetach();
- }
- };
-
- private static final ComponentCallback CONTAINING_PAGE_DID_LOAD = new LifecycleNotificationComponentCallback()
- {
- public void run(Component component)
- {
- component.containingPageDidLoad();
- }
- };
-
private static final ComponentCallback POST_RENDER_CLEANUP = new LifecycleNotificationComponentCallback()
{
public void run(Component component)
@@ -596,6 +564,17 @@ public class ComponentPageElementImpl ex
renderEvent = elementResources.createPerThreadValue();
rendering = elementResources.createPerThreadValue();
+
+ page.addLifecycleListener(new PageLifecycleAdapter()
+ {
+ @Override
+ public void containingPageDidLoad()
+ {
+ pageLoaded();
+
+ ComponentPageElementImpl.this.page.removeLifecycleListener(this);
+ }
+ });
}
/**
@@ -781,22 +760,7 @@ public class ComponentPageElementImpl ex
}
}
- public void restoreStateBeforePageAttach()
- {
- invoke(false, RESTORE_STATE_BEFORE_PAGE_ATTACH);
- }
-
- public void containingPageDidAttach()
- {
- invoke(false, CONTAINING_PAGE_DID_ATTACH);
- }
-
- public void containingPageDidDetach()
- {
- invoke(false, CONTAINING_PAGE_DID_DETACH);
- }
-
- public void containingPageDidLoad()
+ private void pageLoaded()
{
// If this component has mixins, order them according to:
// mixins.
@@ -823,12 +787,8 @@ public class ComponentPageElementImpl ex
// For some parameters, bindings (from defaults) are provided inside the callback method, so
// that is invoked first, before we check for unbound parameters.
- invoke(false, CONTAINING_PAGE_DID_LOAD);
verifyRequiredParametersAreBound();
- // We assume that by the time we start to render, the structure (i.e., mixins) is nailed
- // down. We could add a lock, but that seems wasteful.
-
initializeRenderPhases();
loaded = true;
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/CachedWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/CachedWorker.java?rev=1150817&r1=1150816&r2=1150817&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/CachedWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/CachedWorker.java Mon Jul 25 18:03:37 2011
@@ -23,6 +23,7 @@ import org.apache.tapestry5.ioc.services
import org.apache.tapestry5.ioc.services.PerthreadManager;
import org.apache.tapestry5.model.MutableComponentModel;
import org.apache.tapestry5.plastic.*;
+import org.apache.tapestry5.runtime.PageLifecycleListener;
import org.apache.tapestry5.services.BindingSource;
import org.apache.tapestry5.services.TransformConstants;
import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
@@ -231,7 +232,7 @@ public class CachedWorker implements Com
// and reuse of a component (with a cached method) within a page or across pages. However, the binding can't be initialized
// until the page loads.
-
+ plasticClass.introduceInterface(PageLifecycleListener.class);
plasticClass.introduceMethod(TransformConstants.CONTAINING_PAGE_DID_LOAD_DESCRIPTION).addAdvice(new MethodAdvice()
{
public void advise(MethodInvocation invocation)
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageLifecycleAnnotationWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageLifecycleAnnotationWorker.java?rev=1150817&r1=1150816&r2=1150817&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageLifecycleAnnotationWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageLifecycleAnnotationWorker.java Mon Jul 25 18:03:37 2011
@@ -20,6 +20,7 @@ import org.apache.tapestry5.func.Predica
import org.apache.tapestry5.func.Worker;
import org.apache.tapestry5.model.MutableComponentModel;
import org.apache.tapestry5.plastic.*;
+import org.apache.tapestry5.runtime.PageLifecycleListener;
import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
import org.apache.tapestry5.services.transform.TransformationSupport;
@@ -71,7 +72,16 @@ public class PageLifecycleAnnotationWork
public void transform(PlasticClass plasticClass, TransformationSupport support, MutableComponentModel model)
{
- for (PlasticMethod method : matchLifecycleMethods(plasticClass))
+ Flow<PlasticMethod> methods = matchLifecycleMethods(plasticClass);
+
+ if (methods.isEmpty())
+ {
+ return;
+ }
+
+ plasticClass.introduceInterface(PageLifecycleListener.class);
+
+ for (PlasticMethod method : methods)
{
invokeMethodWithinLifecycle(plasticClass, method);
}
@@ -98,7 +108,6 @@ public class PageLifecycleAnnotationWork
};
}
-
private Flow<PlasticMethod> matchLifecycleMethods(PlasticClass plasticClass)
{
return F.flow(plasticClass.getMethods()).filter(MATCHER).each(VALIDATE);
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageResetAnnotationWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageResetAnnotationWorker.java?rev=1150817&r1=1150816&r2=1150817&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageResetAnnotationWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageResetAnnotationWorker.java Mon Jul 25 18:03:37 2011
@@ -33,15 +33,13 @@ public class PageResetAnnotationWorker i
{
private static final String META_KEY = "tapestry.page-reset-listener";
- private final MethodAdvice REGISTER_AS_LISTENER = new MethodAdvice()
+ private final ConstructorCallback REGISTER_AS_LISTENER = new ConstructorCallback()
{
- public void advise(MethodInvocation invocation)
+ public void onConstruct(Object instance, InstanceContext context)
{
- invocation.proceed();
+ InternalComponentResources resources = context.get(InternalComponentResources.class);
- InternalComponentResources resources = invocation.getInstanceContext().get(InternalComponentResources.class);
-
- resources.addPageResetListener((PageResetListener) invocation.getInstance());
+ resources.addPageResetListener((PageResetListener) instance);
}
};
@@ -84,7 +82,11 @@ public class PageResetAnnotationWorker i
if (!methods.isEmpty())
{
- registerAsPageResetListenerAtPageLoad(plasticClass, model);
+ if (!plasticClass.isInterfaceImplemented(PageResetListener.class))
+ {
+ plasticClass.introduceInterface(PageResetListener.class);
+ plasticClass.onConstruct(REGISTER_AS_LISTENER);
+ }
invokeMethodsOnPageReset(plasticClass, methods);
}
@@ -110,25 +112,6 @@ public class PageResetAnnotationWorker i
});
}
- private void registerAsPageResetListenerAtPageLoad(PlasticClass plasticClass, MutableComponentModel model)
- {
-
- // The meta key tracks whether this has already occurred; it is only necessary for a base class
- // (subclasses, even if they include pageReset methods, do not need to re-register if the base class
- // already has).
-
- if (model.getMeta(META_KEY) != null)
- {
- return;
- }
-
- plasticClass.introduceInterface(PageResetListener.class);
-
- plasticClass.introduceMethod(TransformConstants.CONTAINING_PAGE_DID_LOAD_DESCRIPTION).addAdvice(REGISTER_AS_LISTENER);
-
- model.setMeta(META_KEY, "true");
- }
-
private Flow<PlasticMethod> findResetMethods(PlasticClass plasticClass)
{
return F.flow(plasticClass.getMethods()).filter(METHOD_MATCHER).each(METHOD_VALIDATOR);
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/runtime/Component.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/runtime/Component.java?rev=1150817&r1=1150816&r2=1150817&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/runtime/Component.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/runtime/Component.java Mon Jul 25 18:03:37 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2009 The Apache Software Foundation
+// Copyright 2006, 2009, 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.
@@ -25,8 +25,11 @@ import org.apache.tapestry5.annotations.
* <p/>
* Most of the methods are related to render phases; see the corresponding annotations and component rendering
* documentation to see how they relate to each other.
+ * <p/>
+ * Starting in 5.3 this interface no longer implements {@link PageLifecycleListener}. Normally, this would be an incompatible
+ * change, but Component is not supposed to be directly implemented by user code.
*/
-public interface Component extends ComponentResourcesAware, PageLifecycleListener
+public interface Component extends ComponentResourcesAware
{
/**
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/runtime/PageLifecycleListener.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/runtime/PageLifecycleListener.java?rev=1150817&r1=1150816&r2=1150817&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/runtime/PageLifecycleListener.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/runtime/PageLifecycleListener.java Mon Jul 25 18:03:37 2011
@@ -15,7 +15,9 @@
package org.apache.tapestry5.runtime;
/**
- * A set of methods that allow components to know about page-level operations.
+ * A set of methods that allow components to know about page-level operations. When this interface is
+ * {@linkplain org.apache.tapestry5.plastic.PlasticClass#introduceInterface(Class)} introduced}, the component will
+ * automatically register itself as a listener with the page.
*/
public interface PageLifecycleListener
{