You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2006/08/26 16:20:54 UTC

svn commit: r437167 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/ main/java/org/apache/tapestry/internal/ioc/services/ main/java/org/apache/tapestry/internal/model/ main/java/org/apache/tapestry/internal/services/ mai...

Author: hlship
Date: Sat Aug 26 07:20:50 2006
New Revision: 437167

URL: http://svn.apache.org/viewvc?rev=437167&view=rev
Log:
Fill in the gaps towards getting a simple page rendered.

Added:
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Start.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/
    tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/
    tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/
    tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Start.html
Removed:
    tapestry/tapestry5/tapestry-core/trunk/src/test/conf/log4j.properties
Modified:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/services/ServiceLogger.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformer.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSource.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/HTMLDispatcher.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/Instantiator.java
    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/PageElementFactoryImpl.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/PagePool.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageResponseRenderer.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageResponseRendererImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RenderQueueImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RequestPageCache.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RequestPageCacheImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/WebResponseImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElement.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/model/ComponentModel.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/MutableComponentModel.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RenderCommand.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RenderQueue.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/Dispatcher.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/WebResponse.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/web.xml
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/RequestPageCacheImplTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/PageImplTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java Sat Aug 26 07:20:50 2006
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry;
 
+import org.apache.tapestry.model.ComponentModel;
+
 /**
  * Provides a component instance with the resources provided by the framework.
  * 
@@ -26,4 +28,7 @@
      * container. For a page's root component, the value null is returned.
      */
     String getId();
+
+    /** Returns the component model object that defines the behavior of the component. */
+    ComponentModel getComponentModel();
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/services/ServiceLogger.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/services/ServiceLogger.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/services/ServiceLogger.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/services/ServiceLogger.java Sat Aug 26 07:20:50 2006
@@ -19,6 +19,8 @@
 import java.util.Iterator;
 
 import org.apache.commons.logging.Log;
+import org.apache.tapestry.internal.annotations.SuppressNullCheck;
+import org.apache.tapestry.util.Defense;
 
 /**
  * Used by {@link org.apache.tapestry.internal.ioc.services.LoggingDecoratorImpl} to delegate out
@@ -142,8 +144,11 @@
      * @param result
      *            the return value for the method invocation
      */
+    @SuppressNullCheck
     public void exit(String name, Object result)
     {
+        Defense.notNull(name, "name");
+
         StringBuffer buffer = new StringBuffer();
 
         buffer.append(format("[%s] %s [", EXIT, name));

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java Sat Aug 26 07:20:50 2006
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry.internal.model;
 
+import org.apache.tapestry.Resource;
 import org.apache.tapestry.model.MutableComponentModel;
 
 /**
@@ -23,5 +24,27 @@
  */
 public final class MutableComponentModelImpl implements MutableComponentModel
 {
+    private Resource _baseResource;
 
+    private String _componentClassName;
+
+    public Resource getBaseResource()
+    {
+        return _baseResource;
+    }
+
+    public void setBaseResource(Resource baseResource)
+    {
+        _baseResource = baseResource;
+    }
+
+    public String getComponentClassName()
+    {
+        return _componentClassName;
+    }
+
+    public void setComponentClassName(String componentClassName)
+    {
+        _componentClassName = componentClassName;
+    }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java Sat Aug 26 07:20:50 2006
@@ -1,3 +1,17 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package org.apache.tapestry.internal.services;
 
 import org.apache.tapestry.services.ComponentClassResolver;
@@ -36,7 +50,7 @@
 
     public void setApplicationPackage(String packageName)
     {
-        _appPagePackage = packageName = ".pages";
+        _appPagePackage = packageName + ".pages";
 
         _componentInstantiatorSource.addPackage(_appPagePackage);
     }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformer.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformer.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformer.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformer.java Sat Aug 26 07:20:50 2006
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.internal.services;
 
+import org.apache.tapestry.model.ComponentModel;
+
 import javassist.CtClass;
 
 /**
@@ -32,4 +34,13 @@
 
     /** Creates a new instantiator instance. */
     Instantiator createInstantiator(Class componentClass);
+
+    /**
+     * Returns a component model (which will have been generated by a prevous call to
+     * {@link #transformComponentClass(CtClass)).
+     * 
+     * @param componentClass
+     * @return
+     */
+    ComponentModel getComponentModel(Class componentClass);
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java Sat Aug 26 07:20:50 2006
@@ -26,6 +26,7 @@
 import org.apache.tapestry.events.InvalidationListener;
 import org.apache.tapestry.internal.annotations.Concurrent;
 import org.apache.tapestry.internal.model.MutableComponentModelImpl;
+import org.apache.tapestry.model.ComponentModel;
 import org.apache.tapestry.model.MutableComponentModel;
 import org.apache.tapestry.services.ComponentClassTransformWorker;
 
@@ -41,6 +42,8 @@
     /** Map from class name to class transformation. */
     private final Map<String, InternalClassTransformation> _nameToClassTransformation = newMap();
 
+    private final Map<String, ComponentModel> _nameToComponentModel = newMap();
+
     private final ComponentClassTransformWorker _workerChain;
 
     /**
@@ -60,6 +63,7 @@
     public void objectWasInvalidated(InvalidationEvent event)
     {
         _nameToClassTransformation.clear();
+        _nameToComponentModel.clear();
     }
 
     @Concurrent.Write
@@ -96,14 +100,19 @@
             return;
 
         // Eventually these will also be cached or published or something.
+        // TODO: child class model should start as deep copy of parent model?
+        // Or have pointer to parent model? Or something.
 
         MutableComponentModel model = new MutableComponentModelImpl();
+        
+        model.setComponentClassName(classname);
 
         _workerChain.transform(transformation, model);
 
         transformation.finish();
 
         _nameToClassTransformation.put(classname, transformation);
+        _nameToComponentModel.put(classname, model);
     }
 
     @Concurrent.Read
@@ -118,4 +127,18 @@
 
         return ct.createInstantiator(componentClass);
     }
+
+    @Concurrent.Read
+    public ComponentModel getComponentModel(Class componentClass)
+    {
+        String className = componentClass.getName();
+
+        ComponentModel result = _nameToComponentModel.get(className);
+
+        if (result == null)
+            throw new RuntimeException(ServicesMessages.classNotTransformed(className));
+
+        return result;
+    }
+
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSource.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSource.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSource.java Sat Aug 26 07:20:50 2006
@@ -15,6 +15,7 @@
 package org.apache.tapestry.internal.services;
 
 import org.apache.tapestry.internal.event.InvalidationEventHub;
+import org.apache.tapestry.model.ComponentModel;
 
 /**
  * Creates {@link org.apache.tapestry.internal.services.Instantiator}s for components, based on
@@ -37,12 +38,24 @@
      * Instantiators are cached, so repeated calls to this method with the same class name will
      * return the same instance; however, callers should also be aware that the instantiators may
      * lose validity after an invalidation (caused by changes to external Java class files).
+     * <p>
+     * TODO: Perhaps the Instantiator should just be a property of the ComponentModel?
      * 
      * @param classname
      *            FQCN to find (and perhaps transform and load)
      * @return an object which can instantiate an instance of the component
      */
     Instantiator findInstantiator(String classname);
+
+    /**
+     * Given the name of a component class, provides the model obtained while loading and
+     * transforming the class.
+     * 
+     * @param classname
+     *            FQCN to find
+     * @return model defining the behavior of the class
+     */
+    ComponentModel findComponentModel(String classname);
 
     /**
      * Adds a controlled package. Only classes within controlled packages are subject to

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImpl.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImpl.java Sat Aug 26 07:20:50 2006
@@ -32,6 +32,7 @@
 import org.apache.tapestry.events.UpdateListener;
 import org.apache.tapestry.internal.event.InvalidationEventHubImpl;
 import org.apache.tapestry.internal.util.URLChangeTracker;
+import org.apache.tapestry.model.ComponentModel;
 import org.apache.tapestry.util.Defense;
 
 import static org.apache.tapestry.util.CollectionFactory.newMap;
@@ -213,6 +214,13 @@
         }
 
         return result;
+    }
+
+    public ComponentModel findComponentModel(String classname)
+    {
+        Class instanceClass = findClass(classname);
+
+        return _transformer.getComponentModel(instanceClass);
     }
 
     private Class findClass(String classname)

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/HTMLDispatcher.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/HTMLDispatcher.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/HTMLDispatcher.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/HTMLDispatcher.java Sat Aug 26 07:20:50 2006
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.internal.services;
 
+import java.io.IOException;
+
 import org.apache.tapestry.internal.structure.Page;
 import org.apache.tapestry.services.ComponentClassResolver;
 import org.apache.tapestry.services.Dispatcher;
@@ -42,7 +44,7 @@
         _cache = cache;
     }
 
-    public boolean dispatch(WebRequest request, WebResponse response)
+    public boolean dispatch(WebRequest request, WebResponse response) throws IOException
     {
         String path = request.getPath();
 
@@ -55,7 +57,9 @@
 
         // We have a match!
 
-        String minimalPageName = path.substring(0, pos);
+        // The first character will be the leading slash
+
+        String minimalPageName = path.substring(1, pos);
 
         String fullPageName = _resolver.resolvePageName(minimalPageName);
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/Instantiator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/Instantiator.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/Instantiator.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/Instantiator.java Sat Aug 26 07:20:50 2006
@@ -16,7 +16,6 @@
 
 import org.apache.tapestry.internal.InternalComponentResources;
 import org.apache.tapestry.runtime.ComponentLifecycle;
-import org.apache.tapestry.runtime.ResourceAware;
 
 /**
  * An object that can instantiate another object. This is used with enhanced classes, in which the
@@ -30,7 +29,8 @@
 {
     /**
      * Instantiates and returns a new instance of the desired class. Component classes are always
-     * modified so that they implement {@link ResourceAware} (and often, other interfaces as well).
+     * modified so that they implement {@link ComponentLifecycle} (and often, other interfaces as
+     * well).
      */
     ComponentLifecycle newInstance(InternalComponentResources resources);
 }

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=437167&r1=437166&r2=437167&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 Sat Aug 26 07:20:50 2006
@@ -25,6 +25,7 @@
 import org.apache.tapestry.ioc.services.LoggingDecorator;
 import org.apache.tapestry.ioc.services.ThreadCleanupHub;
 import org.apache.tapestry.services.ComponentClassTransformWorker;
+import org.apache.tapestry.services.MarkupWriterFactory;
 
 /**
  * @author Howard M. Lewis Ship
@@ -34,6 +35,8 @@
 {
     private final ComponentInstantiatorSource _componentInstantiatorSource;
 
+    private final ComponentTemplateSource _componentTemplateSource;
+
     private final UpdateListenerHub _updateListenerHub;
 
     private final ThreadCleanupHub _threadCleanupHub;
@@ -41,11 +44,13 @@
     public InternalModule(@InjectService("ComponentInstantiatorSource")
     ComponentInstantiatorSource componentInstantiatorSource, @InjectService("UpdateListenerHub")
     UpdateListenerHub updateListenerHub, @InjectService("tapestry.ioc.ThreadCleanupHub")
-    ThreadCleanupHub threadCleanupHub)
+    ThreadCleanupHub threadCleanupHub, @InjectService("ComponentTemplateSource")
+    ComponentTemplateSource componentTemplateSource)
     {
         _componentInstantiatorSource = componentInstantiatorSource;
         _updateListenerHub = updateListenerHub;
         _threadCleanupHub = threadCleanupHub;
+        _componentTemplateSource = componentTemplateSource;
     }
 
     public ComponentClassTransformer buildComponentClassTransformer(
@@ -74,8 +79,17 @@
     public ComponentTemplateSource buildComponentTemplateSource(@InjectService("TemplateParser")
     TemplateParser parser)
     {
-        // TODO: Make the CTS an UpdateListener and an InvalidationEventHub
-        return new ComponentTemplateSourceImpl(parser);
+        ComponentTemplateSourceImpl service = new ComponentTemplateSourceImpl(parser);
+
+        _updateListenerHub.addUpdateListener(service);
+
+        return service;
+    }
+
+    @Lifecycle("perthread")
+    public TemplateParser buildTemplateParser()
+    {
+        return new TemplateParserImpl();
     }
 
     public PageElementFactory buildPageElementFactory()
@@ -83,11 +97,10 @@
         return new PageElementFactoryImpl(_componentInstantiatorSource);
     }
 
-    public PageLoader buildPageLoader(@InjectService("ComponentTemplateSource")
-    ComponentTemplateSource templateSource, @InjectService("PageElementFactory")
+    public PageLoader buildPageLoader(@InjectService("PageElementFactory")
     PageElementFactory pageElementFactory)
     {
-        PageLoaderImpl service = new PageLoaderImpl(templateSource, pageElementFactory);
+        PageLoaderImpl service = new PageLoaderImpl(_componentTemplateSource, pageElementFactory);
 
         _componentInstantiatorSource.addInvalidationListener(service);
 
@@ -149,5 +162,12 @@
         _threadCleanupHub.addThreadCleanupListener(service);
 
         return service;
+    }
+
+    public PageResponseRenderer buildPageResponseRenderer(
+            @InjectService("tapestry.MarkupWriterFactory")
+            MarkupWriterFactory markupWriterFactory)
+    {
+        return new PageResponseRendererImpl(markupWriterFactory);
     }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageElementFactoryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageElementFactoryImpl.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageElementFactoryImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageElementFactoryImpl.java Sat Aug 26 07:20:50 2006
@@ -27,6 +27,7 @@
 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.model.ComponentModel;
 import org.apache.tapestry.runtime.RenderQueue;
 
 /**
@@ -87,19 +88,21 @@
         String componentName = token.getType();
 
         Instantiator instantiator = _componentInstantiatorSource.findInstantiator(componentName);
+        ComponentModel model = _componentInstantiatorSource.findComponentModel(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);
+        return new ComponentPageElementImpl(page, container, id, instantiator, model);
     }
 
     public ComponentPageElement newRootComponentElement(Page page, String componentName)
     {
         Instantiator instantiator = _componentInstantiatorSource.findInstantiator(componentName);
+        ComponentModel model = _componentInstantiatorSource.findComponentModel(componentName);
 
-        return new ComponentPageElementImpl(page, instantiator);
+        return new ComponentPageElementImpl(page, instantiator, model);
     }
 
 }

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=437167&r1=437166&r2=437167&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 Sat Aug 26 07:20:50 2006
@@ -117,7 +117,8 @@
         // Have to do something here, like consult the ComponentModelSource and get a
         // ComponentModel to guide the process. Lots of moving parts.
 
-        ComponentTemplate template = _templateSource.getTemplate("", _locale);
+        ComponentTemplate template = _templateSource.getTemplate(loadingComponent
+                .getComponentModel().getComponentClassName(), _locale);
 
         // Here's the thing. Stuff in this template is part of element's template unless
         // it is inside another component, in which case, it is part of the component's

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePool.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePool.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePool.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PagePool.java Sat Aug 26 07:20:50 2006
@@ -16,6 +16,11 @@
 
 import org.apache.tapestry.internal.structure.Page;
 
+/**
+ * Provides access to pages, creating them as necessary, and pooling them between requests.
+ * 
+ * @author Howard M. Lewis Ship
+ */
 public interface PagePool
 {
     /**

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageResponseRenderer.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageResponseRenderer.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageResponseRenderer.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageResponseRenderer.java Sat Aug 26 07:20:50 2006
@@ -14,10 +14,17 @@
 
 package org.apache.tapestry.internal.services;
 
+import java.io.IOException;
+
 import org.apache.tapestry.internal.structure.Page;
 import org.apache.tapestry.services.WebResponse;
 
+/**
+ * Service responsible for writing a full page markup response.
+ * 
+ * @author Howard M. Lewis Ship
+ */
 public interface PageResponseRenderer
 {
-    void renderPageResponse(Page page, WebResponse response);
+    void renderPageResponse(Page page, WebResponse response) throws IOException;
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageResponseRendererImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageResponseRendererImpl.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageResponseRendererImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageResponseRendererImpl.java Sat Aug 26 07:20:50 2006
@@ -1,17 +1,56 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package org.apache.tapestry.internal.services;
 
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import org.apache.tapestry.MarkupWriter;
 import org.apache.tapestry.internal.structure.Page;
 import org.apache.tapestry.services.MarkupWriterFactory;
 import org.apache.tapestry.services.WebResponse;
 
+/**
+ * @author Howard M. Lewis Ship
+ */
 public class PageResponseRendererImpl implements PageResponseRenderer
 {
-    private MarkupWriterFactory _markupWriterFactory;
-    
-    public void renderPageResponse(Page page, WebResponse response)
+    private final MarkupWriterFactory _markupWriterFactory;
+
+    public PageResponseRendererImpl(MarkupWriterFactory markupWriterFactory)
     {
+        _markupWriterFactory = markupWriterFactory;
+    }
+
+    public void renderPageResponse(Page page, WebResponse response) throws IOException
+    {
+        MarkupWriter writer = _markupWriterFactory.newMarkupWriter();
+
+        RenderQueueImpl queue = new RenderQueueImpl();
+
+        queue.addFirst(page.getRootElement());
+
+        // Run the queue until empty.
+
+        queue.run(writer);
+
+        PrintWriter pw = response.getPrintWriter();
+
+        writer.toXML(pw);
 
-        
+        pw.flush();
     }
 
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RenderQueueImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RenderQueueImpl.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RenderQueueImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RenderQueueImpl.java Sat Aug 26 07:20:50 2006
@@ -1,3 +1,17 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package org.apache.tapestry.internal.services;
 
 import java.util.List;

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RequestPageCache.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RequestPageCache.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RequestPageCache.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RequestPageCache.java Sat Aug 26 07:20:50 2006
@@ -1,3 +1,17 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package org.apache.tapestry.internal.services;
 
 import org.apache.tapestry.internal.structure.Page;

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RequestPageCacheImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RequestPageCacheImpl.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RequestPageCacheImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RequestPageCacheImpl.java Sat Aug 26 07:20:50 2006
@@ -1,3 +1,17 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package org.apache.tapestry.internal.services;
 
 import java.util.Map;

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/WebResponseImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/WebResponseImpl.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/WebResponseImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/WebResponseImpl.java Sat Aug 26 07:20:50 2006
@@ -14,6 +14,9 @@
 
 package org.apache.tapestry.internal.services;
 
+import java.io.IOException;
+import java.io.PrintWriter;
+
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.tapestry.services.WebResponse;
@@ -29,4 +32,10 @@
     {
         _response = response;
     }
+
+    public PrintWriter getPrintWriter() throws IOException
+    {
+        return _response.getWriter();
+    }
+
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElement.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElement.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElement.java Sat Aug 26 07:20:50 2006
@@ -24,8 +24,12 @@
  * 
  * @author Howard M. Lewis Ship
  */
-public interface ComponentPageElement extends PageElement, InternalComponentResources, RenderCommand
+public interface ComponentPageElement extends PageElement, InternalComponentResources,
+        RenderCommand
 {
+    /** Returns the page which contains this component. */
+    Page getPage();
+
     /**
      * Containing component (or null for the root component of a page).
      */

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=437167&r1=437166&r2=437167&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 Sat Aug 26 07:20:50 2006
@@ -21,6 +21,7 @@
 import org.apache.tapestry.internal.annotations.SuppressNullCheck;
 import org.apache.tapestry.internal.parser.AttributeToken;
 import org.apache.tapestry.internal.services.Instantiator;
+import org.apache.tapestry.model.ComponentModel;
 import org.apache.tapestry.runtime.ComponentLifecycle;
 import org.apache.tapestry.runtime.RenderCommand;
 import org.apache.tapestry.runtime.RenderQueue;
@@ -51,6 +52,8 @@
     // The user-provided class, with runtime code enhancements.
     private final ComponentLifecycle _component;
 
+    private final ComponentModel _componentModel;
+
     private Map<String, ComponentPageElement> _children;
 
     // This is likely to change shortly to something more involved; we need to introduce the concept
@@ -59,12 +62,14 @@
     private final Map<String, AttributeToken> _parameters = newMap();
 
     /** Constructor for the root component of a page. */
-    public ComponentPageElementImpl(Page page, Instantiator instantiator)
+    public ComponentPageElementImpl(Page page, Instantiator instantiator, ComponentModel model)
     {
         _page = page;
         _container = null;
-        _component = instantiator.newInstance(this);
         _id = null;
+        _componentModel = model;
+
+        _component = instantiator.newInstance(this);
     }
 
     /**
@@ -72,14 +77,21 @@
      * the hierarchy.
      */
     public ComponentPageElementImpl(Page page, ComponentPageElement container, String id,
-            Instantiator instantiator)
+            Instantiator instantiator, ComponentModel model)
     {
         _page = page;
         _container = container;
         _id = id;
+        _componentModel = model;
+
         _component = instantiator.newInstance(this);
     }
 
+    public Page getPage()
+    {
+        return _page;
+    }
+
     public ComponentPageElement getContainer()
     {
         return _container;
@@ -201,6 +213,11 @@
     private int size(List<?> list)
     {
         return list == null ? 0 : list.size();
+    }
+
+    public ComponentModel getComponentModel()
+    {
+        return _componentModel;
     }
 
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/ComponentModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/ComponentModel.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/ComponentModel.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/ComponentModel.java Sat Aug 26 07:20:50 2006
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.model;
 
+import org.apache.tapestry.Resource;
+
 /**
  * Defines a component in terms of its capabilities, parameters, sub-components, etc. During
  * <em>runtime</em>, the component model is immutable. During <em>construction</em> time, when
@@ -24,5 +26,14 @@
  */
 public interface ComponentModel
 {
+    /** The FQCN of the component. */
+    String getComponentClassName();
 
+    /**
+     * Returns the resource corresponding to the class file for this component. This is used to find
+     * related resources, such as the component's template and message catalog.
+     * 
+     * @return
+     */
+    Resource getBaseResource();
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/MutableComponentModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/MutableComponentModel.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/MutableComponentModel.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/MutableComponentModel.java Sat Aug 26 07:20:50 2006
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.model;
 
+import org.apache.tapestry.Resource;
+
 /**
  * Mutable version of {@link org.apache.tapestry.model.ComponentModel} used during the
  * transformation phase.
@@ -22,5 +24,7 @@
  */
 public interface MutableComponentModel extends ComponentModel
 {
-
+    void setBaseResource(Resource resource);
+    
+    void setComponentClassName(String className);
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RenderCommand.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RenderCommand.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RenderCommand.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RenderCommand.java Sat Aug 26 07:20:50 2006
@@ -1,3 +1,17 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package org.apache.tapestry.runtime;
 
 import org.apache.tapestry.MarkupWriter;

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RenderQueue.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RenderQueue.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RenderQueue.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RenderQueue.java Sat Aug 26 07:20:50 2006
@@ -1,3 +1,17 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package org.apache.tapestry.runtime;
 
 /**

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/Dispatcher.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/Dispatcher.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/Dispatcher.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/Dispatcher.java Sat Aug 26 07:20:50 2006
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry.services;
 
+import java.io.IOException;
 
 /**
  * A dispatcher is responsible for recognizing an incoming request
@@ -27,5 +28,5 @@
      * 
      * @return true if a response was delivered
      */
-    boolean dispatch(WebRequest request, WebResponse response);
+    boolean dispatch(WebRequest request, WebResponse response) throws IOException;
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java Sat Aug 26 07:20:50 2006
@@ -25,11 +25,14 @@
 import org.apache.tapestry.MarkupWriter;
 import org.apache.tapestry.internal.services.ComponentClassResolverImpl;
 import org.apache.tapestry.internal.services.ComponentInstantiatorSource;
+import org.apache.tapestry.internal.services.HTMLDispatcher;
 import org.apache.tapestry.internal.services.InfrastructureImpl;
 import org.apache.tapestry.internal.services.InfrastructureManagerImpl;
 import org.apache.tapestry.internal.services.InternalModule;
 import org.apache.tapestry.internal.services.MarkupWriterImpl;
+import org.apache.tapestry.internal.services.PageResponseRenderer;
 import org.apache.tapestry.internal.services.RequestGlobalsImpl;
+import org.apache.tapestry.internal.services.RequestPageCache;
 import org.apache.tapestry.internal.services.WebRequestImpl;
 import org.apache.tapestry.internal.services.WebResponseImpl;
 import org.apache.tapestry.ioc.Configuration;
@@ -114,16 +117,13 @@
         return _chainBuilder.build(ComponentClassTransformWorker.class, configuration);
     }
 
-    public Dispatcher buildHTMLDispatcher()
+    /** Dispatcher that recognizes full-page HTML documents by the .html extension. */
+    public Dispatcher buildHTMLDispatcher(@InjectService("ComponentClassResolver")
+    ComponentClassResolver resolver, @InjectService("tapestry.internal.PageResponseRenderer")
+    PageResponseRenderer renderer, @InjectService("tapestry.internal.RequestPageCache")
+    RequestPageCache cache)
     {
-        return new Dispatcher()
-        {
-            public boolean dispatch(WebRequest request, WebResponse response)
-            {
-                return false;
-            }
-
-        };
+        return new HTMLDispatcher(resolver, renderer, cache);
     }
 
     public HttpServletRequestHandler buildHttpServletRequestHandler(Log log,

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/WebResponse.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/WebResponse.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/WebResponse.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/WebResponse.java Sat Aug 26 07:20:50 2006
@@ -14,7 +14,19 @@
 
 package org.apache.tapestry.services;
 
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * API agnostic wrapper for generating a response.
+ * 
+ * @author Howard M. Lewis Ship
+ */
 public interface WebResponse
 {
-
+    /**
+     * Returns a PrintWriter object to which output may be sent. Invoking flush() on the writer will
+     * commit the output.
+     */
+    PrintWriter getPrintWriter() throws IOException;
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/web.xml?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/web.xml (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/web.xml Sat Aug 26 07:20:50 2006
@@ -1,4 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+   Copyright 2006 The Apache Software Foundation
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
 <!DOCTYPE web-app
       PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
       "http://java.sun.com/dtd/web-app_2_3.dtd">

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Start.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Start.java?rev=437167&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Start.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Start.java Sat Aug 26 07:20:50 2006
@@ -0,0 +1,28 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.integration.app1.pages;
+
+import org.apache.tapestry.annotations.ComponentClass;
+
+/**
+ * Have to start somewhere!
+ * 
+ * @author Howard M. Lewis Ship
+ */
+@ComponentClass
+public class Start
+{
+
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java Sat Aug 26 07:20:50 2006
@@ -1,3 +1,17 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package org.apache.tapestry.internal.services;
 
 import java.util.Locale;

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/RequestPageCacheImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/RequestPageCacheImplTest.java?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/RequestPageCacheImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/RequestPageCacheImplTest.java Sat Aug 26 07:20:50 2006
@@ -1,3 +1,17 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package org.apache.tapestry.internal.services;
 
 import org.apache.tapestry.internal.structure.Page;

Modified: 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=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/PageImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/PageImplTest.java Sat Aug 26 07:20:50 2006
@@ -1,3 +1,17 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package org.apache.tapestry.internal.structure;
 
 import java.util.Locale;

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties?rev=437167&r1=437166&r2=437167&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties Sat Aug 26 07:20:50 2006
@@ -22,4 +22,6 @@
 log4j.appender.A1.layout.ConversionPattern=%c{1} [%p] %m%n
 
 log4j.category.org.apache.tapestry=debug
+log4j.category.tapestry=debug
+log4j.category.tapestry.ioc.ClassFactory=error
 

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Start.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Start.html?rev=437167&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Start.html (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Start.html Sat Aug 26 07:20:50 2006
@@ -0,0 +1,6 @@
+<html>
+    <head>
+        <title>First Tapestry 5 Page</title>
+    </head>
+    <body> This is the <span style="color:green">First Tapestry 5 Page, ever!</span>. </body>
+</html>