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
 {