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();
+ }
+}