Author: hlship
Date: Sun Dec 31 14:35:43 2006
New Revision: 491506

URL: http://svn.apache.org/viewvc?view=rev&rev=491506
Log:
Automatically supply a default Tapestry stylesheet with each page

Added:
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ClasspathAssetSource.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ClasspathAssetSourceImpl.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InjectStandardStylesheetCommand.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/default.css
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InjectStandardStylesheetCommandTest.java
Modified:
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/MarkupWriter.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Errors.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/PageMarkupRendererImpl.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/DefaultPageRenderCommand.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/PageRenderInitializer.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/MarkupWriter.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/MarkupWriter.java?view=diff&rev=491506&r1=491505&r2=491506
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/MarkupWriter.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/MarkupWriter.java
 Sun Dec 31 14:35:43 2006
@@ -104,4 +104,7 @@
      * [EMAIL PROTECTED] Document}'s [EMAIL PROTECTED] MarkupModel}). The 
markup stream is sent to the writer.
      */
     void toMarkup(PrintWriter writer);
+
+    /** Returns the Document into which this writer creates elements or other 
nodes. */
+    Document getDocument();
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Errors.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Errors.java?view=diff&rev=491506&r1=491505&r2=491506
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Errors.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/Errors.java
 Sun Dec 31 14:35:43 2006
@@ -48,7 +48,8 @@
 
         writer.element("div", "class", _class);
 
-        writer.element("span", "class", "banner");
+        // Inner div for the banner text
+        writer.element("div");
         writer.write(_banner);
         writer.end();
 

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ClasspathAssetSource.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ClasspathAssetSource.java?view=auto&rev=491506
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ClasspathAssetSource.java
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ClasspathAssetSource.java
 Sun Dec 31 14:35:43 2006
@@ -0,0 +1,32 @@
+// 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;
+
+import org.apache.tapestry.Asset;
+
+/** Convienience for acquiring a classpath asset via its path. */
+public interface ClasspathAssetSource
+{
+    /**
+     * @param path
+     *            path to the base resource, relative to classpath root
+     * @param locale
+     *            to localize the resource to
+     * @return the asset
+     */
+    Asset getClasspathAsset(String path, Locale locale);
+}

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ClasspathAssetSourceImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ClasspathAssetSourceImpl.java?view=auto&rev=491506
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ClasspathAssetSourceImpl.java
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ClasspathAssetSourceImpl.java
 Sun Dec 31 14:35:43 2006
@@ -0,0 +1,40 @@
+// 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;
+
+import org.apache.tapestry.Asset;
+import org.apache.tapestry.ioc.Resource;
+import org.apache.tapestry.services.AssetSource;
+
+public class ClasspathAssetSourceImpl implements ClasspathAssetSource
+{
+    private final Resource _classpathRoot;
+
+    private final AssetSource _assetSource;
+
+    public ClasspathAssetSourceImpl(Resource classpathRoot, AssetSource 
assetSource)
+    {
+        _classpathRoot = classpathRoot;
+        _assetSource = assetSource;
+    }
+
+    public Asset getClasspathAsset(String path, Locale locale)
+    {
+        return _assetSource.findAsset(_classpathRoot, path, locale);
+    }
+
+}

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InjectStandardStylesheetCommand.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InjectStandardStylesheetCommand.java?view=auto&rev=491506
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InjectStandardStylesheetCommand.java
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InjectStandardStylesheetCommand.java
 Sun Dec 31 14:35:43 2006
@@ -0,0 +1,61 @@
+// 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.Asset;
+import org.apache.tapestry.dom.Document;
+import org.apache.tapestry.dom.Element;
+import org.apache.tapestry.ioc.services.ThreadLocale;
+import org.apache.tapestry.services.Environment;
+import org.apache.tapestry.services.PageRenderCommand;
+
+/**
+ * Checks to see if the output document has a <html>/<head> 
element and, if so, adds the
+ * default Tapestry stylesheet to the start.
+ */
+public class InjectStandardStylesheetCommand implements PageRenderCommand
+{
+    private final ThreadLocale _threadLocale;
+
+    private final ClasspathAssetSource _classpathAssetSource;
+
+    public InjectStandardStylesheetCommand(ThreadLocale threadLocale,
+            ClasspathAssetSource classpathAssetSource)
+    {
+        _threadLocale = threadLocale;
+        _classpathAssetSource = classpathAssetSource;
+    }
+
+    public void setup(Environment environment)
+    {
+    }
+
+    public void cleanup(Environment environment)
+    {
+        Document document = environment.peek(Document.class);
+
+        Element head = document.find("html/head");
+
+        if (head == null)
+            return;
+
+        Asset asset = _classpathAssetSource.getClasspathAsset(
+                "org/apache/tapestry/default.css",
+                _threadLocale.getLocale());
+
+        head.elementAt(0, "link", "rel", "stylesheet", "type", "text/css", 
"href", asset
+                .toClientURL());
+    }
+}

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?view=diff&rev=491506&r1=491505&r2=491506
==============================================================================
--- 
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
 Sun Dec 31 14:35:43 2006
@@ -50,6 +50,7 @@
 import org.apache.tapestry.services.ApplicationInitializer;
 import org.apache.tapestry.services.ApplicationInitializerFilter;
 import org.apache.tapestry.services.AssetFactory;
+import org.apache.tapestry.services.AssetSource;
 import org.apache.tapestry.services.Binding;
 import org.apache.tapestry.services.BindingFactory;
 import org.apache.tapestry.services.BindingSource;
@@ -580,5 +581,13 @@
     public SessionHolder buildSessionHolder()
     {
         return _request;
+    }
+
+    public static ClasspathAssetSource buildClasspathAssetSource(
+            @InjectService("ClasspathAssetFactory")
+            AssetFactory classpathAssetFactory, 
@Inject("infrastructure:AssetSource")
+            AssetSource assetSource)
+    {
+        return new 
ClasspathAssetSourceImpl(classpathAssetFactory.getRootResource(), assetSource);
     }
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageMarkupRendererImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageMarkupRendererImpl.java?view=diff&rev=491506&r1=491505&r2=491506
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageMarkupRendererImpl.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageMarkupRendererImpl.java
 Sun Dec 31 14:35:43 2006
@@ -15,6 +15,7 @@
 package org.apache.tapestry.internal.services;
 
 import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.dom.Document;
 import org.apache.tapestry.internal.structure.Page;
 import org.apache.tapestry.services.PageRenderInitializer;
 
@@ -29,7 +30,9 @@
 
     public void renderPageMarkup(Page page, MarkupWriter writer)
     {
-        _pageRenderInitializer.setup();
+        Document document = writer.getDocument();
+
+        _pageRenderInitializer.setup(document);
 
         RenderQueueImpl queue = new RenderQueueImpl(page.getLog());
 
@@ -39,7 +42,7 @@
 
         queue.run(writer);
 
-        _pageRenderInitializer.cleanup();
+        _pageRenderInitializer.cleanup(document);
     }
 
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/DefaultPageRenderCommand.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/DefaultPageRenderCommand.java?view=diff&rev=491506&r1=491505&r2=491506
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/DefaultPageRenderCommand.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/DefaultPageRenderCommand.java
 Sun Dec 31 14:35:43 2006
@@ -14,18 +14,20 @@
 
 package org.apache.tapestry.services;
 
+import org.apache.tapestry.dom.Document;
+
 /**
  * Default implementation of [EMAIL PROTECTED] PageRenderCommand} that does 
nothing.
  */
 public abstract class DefaultPageRenderCommand implements PageRenderCommand
 {
     /** Does nothing. */
-    public void cleanup(Environment environment)
+    public void cleanup(Environment environment, Document document)
     {
     }
 
     /** Does nothing. */
-    public void setup(Environment environment)
+    public void setup(Environment environment, Document document)
     {
     }
 

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/PageRenderInitializer.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/PageRenderInitializer.java?view=diff&rev=491506&r1=491505&r2=491506
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/PageRenderInitializer.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/PageRenderInitializer.java
 Sun Dec 31 14:35:43 2006
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.services;
 
+import org.apache.tapestry.dom.Document;
+
 /**
  * Responsible for setup and cleanup of the rendering of a page. The 
implementation of this is based
  * on an ordered list of [EMAIL PROTECTED] PageRenderCommand}s.
@@ -21,14 +23,21 @@
 public interface PageRenderInitializer
 {
     /**
-     * Perform any initial setup, by invoking [EMAIL PROTECTED] 
PageRenderCommand#setup(Environment)}.
+     * Perform any initial setup, by invoking [EMAIL PROTECTED] 
PageRenderCommand#setup(Environment, Document)}.
      * Execution occurs in normal order.
+     * 
+     * @param document
+     *            the document (initially empty) that will be constructed from 
the page and its
+     *            components
      */
-    void setup();
+    void setup(Document document);
 
     /**
-     * Peform any post-render cleanup, by invoking [EMAIL PROTECTED] 
PageRenderCommand#cleanup(Environment)}.
+     * Peform any post-render cleanup, by invoking [EMAIL PROTECTED] 
PageRenderCommand#cleanup(Environment, Document)}.
      * Execution order is reversed.
+     * 
+     * @param document
+     *            the populated document, prior to being streamed to the client
      */
-    void cleanup();
+    void cleanup(Document document);
 }

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?view=diff&rev=491506&r1=491505&r2=491506
==============================================================================
--- 
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
 Sun Dec 31 14:35:43 2006
@@ -39,6 +39,7 @@
 import org.apache.tapestry.annotations.InjectPage;
 import org.apache.tapestry.annotations.SetupRender;
 import org.apache.tapestry.dom.DefaultMarkupModel;
+import org.apache.tapestry.dom.Document;
 import org.apache.tapestry.internal.InternalConstants;
 import org.apache.tapestry.internal.bindings.ComponentBindingFactory;
 import org.apache.tapestry.internal.bindings.LiteralBindingFactory;
@@ -48,6 +49,7 @@
 import org.apache.tapestry.internal.services.ActionLinkHandlerImpl;
 import org.apache.tapestry.internal.services.ApplicationGlobalsImpl;
 import org.apache.tapestry.internal.services.AssetDispatcher;
+import org.apache.tapestry.internal.services.ClasspathAssetSource;
 import org.apache.tapestry.internal.services.InjectAssetWorker;
 import org.apache.tapestry.internal.services.AssetSourceImpl;
 import org.apache.tapestry.internal.services.BindingSourceImpl;
@@ -75,6 +77,7 @@
 import org.apache.tapestry.internal.services.InjectComponentWorker;
 import org.apache.tapestry.internal.services.InjectNamedWorker;
 import org.apache.tapestry.internal.services.InjectPageWorker;
+import org.apache.tapestry.internal.services.InjectStandardStylesheetCommand;
 import org.apache.tapestry.internal.services.InternalModule;
 import org.apache.tapestry.internal.services.LinkFactory;
 import org.apache.tapestry.internal.services.MarkupWriterImpl;
@@ -124,6 +127,7 @@
 import org.apache.tapestry.ioc.services.PipelineBuilder;
 import org.apache.tapestry.ioc.services.PropertyShadowBuilder;
 import org.apache.tapestry.ioc.services.StrategyBuilder;
+import org.apache.tapestry.ioc.services.ThreadLocale;
 import org.apache.tapestry.ioc.services.TypeCoercer;
 import org.apache.tapestry.ioc.util.StrategyRegistry;
 import org.apache.tapestry.runtime.Component;
@@ -691,34 +695,34 @@
     {
         return new PageRenderInitializer()
         {
-            public void setup()
+            public void setup(Document document)
             {
                 _environment.clear();
 
+                _environment.push(Document.class, document);
+
                 for (PageRenderCommand command : configuration)
                     command.setup(_environment);
             }
 
-            public void cleanup()
+            public void cleanup(Document document)
             {
                 Iterator<PageRenderCommand> i = 
InternalUtils.reverseIterator(configuration);
 
                 while (i.hasNext())
                     i.next().cleanup(_environment);
 
-                // Probably not necessary, but what the heck!
                 _environment.clear();
             }
         };
     }
 
     public static void contributePageRenderInitializer(
-            OrderedConfiguration<PageRenderCommand> configuration)
+            OrderedConfiguration<PageRenderCommand> configuration,
+            @InjectService("tapestry.ioc.ThreadLocale")
+            ThreadLocale threadLocale, 
@InjectService("tapestry.internal.ClasspathAssetSource")
+            ClasspathAssetSource classpathAssetSource)
     {
-        // I'm not happy with this lifecycle, per-se. Instead of Runnable, I 
think we need an
-        // interface more tailored to Environment, with perhaps a second 
method for the end of
-        // the page render.
-
         configuration.add("PageRenderSupport", new PageRenderCommand()
         {
             public void setup(Environment environment)
@@ -748,6 +752,9 @@
                 environment.pop(Heartbeat.class).end();
             }
         });
+
+        configuration.add("InjectStandardStylesheet", new 
InjectStandardStylesheetCommand(
+                threadLocale, classpathAssetSource));
     }
 
     /** A public service since extensions may provide new persistent 
strategies. */

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/default.css
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/default.css?view=auto&rev=491506
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/default.css
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/default.css
 Sun Dec 31 14:35:43 2006
@@ -0,0 +1,25 @@
+BODY {
+    border: 1px solid silver;
+    padding: 5px;
+}
+DIV.tapestry-error {
+    border: 1px solid red;
+    padding: 0px;
+    margin: 4px 0px;
+}
+DIV.tapestry-error DIV {
+    padding: 2px;
+    display: block;
+    margin: 0px;
+    background-color: red;
+    color: white;
+    font-weight: bold;
+}
+DIV.tapestry-error UL {
+    margin: 2px 0px;
+    background-color:white;
+    color:red;
+}
+DIV.tapestry-error LI {
+    margin-left: -20px;
+}

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InjectStandardStylesheetCommandTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InjectStandardStylesheetCommandTest.java?view=auto&rev=491506
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InjectStandardStylesheetCommandTest.java
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InjectStandardStylesheetCommandTest.java
 Sun Dec 31 14:35:43 2006
@@ -0,0 +1,104 @@
+// 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;
+
+import org.apache.tapestry.Asset;
+import org.apache.tapestry.dom.Document;
+import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.apache.tapestry.ioc.services.ThreadLocale;
+import org.apache.tapestry.services.Environment;
+import org.testng.annotations.Test;
+
+public class InjectStandardStylesheetCommandTest extends InternalBaseTestCase
+{
+    @Test
+    public void no_head_element()
+    {
+        Document d = new Document();
+        ThreadLocale tl = newThreadLocale();
+        ClasspathAssetSource source = newClasspathAssetSource();
+        Environment env = newEnvironment();
+
+        d.newRootElement("foo");
+        String initial = d.toString();
+
+        train_peek(env, Document.class, d);
+
+        replay();
+
+        new InjectStandardStylesheetCommand(tl, source).cleanup(env);
+
+        assertEquals(d.toString(), initial, "Document structure should not 
change.");
+
+        verify();
+    }
+
+    @Test
+    public void head_element_found()
+    {
+        Document d = new Document();
+        ThreadLocale tl = newThreadLocale();
+        ClasspathAssetSource source = newClasspathAssetSource();
+        Environment env = newEnvironment();
+        Asset asset = newAsset();
+        Locale l = Locale.FRENCH;
+
+        d.newRootElement("html").element("head");
+
+        train_peek(env, Document.class, d);
+        train_getLocale(tl, l);
+
+        train_getClasspathAsset(source, "org/apache/tapestry/default.css", l, 
asset);
+        toClientURL(asset, "{clientURL}");
+
+        replay();
+
+        new InjectStandardStylesheetCommand(tl, source).cleanup(env);
+
+        verify();
+
+        assertEquals(
+                d.toString(),
+                "<html><head><link href=\"{clientURL}\" rel=\"stylesheet\" 
type=\"text/css\"></head></html>");
+    }
+
+    private void train_getClasspathAsset(ClasspathAssetSource source, String 
path, Locale locale,
+            Asset asset)
+    {
+        expect(source.getClasspathAsset(path, locale)).andReturn(asset);
+    }
+
+    private void toClientURL(Asset asset, String clientURL)
+    {
+        expect(asset.toClientURL()).andReturn(clientURL);
+    }
+
+    protected final <T> void train_peek(Environment env, Class<T> type, T 
value)
+    {
+        expect(env.peek(type)).andReturn(value);
+    }
+
+    protected final Environment newEnvironment()
+    {
+        return newMock(Environment.class);
+    }
+
+    protected final ClasspathAssetSource newClasspathAssetSource()
+    {
+        return newMock(ClasspathAssetSource.class);
+    }
+}


Reply via email to