You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2006/08/24 19:22:51 UTC

svn commit: r434439 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/internal/services/ main/java/org/apache/tapestry/internal/structure/ main/java/org/apache/tapestry/internal/test/ test/conf/ test/java/org/apache/tapest...

Author: hlship
Date: Thu Aug 24 10:22:47 2006
New Revision: 434439

URL: http://svn.apache.org/viewvc?rev=434439&view=rev
Log:
Update testng.xml to properly list all test packages (we had tests we weren't running!).

Added:
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/services/PropertyAccessImplTest.java
      - copied, changed from r434428, tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/services/PropertyAccessImplTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/PageImplTest.java
Removed:
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/services/PropertyAccessImplTest.java
Modified:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoader.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePoolImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java?rev=434439&r1=434438&r2=434439&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java Thu Aug 24 10:22:47 2006
@@ -30,46 +30,71 @@
 @Id("tapestry.internal")
 public final class InternalModule
 {
-    /**
-     * The UpdateListenerHub is responsible for tracking which listeners are interested when some
-     * part of external storage changes (invalidating cached data).
-     */
-    public UpdateListenerHub buildUpdateListenerHub()
+    private final ComponentInstantiatorSource _componentInstantiatorSource;
+
+    private final UpdateListenerHub _updateListenerHub;
+
+    public InternalModule(@InjectService("ComponentInstantiatorSource")
+    ComponentInstantiatorSource componentInstantiatorSource, @InjectService("UpdateListenerHub")
+    UpdateListenerHub updateListenerHub)
     {
-        return new UpdateListenerHubImpl();
+        _componentInstantiatorSource = componentInstantiatorSource;
+        _updateListenerHub = updateListenerHub;
     }
 
-    /**
-     * All public services in the tapestry module, and in any sub-module of tapestry will get
-     * logging.
-     */
-    @Match(
-    { "tapestry.*", "tapestry.*.*" })
-    @Order("before:*.*")
-    public <T> T decorateWithLogging(Class<T> serviceInterface, T delegate, String serviceId,
-            Log log, @InjectService("tapestry.ioc.LoggingDecorator")
-            LoggingDecorator loggingDecorator)
+    public ComponentClassTransformer buildComponentClassTransformer(
+            @InjectService("tapestry.ComponentClassTransformWorker")
+            ComponentClassTransformWorker workerChain)
     {
-        return loggingDecorator.build(serviceInterface, delegate, serviceId, log);
+        ComponentClassTransformerImpl transformer = new ComponentClassTransformerImpl(workerChain);
+
+        _componentInstantiatorSource.addInvalidationListener(transformer);
+
+        return transformer;
     }
 
-    public PageLoader buildPageLoader(@InjectService("ComponentTemplateSource")
-    ComponentTemplateSource templateSource, @InjectService("PageElementFactory")
-    PageElementFactory pageElementFactory)
+    public ComponentInstantiatorSource buildComponentInstantiatorSource(
+            @InjectService("ComponentClassTransformer")
+            ComponentClassTransformer transformer, Log log)
     {
-        return new PageLoaderImpl(templateSource, pageElementFactory);
+        ComponentInstantiatorSourceImpl source = new ComponentInstantiatorSourceImpl(transformer,
+                log);
+
+        _updateListenerHub.addUpdateListener(source);
+
+        return source;
     }
 
     public ComponentTemplateSource buildComponentTemplateSource(@InjectService("TemplateParser")
     TemplateParser parser)
     {
+        // TODO: Make the CTS an UpdateListener and an InvalidationEventHub
         return new ComponentTemplateSourceImpl(parser);
     }
 
-    public PageElementFactory buildPageElementFactory(@InjectService("ComponentInstantiatorSource")
-    ComponentInstantiatorSource instantiatorSource)
+    public PageElementFactory buildPageElementFactory()
     {
-        return new PageElementFactoryImpl(instantiatorSource);
+        return new PageElementFactoryImpl(_componentInstantiatorSource);
+    }
+
+    public PageLoader buildPageLoader(@InjectService("ComponentTemplateSource")
+    ComponentTemplateSource templateSource, @InjectService("PageElementFactory")
+    PageElementFactory pageElementFactory)
+    {
+        PageLoaderImpl service = new PageLoaderImpl(templateSource, pageElementFactory);
+
+        _componentInstantiatorSource.addInvalidationListener(service);
+
+        return service;
+    }
+
+    /**
+     * The UpdateListenerHub is responsible for tracking which listeners are interested when some
+     * part of external storage changes (invalidating cached data).
+     */
+    public UpdateListenerHub buildUpdateListenerHub()
+    {
+        return new UpdateListenerHubImpl();
     }
 
     @Contribute("tapestry.ComponentClassTransformWorker")
@@ -80,30 +105,18 @@
         configuration.add("UnclaimedField", new UnclaimedFieldWorker(), "after:*.*");
     }
 
-    public ComponentClassTransformer buildComponentClassTransformer(
-            @InjectService("tapestry.ComponentClassTransformWorker")
-            ComponentClassTransformWorker workerChain,
-            @InjectService("ComponentInstantiatorSource")
-            ComponentInstantiatorSource cis)
-    {
-        ComponentClassTransformerImpl transformer = new ComponentClassTransformerImpl(workerChain);
-
-        cis.addInvalidationListener(transformer);
-
-        return transformer;
-    }
-
-    public ComponentInstantiatorSource buildComponentInstantiatorSource(
-            @InjectService("ComponentClassTransformer")
-            ComponentClassTransformer transformer, @InjectService("UpdateListenerHub")
-            UpdateListenerHub hub, Log log)
+    /**
+     * All public services in the tapestry module, and in any sub-module of tapestry will get
+     * logging.
+     */
+    @Match(
+    { "tapestry.*", "tapestry.*.*" })
+    @Order("before:*.*")
+    public <T> T decorateWithLogging(Class<T> serviceInterface, T delegate, String serviceId,
+            Log log, @InjectService("tapestry.ioc.LoggingDecorator")
+            LoggingDecorator loggingDecorator)
     {
-        ComponentInstantiatorSourceImpl source = new ComponentInstantiatorSourceImpl(transformer,
-                log);
-
-        hub.addUpdateListener(source);
-
-        return source;
+        return loggingDecorator.build(serviceInterface, delegate, serviceId, log);
     }
 
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoader.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoader.java?rev=434439&r1=434438&r2=434439&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoader.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoader.java Thu Aug 24 10:22:47 2006
@@ -16,6 +16,7 @@
 
 import java.util.Locale;
 
+import org.apache.tapestry.internal.event.InvalidationEventHub;
 import org.apache.tapestry.internal.structure.Page;
 
 /**
@@ -27,7 +28,7 @@
  * 
  * @author Howard M. Lewis Ship
  */
-public interface PageLoader
+public interface PageLoader extends InvalidationEventHub
 {
     /**
      * Loads the page in the given locale.

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderImpl.java?rev=434439&r1=434438&r2=434439&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderImpl.java Thu Aug 24 10:22:47 2006
@@ -17,6 +17,9 @@
 import java.util.List;
 import java.util.Locale;
 
+import org.apache.tapestry.events.InvalidationEvent;
+import org.apache.tapestry.events.InvalidationListener;
+import org.apache.tapestry.internal.event.InvalidationEventHubImpl;
 import org.apache.tapestry.internal.parser.AttributeToken;
 import org.apache.tapestry.internal.parser.ComponentTemplate;
 import org.apache.tapestry.internal.parser.EndElementToken;
@@ -36,9 +39,9 @@
  * 
  * @author Howard M. Lewis Ship
  */
-public class PageLoaderImpl implements PageLoader
+public class PageLoaderImpl extends InvalidationEventHubImpl implements PageLoader,
+        InvalidationListener
 {
-
     private final ComponentTemplateSource _templateSource;
 
     private final PageElementFactory _pageElementFactory;
@@ -264,6 +267,12 @@
     static <T> void push(List<T> stack, T element)
     {
         stack.add(element);
+    }
+
+    /** When the page loader receives an invalidation event, it respawns the event for its listeners. */
+    public void objectWasInvalidated(InvalidationEvent event)
+    {
+        fireInvalidationEvent();
     }
 
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePoolImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePoolImpl.java?rev=434439&r1=434438&r2=434439&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePoolImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePoolImpl.java Thu Aug 24 10:22:47 2006
@@ -46,7 +46,7 @@
     {
         List<Page> pages = _pool.get(pageName);
 
-        if (pages.isEmpty())
+        if (pages == null || pages.isEmpty())
             return _pageLoader.loadPage(pageName, Locale.getDefault());
 
         // Remove and return the last page in the pool.
@@ -56,6 +56,8 @@
 
     public synchronized void release(Page page)
     {
+        page.detach();
+
         String key = page.getName();
         List<Page> pages = _pool.get(key);
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java?rev=434439&r1=434438&r2=434439&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java Thu Aug 24 10:22:47 2006
@@ -16,6 +16,8 @@
 
 import java.util.Locale;
 
+import org.apache.tapestry.runtime.ComponentLifecycle;
+
 /**
  * Represents a unique page within the application.
  * <p>
@@ -48,4 +50,27 @@
 
     /** The root component of the page. */
     PageElement getRootElement();
+
+    /**
+     * Inform page that it is being detached from the current request. This occurs just before the
+     * page is returned to the page pool.
+     * 
+     * @see ComponentLifecycle#containingPageDidDetach()
+     */
+    void detach();
+
+    /**
+     * Inform the page that it is now completely loaded.
+     * 
+     * @see ComponentLifecycle#containingPageDidLoad()
+     */
+
+    void loaded();
+
+    /**
+     * Adds a component, identified via the {@link org.apache.tapestry.runtime.ComponentLifecycle}
+     * interface it implements, to the page. The component will receive various lifecycle
+     * notifications.
+     */
+    void addComponentLifecycle(ComponentLifecycle component);
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java?rev=434439&r1=434438&r2=434439&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java Thu Aug 24 10:22:47 2006
@@ -14,8 +14,13 @@
 
 package org.apache.tapestry.internal.structure;
 
+import java.util.List;
 import java.util.Locale;
 
+import org.apache.tapestry.runtime.ComponentLifecycle;
+
+import static org.apache.tapestry.util.CollectionFactory.newList;
+
 /** @author Howard M. Lewis Ship */
 public class PageImpl implements Page
 {
@@ -25,6 +30,8 @@
 
     private PageElement _rootElement;
 
+    private final List<ComponentLifecycle> _components = newList();
+
     public PageImpl(String name, Locale locale)
     {
         _name = name;
@@ -50,4 +57,22 @@
     {
         return _rootElement;
     }
+
+    public void addComponentLifecycle(ComponentLifecycle component)
+    {
+        _components.add(component);
+    }
+
+    public void detach()
+    {
+        for (ComponentLifecycle c : _components)
+            c.containingPageDidDetach();
+    }
+
+    public void loaded()
+    {
+        for (ComponentLifecycle c : _components)
+            c.containingPageDidLoad();
+    }
+
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java?rev=434439&r1=434438&r2=434439&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java Thu Aug 24 10:22:47 2006
@@ -29,6 +29,7 @@
 import org.apache.tapestry.ioc.ServiceLifecycle;
 import org.apache.tapestry.ioc.ServiceLocator;
 import org.apache.tapestry.ioc.def.ServiceDef;
+import org.apache.tapestry.runtime.ComponentLifecycle;
 import org.apache.tapestry.test.BaseTestCase;
 import org.apache.tapestry.util.CollectionFactory;
 import org.easymock.EasyMock;
@@ -112,5 +113,10 @@
     protected final ComponentInstantiatorSource newComponentInstantiatorSource()
     {
         return newMock(ComponentInstantiatorSource.class);
+    }
+
+    protected ComponentLifecycle newComponentLifecycle()
+    {
+        return newMock(ComponentLifecycle.class);
     }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml?rev=434439&r1=434438&r2=434439&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml Thu Aug 24 10:22:47 2006
@@ -18,19 +18,18 @@
 <suite name="Tapestry 5" parallel="true" thread-count="5" annotations="1.5" verbose="2">
   <test name="General">
     <packages>
+      <package name="org.apache.tapestry"/>
+      <package name="org.apache.tapestry.dom"/>
+      <package name="org.apache.internal"/>
       <package name="org.apache.tapestry.internal.aspects"/>
       <package name="org.apache.tapestry.internal.ioc"/>
       <package name="org.apache.tapestry.internal.ioc.services"/>
-      <package name="org.apache.tapestry.internal.pageload"/>
-      <package name="org.apache.tapestry.internal.parser"/>
       <package name="org.apache.tapestry.internal.services"/>
-      <package name="org.apache.tapestry.internal.transform"/>
-      <package name="org.apache.tapestry.internal.transform.pages"/>
-      <package name="org.apache.tapestry.internal.transform.worker"/>
+      <package name="org.apache.tapestry.internal.structure"/>
       <package name="org.apache.tapestry.internal.util"/>
       <package name="org.apache.tapestry.ioc"/>
       <package name="org.apache.tapestry.ioc.services"/>
-      <package name="org.apache.tapestry.transform"/>
+      <package name="org.apache.tapestry.services"/>
       <package name="org.apache.tapestry.util"/>
     </packages>
   </test>

Copied: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/services/PropertyAccessImplTest.java (from r434428, tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/services/PropertyAccessImplTest.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/services/PropertyAccessImplTest.java?p2=tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/services/PropertyAccessImplTest.java&p1=tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/services/PropertyAccessImplTest.java&r1=434428&r2=434439&rev=434439&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/services/PropertyAccessImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/services/PropertyAccessImplTest.java Thu Aug 24 10:22:47 2006
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry.ioc.services;
+package org.apache.tapestry.internal.ioc.services;
 
 import java.awt.Image;
 import java.beans.BeanDescriptor;
@@ -22,9 +22,11 @@
 import java.beans.PropertyDescriptor;
 import java.util.Random;
 
-import org.apache.tapestry.internal.ioc.services.PropertyAccessImpl;
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
 import org.apache.tapestry.ioc.Registry;
+import org.apache.tapestry.ioc.services.ClassPropertyAdapter;
+import org.apache.tapestry.ioc.services.PropertyAccess;
+import org.apache.tapestry.ioc.services.PropertyAdapter;
 import org.testng.annotations.Test;
 
 /**

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/PageImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/PageImplTest.java?rev=434439&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/PageImplTest.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/PageImplTest.java Thu Aug 24 10:22:47 2006
@@ -0,0 +1,79 @@
+package org.apache.tapestry.internal.structure;
+
+import java.util.Locale;
+
+import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.apache.tapestry.runtime.ComponentLifecycle;
+import org.testng.annotations.Test;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+public class PageImplTest extends InternalBaseTestCase
+{
+    private final Locale _locale = Locale.ENGLISH;
+
+    private static final String PAGE_NAME = "org.foo.pages.MyPage";
+
+    @Test
+    public void accessor_methods()
+    {
+        PageElement root = newMock(PageElement.class);
+
+        replay();
+
+        Page page = new PageImpl(PAGE_NAME, _locale);
+
+        assertNull(page.getRootElement());
+
+        page.setRootElement(root);
+
+        assertEquals(page.getName(), PAGE_NAME);
+        assertSame(page.getLocale(), _locale);
+        assertSame(page.getRootElement(), root);
+
+        verify();
+    }
+
+    @Test
+    public void detach_notification()
+    {
+        ComponentLifecycle cl1 = newComponentLifecycle();
+        ComponentLifecycle cl2 = newComponentLifecycle();
+
+        cl1.containingPageDidDetach();
+        cl2.containingPageDidDetach();
+
+        replay();
+
+        Page page = new PageImpl(PAGE_NAME, _locale);
+
+        page.addComponentLifecycle(cl1);
+        page.addComponentLifecycle(cl2);
+
+        page.detach();
+
+        verify();
+    }
+
+    @Test
+    public void load_notification()
+    {
+        ComponentLifecycle cl1 = newComponentLifecycle();
+        ComponentLifecycle cl2 = newComponentLifecycle();
+
+        cl1.containingPageDidLoad();
+        cl2.containingPageDidLoad();
+
+        replay();
+
+        Page page = new PageImpl(PAGE_NAME, _locale);
+
+        page.addComponentLifecycle(cl1);
+        page.addComponentLifecycle(cl2);
+
+        page.loaded();
+
+        verify();
+    }
+}