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