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 17:26:51 UTC

svn commit: r434403 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/internal/ main/java/org/apache/tapestry/internal/event/ main/java/org/apache/tapestry/internal/pageload/ main/java/org/apache/tapestry/internal/parser/ ...

Author: hlship
Date: Thu Aug 24 08:26:45 2006
New Revision: 434403

URL: http://svn.apache.org/viewvc?rev=434403&view=rev
Log:
Check ins prior to some refactoring.

Added:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/InternalPageLoadModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageElementFactory.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageElementFactoryImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/HTMLDispatcher.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/InternalRequestModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/PagePool.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/PagePoolImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/AttributePageElement.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/StartElementPageElement.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/TextPageElement.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/render/
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/render/PageResponseRenderer.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/render/RenderModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/Dispatcher.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ComponentClassResolver.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/pageload/PageElementFactoryImplTest.java
Removed:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/MarkupPageElement.java
Modified:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/InternalModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/event/InvalidationEventHub.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageLoaderImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/parser/StartComponentToken.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/WebRequestImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageElement.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalTransformModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/RequestModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/WebRequest.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/BaseTestCase.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/CollectionFactory.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/MessagesImplTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/services/ClassFabUtilsTest.java

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/InternalModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/InternalModule.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/InternalModule.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/InternalModule.java Thu Aug 24 08:26:45 2006
@@ -15,6 +15,8 @@
 package org.apache.tapestry.internal;
 
 import org.apache.commons.logging.Log;
+import org.apache.tapestry.internal.pageload.InternalPageLoadModule;
+import org.apache.tapestry.internal.request.InternalRequestModule;
 import org.apache.tapestry.internal.services.UpdateListenerHub;
 import org.apache.tapestry.internal.services.UpdateListenerHubImpl;
 import org.apache.tapestry.internal.transform.InternalTransformModule;
@@ -28,9 +30,9 @@
 /**
  * @author Howard M. Lewis Ship
  */
-@Id("tapestry.internal.services")
+@Id("tapestry.internal")
 @SubModule(
-{ InternalTransformModule.class })
+{ InternalTransformModule.class, InternalPageLoadModule.class, InternalRequestModule.class })
 public final class InternalModule
 {
     /**
@@ -53,7 +55,6 @@
             Log log, @InjectService("tapestry.ioc.LoggingDecorator")
             LoggingDecorator loggingDecorator)
     {
-        return loggingDecorator
-                .build(serviceInterface, delegate, serviceId, log);
+        return loggingDecorator.build(serviceInterface, delegate, serviceId, log);
     }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/event/InvalidationEventHub.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/event/InvalidationEventHub.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/event/InvalidationEventHub.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/event/InvalidationEventHub.java Thu Aug 24 08:26:45 2006
@@ -25,5 +25,6 @@
 {
     void addInvalidationListener(InvalidationListener listener);
 
+    // TODO: May be able to remove this method.
     void removeInvalidationListener(InvalidationListener listener);
 }

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/InternalPageLoadModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/InternalPageLoadModule.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/InternalPageLoadModule.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/InternalPageLoadModule.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,32 @@
+package org.apache.tapestry.internal.pageload;
+
+import org.apache.tapestry.internal.parser.TemplateParser;
+import org.apache.tapestry.internal.transform.ComponentInstantiatorSource;
+import org.apache.tapestry.ioc.annotations.Id;
+import org.apache.tapestry.ioc.annotations.InjectService;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+@Id("tapestry.internal.pageload")
+public final class InternalPageLoadModule
+{
+    public PageLoader buildPageLoader(@InjectService("ComponentTemplateSource")
+    ComponentTemplateSource templateSource, @InjectService("PageElementFactory")
+    PageElementFactory pageElementFactory)
+    {
+        return new PageLoaderImpl(templateSource, pageElementFactory);
+    }
+
+    public ComponentTemplateSource buildComponentTemplateSource(@InjectService("TemplateParser")
+    TemplateParser parser)
+    {
+        return new ComponentTemplateSourceImpl(parser);
+    }
+
+    public PageElementFactory buildPageElementFactory(@InjectService("ComponentInstantiatorSource")
+    ComponentInstantiatorSource instantiatorSource)
+    {
+        return new PageElementFactoryImpl(instantiatorSource);
+    }
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageElementFactory.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageElementFactory.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageElementFactory.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageElementFactory.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,32 @@
+package org.apache.tapestry.internal.pageload;
+
+import org.apache.tapestry.internal.parser.AttributeToken;
+import org.apache.tapestry.internal.parser.EndElementToken;
+import org.apache.tapestry.internal.parser.StartComponentToken;
+import org.apache.tapestry.internal.parser.StartElementToken;
+import org.apache.tapestry.internal.parser.TextToken;
+import org.apache.tapestry.internal.structure.ComponentPageElement;
+import org.apache.tapestry.internal.structure.Page;
+import org.apache.tapestry.internal.structure.PageElement;
+
+/**
+ * Used by the {@link org.apache.tapestry.internal.pageload.PageLoader} to create page elements
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public interface PageElementFactory
+{
+    PageElement newTextElement(TextToken token);
+
+    PageElement newStartElement(StartElementToken token);
+
+    PageElement newAttributeElement(AttributeToken token);
+
+    PageElement newEndElement(EndElementToken token);
+
+    ComponentPageElement newComponentElement(Page page, ComponentPageElement container,
+            StartComponentToken token);
+
+    ComponentPageElement newRootComponentElement(Page page, String componentName);
+
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageElementFactoryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageElementFactoryImpl.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageElementFactoryImpl.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageElementFactoryImpl.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,92 @@
+package org.apache.tapestry.internal.pageload;
+
+import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.internal.parser.AttributeToken;
+import org.apache.tapestry.internal.parser.EndElementToken;
+import org.apache.tapestry.internal.parser.StartComponentToken;
+import org.apache.tapestry.internal.parser.StartElementToken;
+import org.apache.tapestry.internal.parser.TextToken;
+import org.apache.tapestry.internal.structure.AttributePageElement;
+import org.apache.tapestry.internal.structure.ComponentPageElement;
+import org.apache.tapestry.internal.structure.ComponentPageElementImpl;
+import org.apache.tapestry.internal.structure.Page;
+import org.apache.tapestry.internal.structure.PageElement;
+import org.apache.tapestry.internal.structure.StartElementPageElement;
+import org.apache.tapestry.internal.structure.TextPageElement;
+import org.apache.tapestry.internal.transform.ComponentInstantiatorSource;
+import org.apache.tapestry.internal.transform.Instantiator;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+public class PageElementFactoryImpl implements PageElementFactory
+{
+    private final ComponentInstantiatorSource _componentInstantiatorSource;
+
+    public PageElementFactoryImpl(ComponentInstantiatorSource componentInstantiatorSource)
+    {
+        _componentInstantiatorSource = componentInstantiatorSource;
+    }
+
+    /** Singleton instance that represents any close tag of any element in any template. */
+    private final PageElement _endElement = new PageElement()
+    {
+        public void render(MarkupWriter writer)
+        {
+            writer.end();
+        }
+    };
+
+    public PageElement newStartElement(StartElementToken token)
+    {
+        return new StartElementPageElement(token.getName());
+    }
+
+    public PageElement newTextElement(TextToken token)
+    {
+        return new TextPageElement(token.getText());
+    }
+
+    public PageElement newEndElement(EndElementToken token)
+    {
+        return _endElement;
+    }
+
+    public PageElement newAttributeElement(AttributeToken token)
+    {
+        return new AttributePageElement(token.getName(), token.getValue());
+    }
+
+    public ComponentPageElement newComponentElement(Page page, ComponentPageElement container,
+            StartComponentToken token)
+    {
+        // For the moment, we're assuming each component will have an id and a FQCN for
+        // the type. This will change pretty soon.
+
+        String id = token.getId();
+
+        // Determining the component name is really not this easy. We may only specify
+        // the id in the template, and rely on the component model to provide us with
+        // the type. And the type in the template may be a local abbreviation that must
+        // be properly expanded to a FQCN before being passed to the
+        // component instantiator source.
+
+        String componentName = token.getType();
+
+        Instantiator instantiator = _componentInstantiatorSource.findInstantiator(componentName);
+
+        // The container for any components is the loading component, regardless of
+        // how the component elements are nested within the loading component's
+        // template.
+
+        return new ComponentPageElementImpl(page, container, id, instantiator);
+    }
+
+    public ComponentPageElement newRootComponentElement(Page page, String componentName)
+    {
+        Instantiator instantiator = _componentInstantiatorSource.findInstantiator(componentName);
+
+        return new ComponentPageElementImpl(page, instantiator);
+    }
+
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageLoaderImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageLoaderImpl.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageLoaderImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/PageLoaderImpl.java Thu Aug 24 08:26:45 2006
@@ -19,16 +19,15 @@
 
 import org.apache.tapestry.internal.parser.AttributeToken;
 import org.apache.tapestry.internal.parser.ComponentTemplate;
+import org.apache.tapestry.internal.parser.EndElementToken;
 import org.apache.tapestry.internal.parser.StartComponentToken;
+import org.apache.tapestry.internal.parser.StartElementToken;
 import org.apache.tapestry.internal.parser.TemplateToken;
+import org.apache.tapestry.internal.parser.TextToken;
 import org.apache.tapestry.internal.structure.ComponentPageElement;
-import org.apache.tapestry.internal.structure.ComponentPageElementImpl;
-import org.apache.tapestry.internal.structure.MarkupPageElement;
 import org.apache.tapestry.internal.structure.Page;
 import org.apache.tapestry.internal.structure.PageElement;
 import org.apache.tapestry.internal.structure.PageImpl;
-import org.apache.tapestry.internal.transform.ComponentInstantiatorSource;
-import org.apache.tapestry.internal.transform.Instantiator;
 
 import static org.apache.tapestry.util.CollectionFactory.newList;
 
@@ -39,19 +38,20 @@
  */
 public class PageLoaderImpl implements PageLoader
 {
-    private final ComponentInstantiatorSource _componentInstantiatorSource;
 
     private final ComponentTemplateSource _templateSource;
 
+    private final PageElementFactory _pageElementFactory;
+
     private Page _page;
 
     private Locale _locale;
 
-    public PageLoaderImpl(ComponentInstantiatorSource componentInstantiatorSource,
-            ComponentTemplateSource templateSource)
+    public PageLoaderImpl(ComponentTemplateSource templateSource,
+            PageElementFactory pageElementFactory)
     {
-        _componentInstantiatorSource = componentInstantiatorSource;
         _templateSource = templateSource;
+        _pageElementFactory = pageElementFactory;
     }
 
     /**
@@ -89,9 +89,9 @@
 
     private void loadRootComponent(String componentName)
     {
-        Instantiator instantiator = _componentInstantiatorSource.findInstantiator(componentName);
-
-        ComponentPageElement rootComponent = new ComponentPageElementImpl(_page, instantiator);
+        ComponentPageElement rootComponent = _pageElementFactory.newRootComponentElement(
+                _page,
+                componentName);
 
         _page.setRootElement(rootComponent);
 
@@ -132,10 +132,12 @@
         {
             switch (token.getTokenType())
             {
-                case CDATA:
+                // case CDATA: -- not yet supported
+
                 case TEXT:
 
-                    add(loadingComponent, activeComponent, new MarkupPageElement(token));
+                    add(loadingComponent, activeComponent, _pageElementFactory
+                            .newTextElement((TextToken) token));
                     break;
 
                 case START_ELEMENT:
@@ -144,7 +146,8 @@
                     // starting a component, because we can't differentitate cases
                     // when we hit the end element token.
 
-                    PageElement newElement = new MarkupPageElement(token);
+                    PageElement newElement = _pageElementFactory
+                            .newStartElement((StartElementToken) token);
 
                     add(loadingComponent, activeComponent, newElement);
 
@@ -155,7 +158,7 @@
 
                     // Any additional attribute tokens should be directed to
                     // the activePageElement, and not be directed to
-                    // the the activeComponent.
+                    // the activeComponent.
 
                     directlyInsideSubcomponent = false;
 
@@ -163,7 +166,8 @@
 
                 case END_ELEMENT:
 
-                    add(loadingComponent, activeComponent, new MarkupPageElement(token));
+                    add(loadingComponent, activeComponent, _pageElementFactory
+                            .newEndElement((EndElementToken) token));
 
                     activePageElement = pop(activePageElementStack);
                     activeComponent = pop(activeComponentStack);
@@ -172,30 +176,14 @@
 
                 case START_COMPONENT:
 
-                    StartComponentToken start = (StartComponentToken) token;
-
-                    // For the moment, we're assuming each component will have an id and a FQCN for
-                    // the type. This will change pretty soon.
-
-                    String id = start.getId();
-
-                    // Determining the component name is really not this easy. We may only specify
-                    // the id in the template, and rely on the component model to provide us with
-                    // the type. And the type in the template may be a local abbreviation that must
-                    // be properly expanded to a FQCN before being passed to the
-                    // component instantiator source.
-
-                    String componentName = start.getType();
-
-                    Instantiator instantiator = _componentInstantiatorSource
-                            .findInstantiator(componentName);
-
                     // The container for any components is the loading component, regardless of
                     // how the component elements are nested within the loading component's
                     // template.
 
-                    ComponentPageElement newComponent = new ComponentPageElementImpl(_page,
-                            loadingComponent, id, instantiator);
+                    ComponentPageElement newComponent = _pageElementFactory.newComponentElement(
+                            _page,
+                            loadingComponent,
+                            ((StartComponentToken) token));
 
                     // Make sure container knows about the new component.
 
@@ -224,15 +212,14 @@
 
                 case ATTRIBUTE:
 
+                    AttributeToken attribute = (AttributeToken) token;
+
                     if (directlyInsideSubcomponent)
-                    {
-                        AttributeToken attribute = (AttributeToken) token;
                         activeComponent.addParameter(attribute);
-                    }
                     else
-                    {
-                        add(loadingComponent, activeComponent, new MarkupPageElement(token));
-                    }
+                        add(loadingComponent, activeComponent, _pageElementFactory
+                                .newAttributeElement(attribute));
+                    break;
 
                 default:
                     throw new IllegalStateException("Just haven't written that stuff yet.");

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/parser/StartComponentToken.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/parser/StartComponentToken.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/parser/StartComponentToken.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/parser/StartComponentToken.java Thu Aug 24 08:26:45 2006
@@ -45,6 +45,8 @@
     {
         super(TokenType.START_COMPONENT, location);
 
+        // TODO: id or type may be null, nut not both!
+        
         _id = id;
         _type = type;
     }

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/HTMLDispatcher.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/HTMLDispatcher.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/HTMLDispatcher.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/HTMLDispatcher.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,21 @@
+package org.apache.tapestry.internal.request;
+
+import org.apache.tapestry.request.Dispatcher;
+import org.apache.tapestry.request.WebRequest;
+import org.apache.tapestry.request.WebResponse;
+
+/**
+ * Dispatches incoming requests whose path ends with ".html". In these cases, the path is
+ * interpreted as a page name.
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public class HTMLDispatcher implements Dispatcher
+{
+    public boolean dispatch(WebRequest request, WebResponse response)
+    {
+        String path = request.getPath();
+
+        return false;
+    }
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/InternalRequestModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/InternalRequestModule.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/InternalRequestModule.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/InternalRequestModule.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,9 @@
+package org.apache.tapestry.internal.request;
+
+import org.apache.tapestry.ioc.annotations.Id;
+
+@Id("tapestry.internal.request")
+public final class InternalRequestModule
+{
+
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/PagePool.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/PagePool.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/PagePool.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/PagePool.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,22 @@
+package org.apache.tapestry.internal.request;
+
+import org.apache.tapestry.internal.structure.Page;
+
+public interface PagePool
+{
+    /**
+     * Obtains a page instance from the pool via a page name. A page instance is created if no such
+     * page is currently available.
+     * 
+     * @param pageName
+     *            identifies the page name, as a fully qualified class name
+     * @return a page instance
+     */
+    Page checkout(String pageName);
+
+    /**
+     * @param page
+     *            a previously checked-out page
+     */
+    void release(Page page);
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/PagePoolImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/PagePoolImpl.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/PagePoolImpl.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/PagePoolImpl.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,58 @@
+package org.apache.tapestry.internal.request;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.tapestry.internal.pageload.PageLoader;
+import org.apache.tapestry.internal.structure.Page;
+import org.apache.tapestry.util.CollectionFactory;
+
+/**
+ * A very naive implementation just to get us past the start line.
+ * <p>
+ * TODO: Clear pool on cache invalidation.
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public class PagePoolImpl implements PagePool
+{
+    private final PageLoader _pageLoader;
+
+    // TODO: The key for this will ultimately be qualified with locale (or locale name) as well
+    // as page name.
+
+    private final Map<String, List<Page>> _pool = CollectionFactory.newMap();
+
+    public PagePoolImpl(PageLoader pageLoader)
+    {
+        _pageLoader = pageLoader;
+    }
+
+    public synchronized Page checkout(String pageName)
+    {
+        List<Page> pages = _pool.get(pageName);
+
+        if (pages.isEmpty())
+            return _pageLoader.loadPage(pageName, Locale.getDefault());
+
+        // Remove and return the last page in the pool.
+
+        return pages.remove(pages.size() - 1);
+    }
+
+    public synchronized void release(Page page)
+    {
+        String key = page.getName();
+        List<Page> pages = _pool.get(key);
+
+        if (pages == null)
+        {
+            pages = CollectionFactory.newList();
+            _pool.put(key, pages);
+        }
+
+        pages.add(page);
+    }
+
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/WebRequestImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/WebRequestImpl.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/WebRequestImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/request/WebRequestImpl.java Thu Aug 24 08:26:45 2006
@@ -22,8 +22,8 @@
 import org.apache.tapestry.request.WebRequest;
 
 /**
- * Basic implementation of {@link org.apache.tapestry.request.WebRequest} that wraps around
- * an {@link javax.servlet.http.HttpServletRequest}.
+ * Basic implementation of {@link org.apache.tapestry.request.WebRequest} that wraps around an
+ * {@link javax.servlet.http.HttpServletRequest}.
  * 
  * @author Howard M. Lewis Ship
  */
@@ -49,6 +49,11 @@
     public String[] getParameters(String name)
     {
         return _request.getParameterValues(name);
+    }
+
+    public String getPath()
+    {
+        return _request.getServletPath();
     }
 
 }

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/AttributePageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/AttributePageElement.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/AttributePageElement.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/AttributePageElement.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,27 @@
+package org.apache.tapestry.internal.structure;
+
+import org.apache.tapestry.MarkupWriter;
+
+/**
+ * A page element that renders an attribute (into the most recently started element).
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public class AttributePageElement implements PageElement
+{
+    private final String _name;
+
+    private final String _value;
+
+    public AttributePageElement(String name, String value)
+    {
+        _name = name;
+        _value = value;
+    }
+
+    public void render(MarkupWriter writer)
+    {
+        writer.attribute(_name, _value);
+    }
+
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java Thu Aug 24 08:26:45 2006
@@ -17,6 +17,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.tapestry.MarkupWriter;
 import org.apache.tapestry.internal.parser.AttributeToken;
 import org.apache.tapestry.internal.transform.Instantiator;
 import org.apache.tapestry.runtime.ComponentLifecycle;
@@ -120,6 +121,11 @@
     public String getId()
     {
         return _id;
+    }
+
+    public void render(MarkupWriter writer)
+    {
+        throw new UnsupportedOperationException("Not yet implemented.");
     }
 
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageElement.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageElement.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageElement.java Thu Aug 24 08:26:45 2006
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.internal.structure;
 
+import org.apache.tapestry.Renderable;
+
 /**
  * An element within a page. Page elements are placeholders that delegate much of their behavior to
  * application-specific component classes. A page element will also, ultimately, provide
@@ -21,6 +23,6 @@
  * 
  * @author Howard M. Lewis Ship
  */
-public interface PageElement
+public interface PageElement extends Renderable
 {
 }

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/StartElementPageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/StartElementPageElement.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/StartElementPageElement.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/StartElementPageElement.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,21 @@
+package org.apache.tapestry.internal.structure;
+
+import org.apache.tapestry.MarkupWriter;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+public class StartElementPageElement implements PageElement
+{
+    private final String _name;
+
+    public StartElementPageElement(String name)
+    {
+        _name = name;
+    }
+
+    public void render(MarkupWriter writer)
+    {
+        writer.element(_name);
+    }
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/TextPageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/TextPageElement.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/TextPageElement.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/TextPageElement.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,19 @@
+package org.apache.tapestry.internal.structure;
+
+import org.apache.tapestry.MarkupWriter;
+
+public class TextPageElement implements PageElement
+{
+    private final String _text;
+
+    public TextPageElement(String text)
+    {
+        _text = text;
+    }
+
+    public void render(MarkupWriter writer)
+    {
+        writer.write(_text);
+    }
+
+}

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=434403&r1=434402&r2=434403&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 08:26:45 2006
@@ -21,6 +21,7 @@
 import org.apache.tapestry.internal.ioc.InternalRegistry;
 import org.apache.tapestry.internal.ioc.Module;
 import org.apache.tapestry.internal.parser.ComponentTemplate;
+import org.apache.tapestry.internal.transform.ComponentInstantiatorSource;
 import org.apache.tapestry.ioc.ObjectProvider;
 import org.apache.tapestry.ioc.Registry;
 import org.apache.tapestry.ioc.RegistryBuilder;
@@ -101,5 +102,15 @@
     {
         provider.provide(expression, objectType, locator);
         setReturnValue(object);
+    }
+
+    protected final Module newModule()
+    {
+        return newMock(Module.class);
+    }
+
+    protected final ComponentInstantiatorSource newComponentInstantiatorSource()
+    {
+        return newMock(ComponentInstantiatorSource.class);
     }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalTransformModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalTransformModule.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalTransformModule.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalTransformModule.java Thu Aug 24 08:26:45 2006
@@ -57,7 +57,7 @@
     public ComponentInstantiatorSource buildComponentInstantiatorSource(
             @InjectService("ComponentClassTransformer")
             ComponentClassTransformer transformer,
-            @InjectService("tapestry.internal.services.UpdateListenerHub")
+            @InjectService("tapestry.internal.UpdateListenerHub")
             UpdateListenerHub hub, Log log)
     {
         ComponentInstantiatorSourceImpl source = new ComponentInstantiatorSourceImpl(transformer,

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/render/PageResponseRenderer.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/render/PageResponseRenderer.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/render/PageResponseRenderer.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/render/PageResponseRenderer.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,8 @@
+package org.apache.tapestry.render;
+
+import org.apache.tapestry.request.WebResponse;
+
+public interface PageResponseRenderer
+{
+    void renderPageResponse(Object page, WebResponse response);
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/render/RenderModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/render/RenderModule.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/render/RenderModule.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/render/RenderModule.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,12 @@
+package org.apache.tapestry.render;
+
+import org.apache.tapestry.ioc.annotations.Id;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+@Id("tapestry.render")
+public final class RenderModule
+{
+
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/Dispatcher.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/Dispatcher.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/Dispatcher.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/Dispatcher.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,17 @@
+package org.apache.tapestry.request;
+
+
+/**
+ * A dispatcher is responsible for recognizing an incoming request
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public interface Dispatcher
+{
+    /**
+     * Analyzes the incoming request and performs an appropriate operation for each.
+     * 
+     * @return true if a response was delivered
+     */
+    boolean dispatch(WebRequest request, WebResponse response);
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/RequestModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/RequestModule.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/RequestModule.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/RequestModule.java Thu Aug 24 08:26:45 2006
@@ -25,10 +25,12 @@
 import org.apache.tapestry.internal.request.WebRequestImpl;
 import org.apache.tapestry.internal.request.WebResponseImpl;
 import org.apache.tapestry.ioc.MappedConfiguration;
+import org.apache.tapestry.ioc.OrderedConfiguration;
 import org.apache.tapestry.ioc.annotations.Contribute;
 import org.apache.tapestry.ioc.annotations.Id;
 import org.apache.tapestry.ioc.annotations.InjectService;
 import org.apache.tapestry.ioc.annotations.Lifecycle;
+import org.apache.tapestry.ioc.services.ChainBuilder;
 import org.apache.tapestry.ioc.services.PipelineBuilder;
 import org.apache.tapestry.ioc.services.PropertyShadowBuilder;
 
@@ -46,6 +48,8 @@
 
     private final RequestGlobals _requestGlobals;
 
+    private final ChainBuilder _chainBuilder;
+
     // Yes, you can inject services defined by this module into this module. The service proxy is
     // created without
     // instantiating the module itself.
@@ -53,11 +57,13 @@
     public RequestModule(@InjectService("tapestry.ioc.PipelineBuilder")
     PipelineBuilder pipelineBuilder, @InjectService("tapestry.ioc.PropertyShadowBuilder")
     PropertyShadowBuilder shadowBuilder, @InjectService("RequestGlobals")
-    RequestGlobals requestGlobals)
+    RequestGlobals requestGlobals, @InjectService("tapestry.ioc.ChainBuilder")
+    ChainBuilder chainBuilder)
     {
         _pipelineBuilder = pipelineBuilder;
         _shadowBuilder = shadowBuilder;
         _requestGlobals = requestGlobals;
+        _chainBuilder = chainBuilder;
     }
 
     public HttpServletRequestHandler buildHttpServletRequestHandler(Log log,
@@ -86,7 +92,9 @@
                 terminator);
     }
 
-    public WebRequestHandler buildWebRequestHandler(Log log, List<WebRequestFilter> configuration)
+    public WebRequestHandler buildWebRequestHandler(Log log, List<WebRequestFilter> configuration,
+            @InjectService("MasterDispatcher")
+            final Dispatcher masterDispatcher)
     {
         WebRequestHandler terminator = new WebRequestHandler()
         {
@@ -94,9 +102,7 @@
             {
                 _requestGlobals.store(request, response);
 
-                // Much more to come from here in!
-
-                return false;
+                return masterDispatcher.dispatch(request, response);
             }
         };
 
@@ -126,5 +132,26 @@
             WebRequest request)
     {
         configuration.add("request", request);
+    }
+
+    /**
+     * Ordered contributions to the MasterDispatcher service allow different URL matching strategies
+     * to occur.
+     */
+    public Dispatcher buildMasterDispatcher(List<Dispatcher> configuration)
+    {
+        return _chainBuilder.build(Dispatcher.class, configuration);
+    }
+
+    public Dispatcher buildHTMLDispatcher()
+    {
+        return null;
+    }
+
+    public void contributeMasterDispatcher(OrderedConfiguration<Dispatcher> configuration,
+            @InjectService("HTMLDispatcher")
+            Dispatcher HTMLDispatcher)
+    {
+        configuration.add("HTML", HTMLDispatcher);
     }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/WebRequest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/WebRequest.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/WebRequest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/request/WebRequest.java Thu Aug 24 08:26:45 2006
@@ -37,4 +37,10 @@
      * request.
      */
     String[] getParameters(String name);
+
+    /**
+     * Returns the path portion of the request, which includes 
+     * @return
+     */
+    String getPath();
 }

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ComponentClassResolver.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ComponentClassResolver.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ComponentClassResolver.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/ComponentClassResolver.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,29 @@
+package org.apache.tapestry.services;
+
+/**
+ * Resolves partial names of pages (i.e., root components) and components.
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public interface ComponentClassResolver
+{
+    /**
+     * Converts a partial page name (such as might be encoded into a URL) into a fully qualified
+     * class name.
+     * 
+     * @param inputPageName
+     *            partial name
+     * @return fully qualified name
+     */
+    String resolvePageName(String inputPageName);
+
+    /**
+     * Converts a partial component name (such as might be used inside a template or annotation)
+     * into a fully qualified class name.
+     * 
+     * @param inputPageName
+     *            partial name
+     * @return fully qualified name
+     */
+    String resolveComponentName(String inputComponentName);
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/BaseTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/BaseTestCase.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/BaseTestCase.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/BaseTestCase.java Thu Aug 24 08:26:45 2006
@@ -27,14 +27,14 @@
 import java.util.UUID;
 
 import org.apache.commons.logging.Log;
+import org.apache.tapestry.Location;
 import org.apache.tapestry.Resource;
 import org.apache.tapestry.internal.annotations.SuppressNullCheck;
-import org.apache.tapestry.internal.ioc.Module;
 import org.apache.tapestry.ioc.Configuration;
 import org.apache.tapestry.ioc.LogSource;
 import org.apache.tapestry.ioc.MappedConfiguration;
-import org.apache.tapestry.ioc.OrderedConfiguration;
 import org.apache.tapestry.ioc.ObjectCreator;
+import org.apache.tapestry.ioc.OrderedConfiguration;
 import org.apache.tapestry.ioc.ServiceBuilderResources;
 import org.apache.tapestry.ioc.ServiceDecorator;
 import org.apache.tapestry.ioc.ServiceLocator;
@@ -299,11 +299,6 @@
         return newMock(ServiceBuilderResources.class);
     }
 
-    protected final Module newModule()
-    {
-        return newMock(Module.class);
-    }
-
     protected final void trainGetModuleId(ModuleDef def, String moduleId)
     {
         def.getModuleId();
@@ -331,6 +326,11 @@
     protected final Runnable newRunnable()
     {
         return newMock(Runnable.class);
+    }
+
+    protected final Location newLocation()
+    {
+        return newMock(Location.class);
     }
 
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/CollectionFactory.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/CollectionFactory.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/CollectionFactory.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/CollectionFactory.java Thu Aug 24 08:26:45 2006
@@ -21,6 +21,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.tapestry.internal.annotations.Utility;
@@ -67,10 +68,17 @@
     /**
      * Constructs a new {@link java.util.HashMap} instance by copying an existing Map instance.
      */
-
     public static <K, V> Map<K, V> newMap(Map<K, V> map)
     {
         return new HashMap<K, V>(map);
+    }
+
+    /**
+     * Constructs a new thread safe map.
+     */
+    public static <K, V> Map<K, V> newThreadSafeMap()
+    {
+        return new ConcurrentHashMap<K, V>();
     }
 
     /** Contructs and returns a new generic {@link java.util.ArrayList} instance. */

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/MessagesImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/MessagesImplTest.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/MessagesImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/MessagesImplTest.java Thu Aug 24 08:26:45 2006
@@ -74,5 +74,4 @@
     {
         assertEquals(_messages.format("rezult", "good"), "[REZULT]");
     }
-
 }

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/pageload/PageElementFactoryImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/pageload/PageElementFactoryImplTest.java?rev=434403&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/pageload/PageElementFactoryImplTest.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/pageload/PageElementFactoryImplTest.java Thu Aug 24 08:26:45 2006
@@ -0,0 +1,131 @@
+package org.apache.tapestry.internal.pageload;
+
+import org.apache.tapestry.Location;
+import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.internal.parser.AttributeToken;
+import org.apache.tapestry.internal.parser.EndElementToken;
+import org.apache.tapestry.internal.parser.StartElementToken;
+import org.apache.tapestry.internal.parser.TextToken;
+import org.apache.tapestry.internal.services.MarkupWriterImpl;
+import org.apache.tapestry.internal.structure.PageElement;
+import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.apache.tapestry.internal.transform.ComponentInstantiatorSource;
+import org.testng.annotations.Test;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+public class PageElementFactoryImplTest extends InternalBaseTestCase
+{
+    @Test
+    public void start_element()
+    {
+        ComponentInstantiatorSource source = newComponentInstantiatorSource();
+        MarkupWriter writer = new MarkupWriterImpl();
+        Location l = newLocation();
+
+        replay();
+
+        PageElementFactory factory = new PageElementFactoryImpl(source);
+        StartElementToken token = new StartElementToken("fred", l);
+
+        PageElement element = factory.newStartElement(token);
+
+        element.render(writer);
+
+        verify();
+
+        assertEquals(writer.toString(), "<fred/>");
+    }
+
+    @Test
+    public void attribute()
+    {
+        ComponentInstantiatorSource source = newComponentInstantiatorSource();
+        MarkupWriter writer = new MarkupWriterImpl();
+        Location l = newLocation();
+
+        replay();
+
+        PageElementFactory factory = new PageElementFactoryImpl(source);
+        AttributeToken token = new AttributeToken("name", "value", l);
+
+        PageElement element = factory.newAttributeElement(token);
+
+        writer.element("root");
+
+        element.render(writer);
+
+        verify();
+
+        assertEquals(writer.toString(), "<root name=\"value\"/>");
+    }
+
+    @Test
+    public void end_element()
+    {
+        ComponentInstantiatorSource source = newComponentInstantiatorSource();
+        MarkupWriter writer = new MarkupWriterImpl();
+        Location l = newLocation();
+
+        replay();
+
+        PageElementFactory factory = new PageElementFactoryImpl(source);
+        EndElementToken token = new EndElementToken(l);
+
+        PageElement element = factory.newEndElement(token);
+
+        writer.element("root");
+        writer.write("before");
+        writer.element("nested");
+
+        element.render(writer);
+
+        writer.write("after");
+
+        verify();
+
+        assertEquals(writer.toString(), "<root>before<nested/>after</root>");
+    }
+
+    @Test
+    public void end_element_is_singleton()
+    {
+        ComponentInstantiatorSource source = newComponentInstantiatorSource();
+        Location l1 = newLocation();
+        Location l2 = newLocation();
+
+        replay();
+
+        PageElementFactory factory = new PageElementFactoryImpl(source);
+
+        PageElement element1 = factory.newEndElement(new EndElementToken(l1));
+        PageElement element2 = factory.newEndElement(new EndElementToken(l2));
+
+        assertSame(element2, element1);
+
+        verify();
+    }
+
+    @Test
+    public void text_element()
+    {
+        ComponentInstantiatorSource source = newComponentInstantiatorSource();
+        MarkupWriter writer = new MarkupWriterImpl();
+        Location l = newLocation();
+
+        replay();
+
+        PageElementFactory factory = new PageElementFactoryImpl(source);
+        TextToken token = new TextToken("some text", l);
+
+        PageElement element = factory.newTextElement(token);
+
+        writer.element("root");
+        element.render(writer);
+
+        verify();
+
+        assertEquals(writer.toString(), "<root>some text</root>");
+    }
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java Thu Aug 24 08:26:45 2006
@@ -170,7 +170,7 @@
         // Detect the change and clear out the internal caches
 
         UpdateListenerHub hub = _registry.getService(
-                "tapestry.internal.services.UpdateListenerHub",
+                "tapestry.internal.UpdateListenerHub",
                 UpdateListenerHub.class);
 
         hub.fireUpdateEvent();

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/services/ClassFabUtilsTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/services/ClassFabUtilsTest.java?rev=434403&r1=434402&r2=434403&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/services/ClassFabUtilsTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/services/ClassFabUtilsTest.java Thu Aug 24 08:26:45 2006
@@ -44,5 +44,4 @@
         { "byte[][]", "[[B" },
         { "java.lang.Runnable[][]", "[[Ljava.lang.Runnable;" } };
     }
-
 }