You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tiles.apache.org by ap...@apache.org on 2009/09/30 20:26:59 UTC

svn commit: r820373 - in /tiles/framework/trunk/tiles-core/src: main/java/org/apache/tiles/factory/ main/java/org/apache/tiles/renderer/impl/ test/java/org/apache/tiles/factory/ test/java/org/apache/tiles/renderer/impl/

Author: apetrelli
Date: Wed Sep 30 18:26:58 2009
New Revision: 820373

URL: http://svn.apache.org/viewvc?rev=820373&view=rev
Log:
TILES-470
Now the default renderer is created after the other renderers.
Added an untyped renderer that uses other renderers as delegates.

Added:
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRenderer.java   (with props)
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRendererTest.java
      - copied, changed from r819379, tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedAttributeRendererTest.java
Removed:
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedAttributeRendererTest.java
Modified:
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/BasicRendererFactory.java
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedAttributeRenderer.java
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/factory/BasicTilesContainerFactoryTest.java

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java?rev=820373&r1=820372&r2=820373&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java Wed Sep 30 18:26:58 2009
@@ -58,7 +58,7 @@
 import org.apache.tiles.renderer.impl.DefinitionAttributeRenderer;
 import org.apache.tiles.renderer.impl.StringAttributeRenderer;
 import org.apache.tiles.renderer.impl.TemplateAttributeRenderer;
-import org.apache.tiles.renderer.impl.UntypedAttributeRenderer;
+import org.apache.tiles.renderer.impl.UntypedDelegateAttributeRenderer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -71,6 +71,20 @@
 public class BasicTilesContainerFactory extends AbstractTilesContainerFactory {
 
     /**
+     * The string renderer name.
+     */
+    private static final String STRING_RENDERER_NAME = "string";
+
+    /**
+     * The template renderer name.
+     */
+    private static final String TEMPLATE_RENDERER_NAME = "template";
+
+    /**
+     * The definition renderer name.
+     */
+    private static final String DEFINITION_RENDERER_NAME = "definition";
+    /**
      * The logging object.
      */
     private final Logger log = LoggerFactory
@@ -392,31 +406,37 @@
         retValue.setRequestContextFactory(contextFactory);
         retValue.setContainer(container);
         retValue.setAttributeEvaluatorFactory(attributeEvaluatorFactory);
-        retValue.setDefaultRenderer(createDefaultAttributeRenderer(applicationContext,
-                contextFactory, container, attributeEvaluatorFactory));
         registerAttributeRenderers(retValue, applicationContext, contextFactory,
                 container, attributeEvaluatorFactory);
+        retValue.setDefaultRenderer(createDefaultAttributeRenderer(retValue,
+                applicationContext, contextFactory, container,
+                attributeEvaluatorFactory));
         return retValue;
     }
 
     /**
      * Creates the default attribute renderer. By default it is an
-     * {@link UntypedAttributeRenderer}.
+     * {@link UntypedDelegateAttributeRenderer}.
+     *
+     * @param rendererFactory The renderer factory to configure.
      * @param applicationContext The Tiles application context.
      * @param contextFactory The Tiles context factory.
      * @param container The container.
      * @param attributeEvaluatorFactory The attribute evaluator factory.
-     *
      * @return The default attribute renderer.
-     * @since 2.2.0
+     * @since 2.2.1
      */
-    protected AttributeRenderer createDefaultAttributeRenderer(TilesApplicationContext applicationContext,
+    protected AttributeRenderer createDefaultAttributeRenderer(
+            BasicRendererFactory rendererFactory,
+            TilesApplicationContext applicationContext,
             TilesRequestContextFactory contextFactory,
             TilesContainer container,
             AttributeEvaluatorFactory attributeEvaluatorFactory) {
-        UntypedAttributeRenderer retValue = new UntypedAttributeRenderer();
+        UntypedDelegateAttributeRenderer retValue = new UntypedDelegateAttributeRenderer(
+                container, rendererFactory.getRenderer(STRING_RENDERER_NAME),
+                rendererFactory.getRenderer(TEMPLATE_RENDERER_NAME), rendererFactory
+                        .getRenderer(DEFINITION_RENDERER_NAME));
         retValue.setApplicationContext(applicationContext);
-        retValue.setContainer(container);
         retValue.setRequestContextFactory(contextFactory);
         retValue.setAttributeEvaluatorFactory(attributeEvaluatorFactory);
         return retValue;
@@ -461,23 +481,90 @@
             TilesRequestContextFactory contextFactory,
             TilesContainer container,
             AttributeEvaluatorFactory attributeEvaluatorFactory) {
+        rendererFactory.registerRenderer(STRING_RENDERER_NAME,
+                createStringAttributeRenderer(rendererFactory,
+                        applicationContext, contextFactory, container,
+                        attributeEvaluatorFactory));
+        rendererFactory.registerRenderer(TEMPLATE_RENDERER_NAME,
+                createTemplateAttributeRenderer(rendererFactory,
+                        applicationContext, contextFactory, container,
+                        attributeEvaluatorFactory));
+        rendererFactory.registerRenderer(DEFINITION_RENDERER_NAME,
+                createDefinitionAttributeRenderer(rendererFactory,
+                        applicationContext, contextFactory, container,
+                        attributeEvaluatorFactory));
+    }
+
+    /**
+     * Creates a {@link StringAttributeRenderer}.
+     *
+     * @param rendererFactory The renderer factory to configure.
+     * @param applicationContext The Tiles application context.
+     * @param contextFactory The Tiles context factory.
+     * @param container The container.
+     * @param attributeEvaluatorFactory The attribute evaluator factory.
+     * @return The renderer.
+     * @since 2.2.1
+     */
+    protected AttributeRenderer createStringAttributeRenderer(
+            BasicRendererFactory rendererFactory,
+            TilesApplicationContext applicationContext,
+            TilesRequestContextFactory contextFactory,
+            TilesContainer container,
+            AttributeEvaluatorFactory attributeEvaluatorFactory) {
         StringAttributeRenderer stringRenderer = new StringAttributeRenderer();
         stringRenderer.setApplicationContext(applicationContext);
         stringRenderer.setRequestContextFactory(contextFactory);
         stringRenderer.setAttributeEvaluatorFactory(attributeEvaluatorFactory);
-        rendererFactory.registerRenderer("string", stringRenderer);
+        return stringRenderer;
+    }
 
+    /**
+     * Creates a {@link TemplateAttributeRenderer}.
+     *
+     * @param rendererFactory The renderer factory to configure.
+     * @param applicationContext The Tiles application context.
+     * @param contextFactory The Tiles context factory.
+     * @param container The container.
+     * @param attributeEvaluatorFactory The attribute evaluator factory.
+     * @return The renderer.
+     * @since 2.2.1
+     */
+    protected AttributeRenderer createTemplateAttributeRenderer(
+            BasicRendererFactory rendererFactory,
+            TilesApplicationContext applicationContext,
+            TilesRequestContextFactory contextFactory,
+            TilesContainer container,
+            AttributeEvaluatorFactory attributeEvaluatorFactory) {
         TemplateAttributeRenderer templateRenderer = new TemplateAttributeRenderer();
         templateRenderer.setApplicationContext(applicationContext);
         templateRenderer.setRequestContextFactory(contextFactory);
         templateRenderer.setAttributeEvaluatorFactory(attributeEvaluatorFactory);
-        rendererFactory.registerRenderer("template", templateRenderer);
+        return templateRenderer;
+    }
 
+    /**
+     * Creates a {@link DefinitionAttributeRenderer}.
+     *
+     * @param rendererFactory The renderer factory to configure.
+     * @param applicationContext The Tiles application context.
+     * @param contextFactory The Tiles context factory.
+     * @param container The container.
+     * @param attributeEvaluatorFactory The attribute evaluator factory.
+     * @return The renderer.
+     * @since 2.2.1
+     */
+    protected AttributeRenderer createDefinitionAttributeRenderer(
+            BasicRendererFactory rendererFactory,
+            TilesApplicationContext applicationContext,
+            TilesRequestContextFactory contextFactory,
+            TilesContainer container,
+            AttributeEvaluatorFactory attributeEvaluatorFactory) {
         DefinitionAttributeRenderer definitionRenderer = new DefinitionAttributeRenderer();
         definitionRenderer.setApplicationContext(applicationContext);
         definitionRenderer.setContainer(container);
         definitionRenderer.setRequestContextFactory(contextFactory);
         definitionRenderer.setAttributeEvaluatorFactory(attributeEvaluatorFactory);
-        rendererFactory.registerRenderer("definition", definitionRenderer);
+        return definitionRenderer;
     }
 }

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/BasicRendererFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/BasicRendererFactory.java?rev=820373&r1=820372&r2=820373&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/BasicRendererFactory.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/BasicRendererFactory.java Wed Sep 30 18:26:58 2009
@@ -66,6 +66,8 @@
      * The default renderer class name.
      *
      * @since 2.1.0
+     * @deprecated Do not use, the default renderer class should be determined
+     * when building the container.
      */
     public static final String DEFAULT_RENDERER_CLASS_NAME =
         UntypedAttributeRenderer.class.getName();

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedAttributeRenderer.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedAttributeRenderer.java?rev=820373&r1=820372&r2=820373&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedAttributeRenderer.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedAttributeRenderer.java Wed Sep 30 18:26:58 2009
@@ -33,6 +33,7 @@
  *
  * @version $Rev$ $Date$
  * @since 2.1.0
+ * @deprecated Use {@link UntypedDelegateAttributeRenderer}.
  */
 public class UntypedAttributeRenderer extends AbstractBaseAttributeRenderer
         implements TilesContainerAware {

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRenderer.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRenderer.java?rev=820373&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRenderer.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRenderer.java Wed Sep 30 18:26:58 2009
@@ -0,0 +1,100 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.tiles.renderer.impl;
+
+import java.io.IOException;
+
+import org.apache.tiles.Attribute;
+import org.apache.tiles.TilesContainer;
+import org.apache.tiles.context.TilesRequestContext;
+import org.apache.tiles.renderer.AttributeRenderer;
+import org.apache.tiles.renderer.RendererException;
+
+/**
+ * Renders an attribute that has no associated renderer using delegation to
+ * other renderers.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.1
+ */
+public class UntypedDelegateAttributeRenderer extends AbstractBaseAttributeRenderer {
+
+    /**
+     * The Tiles container.
+     */
+    private TilesContainer container;
+
+    /**
+     * The renderer for attributes of type "string".
+     */
+    private AttributeRenderer stringRenderer;
+
+    /**
+     * The renderer for attributes of type "template".
+     */
+    private AttributeRenderer templateRenderer;
+
+    /**
+     * The renderer for attributes of type "definition".
+     */
+    private AttributeRenderer definitionRenderer;
+
+    /**
+     * Constructor.
+     *
+     * @param container The Tiles container.
+     * @param stringRenderer The renderer for attributes of type "string".
+     * @param templateRenderer The renderer for attributes of type "template".
+     * @param definitionRenderer The renderer for attributes of type
+     * "definition".
+     * @since 2.2.1
+     */
+    public UntypedDelegateAttributeRenderer(TilesContainer container,
+            AttributeRenderer stringRenderer,
+            AttributeRenderer templateRenderer,
+            AttributeRenderer definitionRenderer) {
+        this.container = container;
+        this.stringRenderer = stringRenderer;
+        this.templateRenderer = templateRenderer;
+        this.definitionRenderer = definitionRenderer;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void write(Object value, Attribute attribute,
+            TilesRequestContext request)
+            throws IOException {
+        if (value instanceof String) {
+            String valueString = (String) value;
+            Object[] requestItems = request.getRequestObjects();
+            if (container.isValidDefinition(valueString, requestItems)) {
+                definitionRenderer.render(attribute, request);
+            } else if (valueString.startsWith("/")) {
+                templateRenderer.render(attribute, request);
+            } else {
+                stringRenderer.render(attribute, request);
+            }
+        } else {
+            throw new RendererException(
+                    "Cannot render an untyped object attribute");
+        }
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRenderer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/factory/BasicTilesContainerFactoryTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/factory/BasicTilesContainerFactoryTest.java?rev=820373&r1=820372&r2=820373&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/factory/BasicTilesContainerFactoryTest.java (original)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/factory/BasicTilesContainerFactoryTest.java Wed Sep 30 18:26:58 2009
@@ -20,6 +20,8 @@
  */
 package org.apache.tiles.factory;
 
+import static org.easymock.classextension.EasyMock.*;
+
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
@@ -48,7 +50,7 @@
 import org.apache.tiles.renderer.impl.DefinitionAttributeRenderer;
 import org.apache.tiles.renderer.impl.StringAttributeRenderer;
 import org.apache.tiles.renderer.impl.TemplateAttributeRenderer;
-import org.apache.tiles.renderer.impl.UntypedAttributeRenderer;
+import org.apache.tiles.renderer.impl.UntypedDelegateAttributeRenderer;
 import org.easymock.EasyMock;
 
 /**
@@ -220,23 +222,97 @@
 
     /**
      * Tests
-     * {@link BasicTilesContainerFactory#createDefaultAttributeRenderer(TilesApplicationContext,
-     * TilesRequestContextFactory, TilesContainer, AttributeEvaluatorFactory)}.
+     * {@link BasicTilesContainerFactory#createDefaultAttributeRenderer(BasicRendererFactory,
+     * TilesApplicationContext, TilesRequestContextFactory, TilesContainer, AttributeEvaluatorFactory)}.
      */
     public void testCreateDefaultAttributeRenderer() {
-        TilesContainer container = factory.createContainer(applicationContext);
-        TilesRequestContextFactory requestContextFactory = factory
-                .createRequestContextFactory(applicationContext);
-        LocaleResolver resolver = factory.createLocaleResolver(applicationContext,
-                requestContextFactory);
-        AttributeEvaluatorFactory attributeEvaluatorFactory = factory
-        .createAttributeEvaluatorFactory(applicationContext,
-                requestContextFactory, resolver);
+        TilesContainer container = createMock(TilesContainer.class);
+        TilesRequestContextFactory requestContextFactory = createMock(TilesRequestContextFactory.class);
+        AttributeEvaluatorFactory attributeEvaluatorFactory = createMock(AttributeEvaluatorFactory.class);
+        BasicRendererFactory rendererFactory = createMock(BasicRendererFactory.class);
+        AttributeRenderer stringRenderer = createMock(AttributeRenderer.class);
+        AttributeRenderer templateRenderer = createMock(AttributeRenderer.class);
+        AttributeRenderer definitionRenderer = createMock(AttributeRenderer.class);
+
+        expect(rendererFactory.getRenderer("string")).andReturn(stringRenderer);
+        expect(rendererFactory.getRenderer("template")).andReturn(templateRenderer);
+        expect(rendererFactory.getRenderer("definition")).andReturn(definitionRenderer);
+
+        replay(container, requestContextFactory, attributeEvaluatorFactory,
+                rendererFactory);
         AttributeRenderer renderer = factory.createDefaultAttributeRenderer(
-                applicationContext, requestContextFactory, container,
-                attributeEvaluatorFactory);
+                rendererFactory, applicationContext, requestContextFactory,
+                container, attributeEvaluatorFactory);
         assertTrue("The default renderer class is not correct",
-                renderer instanceof UntypedAttributeRenderer);
+                renderer instanceof UntypedDelegateAttributeRenderer);
+        verify(container, requestContextFactory, attributeEvaluatorFactory,
+                rendererFactory);
+    }
+
+    /**
+     * Tests
+     * {@link BasicTilesContainerFactory#createStringAttributeRenderer(BasicRendererFactory,
+     * TilesApplicationContext, TilesRequestContextFactory, TilesContainer, AttributeEvaluatorFactory)}.
+     */
+    public void testCreateStringAttributeRenderer() {
+        TilesContainer container = createMock(TilesContainer.class);
+        TilesRequestContextFactory requestContextFactory = createMock(TilesRequestContextFactory.class);
+        AttributeEvaluatorFactory attributeEvaluatorFactory = createMock(AttributeEvaluatorFactory.class);
+        BasicRendererFactory rendererFactory = createMock(BasicRendererFactory.class);
+
+        replay(container, requestContextFactory, attributeEvaluatorFactory,
+                rendererFactory);
+        AttributeRenderer renderer = factory.createStringAttributeRenderer(
+                rendererFactory, applicationContext, requestContextFactory,
+                container, attributeEvaluatorFactory);
+        assertTrue("The renderer class is not correct",
+                renderer instanceof StringAttributeRenderer);
+        verify(container, requestContextFactory, attributeEvaluatorFactory,
+                rendererFactory);
+    }
+
+    /**
+     * Tests
+     * {@link BasicTilesContainerFactory#createTemplateAttributeRenderer(BasicRendererFactory,
+     * TilesApplicationContext, TilesRequestContextFactory, TilesContainer, AttributeEvaluatorFactory)}.
+     */
+    public void testCreateTemplateAttributeRenderer() {
+        TilesContainer container = createMock(TilesContainer.class);
+        TilesRequestContextFactory requestContextFactory = createMock(TilesRequestContextFactory.class);
+        AttributeEvaluatorFactory attributeEvaluatorFactory = createMock(AttributeEvaluatorFactory.class);
+        BasicRendererFactory rendererFactory = createMock(BasicRendererFactory.class);
+
+        replay(container, requestContextFactory, attributeEvaluatorFactory,
+                rendererFactory);
+        AttributeRenderer renderer = factory.createTemplateAttributeRenderer(
+                rendererFactory, applicationContext, requestContextFactory,
+                container, attributeEvaluatorFactory);
+        assertTrue("The renderer class is not correct",
+                renderer instanceof TemplateAttributeRenderer);
+        verify(container, requestContextFactory, attributeEvaluatorFactory,
+                rendererFactory);
+    }
+
+    /**
+     * Tests
+     * {@link BasicTilesContainerFactory#createDefinitionAttributeRenderer(BasicRendererFactory,
+     * TilesApplicationContext, TilesRequestContextFactory, TilesContainer, AttributeEvaluatorFactory)}.
+     */
+    public void testCreateDefinitionAttributeRenderer() {
+        TilesContainer container = createMock(TilesContainer.class);
+        TilesRequestContextFactory requestContextFactory = createMock(TilesRequestContextFactory.class);
+        AttributeEvaluatorFactory attributeEvaluatorFactory = createMock(AttributeEvaluatorFactory.class);
+        BasicRendererFactory rendererFactory = createMock(BasicRendererFactory.class);
+
+        replay(container, requestContextFactory, attributeEvaluatorFactory,
+                rendererFactory);
+        AttributeRenderer renderer = factory.createDefinitionAttributeRenderer(
+                rendererFactory, applicationContext, requestContextFactory,
+                container, attributeEvaluatorFactory);
+        assertTrue("The renderer class is not correct",
+                renderer instanceof DefinitionAttributeRenderer);
+        verify(container, requestContextFactory, attributeEvaluatorFactory,
+                rendererFactory);
     }
 
     /**

Copied: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRendererTest.java (from r819379, tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedAttributeRendererTest.java)
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRendererTest.java?p2=tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRendererTest.java&p1=tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedAttributeRendererTest.java&r1=819379&r2=820373&rev=820373&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedAttributeRendererTest.java (original)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRendererTest.java Wed Sep 30 18:26:58 2009
@@ -20,11 +20,11 @@
  */
 package org.apache.tiles.renderer.impl;
 
+import static org.easymock.EasyMock.*;
+
 import java.io.IOException;
 import java.io.StringWriter;
 
-import junit.framework.TestCase;
-
 import org.apache.tiles.Attribute;
 import org.apache.tiles.Expression;
 import org.apache.tiles.TilesApplicationContext;
@@ -33,35 +33,66 @@
 import org.apache.tiles.context.TilesRequestContextFactory;
 import org.apache.tiles.evaluator.BasicAttributeEvaluatorFactory;
 import org.apache.tiles.evaluator.impl.DirectAttributeEvaluator;
+import org.apache.tiles.renderer.AttributeRenderer;
 import org.easymock.EasyMock;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Tests {@link UntypedAttributeRenderer}.
  *
  * @version $Rev$ $Date$
  */
-public class UntypedAttributeRendererTest extends TestCase {
+public class UntypedDelegateAttributeRendererTest {
 
     /**
      * The renderer.
      */
-    private UntypedAttributeRenderer renderer;
+    private UntypedDelegateAttributeRenderer renderer;
+
+    /**
+     * A mock container.
+     */
+    private TilesContainer container;
+
+    /**
+     * A mock string attribute renderer.
+     */
+    private AttributeRenderer stringRenderer;
+
+    /**
+     * A mock template attribute renderer.
+     */
+    private AttributeRenderer templateRenderer;
 
-    /** {@inheritDoc} */
-    @Override
-    protected void setUp() throws Exception {
-        renderer = new UntypedAttributeRenderer();
+    /**
+     * A mock definition attribute renderer.
+     */
+    private AttributeRenderer definitionRenderer;
+
+    /**
+     * Sets up the test.
+     */
+    @Before
+    public void setUp() {
+        container = createMock(TilesContainer.class);
+        stringRenderer = createMock(AttributeRenderer.class);
+        templateRenderer = createMock(AttributeRenderer.class);
+        definitionRenderer = createMock(AttributeRenderer.class);
+        renderer = new UntypedDelegateAttributeRenderer(container,
+                stringRenderer, templateRenderer, definitionRenderer);
         renderer.setAttributeEvaluatorFactory(new BasicAttributeEvaluatorFactory(
                 new DirectAttributeEvaluator()));
     }
 
     /**
      * Tests
-     * {@link StringAttributeRenderer#write(Object, Attribute, TilesRequestContext)}
-     * writing a Definition.
+     * {@link UntypedDelegateAttributeRenderer#render(Attribute, TilesRequestContext)}
+     * writing a definition.
      *
      * @throws IOException If something goes wrong during rendition.
      */
+    @Test
     public void testWriteDefinition() throws IOException {
         StringWriter writer = new StringWriter();
         Attribute attribute = new Attribute("my.definition", (Expression) null,
@@ -70,66 +101,64 @@
                 .createMock(TilesApplicationContext.class);
         TilesRequestContextFactory contextFactory = EasyMock
                 .createMock(TilesRequestContextFactory.class);
-        TilesContainer container = EasyMock.createMock(TilesContainer.class);
         TilesRequestContext requestContext = EasyMock
                 .createMock(TilesRequestContext.class);
-        EasyMock.expect(contextFactory.createRequestContext(applicationContext))
-                .andReturn(requestContext);
         Object[] requestObjects = new Object[0];
-        EasyMock.expect(requestContext.getRequestObjects()).andReturn(requestObjects);
-        EasyMock.expect(container.isValidDefinition("my.definition"))
+        expect(requestContext.getRequestObjects()).andReturn(requestObjects);
+        expect(container.isValidDefinition("my.definition", requestObjects))
                 .andReturn(Boolean.TRUE);
-        container.render("my.definition");
-        EasyMock.replay(applicationContext, contextFactory, requestContext,
-                container);
+        definitionRenderer.render(attribute, requestContext);
+
+        replay(applicationContext, contextFactory, requestContext, container,
+                stringRenderer, templateRenderer, definitionRenderer);
         renderer.setApplicationContext(applicationContext);
         renderer.setRequestContextFactory(contextFactory);
-        renderer.setContainer(container);
         renderer.render(attribute, requestContext);
         writer.close();
+        verify(applicationContext, contextFactory, requestContext,
+                container, stringRenderer, templateRenderer, definitionRenderer);
     }
 
     /**
      * Tests
-     * {@link StringAttributeRenderer#write(Object, Attribute, TilesRequestContext)}
+     * {@link UntypedDelegateAttributeRenderer#render(Attribute, TilesRequestContext)}
      * writing a string.
      *
      * @throws IOException If something goes wrong during rendition.
      */
+    @Test
     public void testWriteString() throws IOException {
-        StringWriter writer = new StringWriter();
         Attribute attribute = new Attribute("Result", (Expression) null, null,
                 "string");
         TilesApplicationContext applicationContext = EasyMock
                 .createMock(TilesApplicationContext.class);
         TilesRequestContextFactory contextFactory = EasyMock
                 .createMock(TilesRequestContextFactory.class);
-        TilesContainer container = EasyMock.createMock(TilesContainer.class);
         TilesRequestContext requestContext = EasyMock
                 .createMock(TilesRequestContext.class);
         Object[] requestObjects = new Object[0];
-        EasyMock.expect(requestContext.getRequestObjects()).andReturn(requestObjects);
-        EasyMock.expect(contextFactory.createRequestContext(applicationContext))
-                .andReturn(requestContext);
-        EasyMock.expect(container.isValidDefinition("my.definition"))
-                .andReturn(Boolean.TRUE);
-        EasyMock.expect(requestContext.getWriter()).andReturn(writer);
-        EasyMock.replay(applicationContext, contextFactory, requestContext);
+        expect(requestContext.getRequestObjects()).andReturn(requestObjects);
+        expect(container.isValidDefinition("Result", requestObjects))
+                .andReturn(Boolean.FALSE);
+        stringRenderer.render(attribute, requestContext);
+
+        replay(applicationContext, contextFactory, requestContext, container,
+                stringRenderer, templateRenderer, definitionRenderer);
         renderer.setApplicationContext(applicationContext);
         renderer.setRequestContextFactory(contextFactory);
-        renderer.setContainer(container);
         renderer.render(attribute, requestContext);
-        writer.close();
-        assertEquals("Not written 'Result'", "Result", writer.toString());
+        verify(applicationContext, contextFactory, requestContext, container,
+                stringRenderer, templateRenderer, definitionRenderer);
     }
 
     /**
      * Tests
-     * {@link StringAttributeRenderer#write(Object, Attribute, TilesRequestContext)}
+     * {@link UntypedDelegateAttributeRenderer#render(Attribute, TilesRequestContext)}
      * writing a template.
      *
      * @throws IOException If something goes wrong during rendition.
      */
+    @Test
     public void testWriteTemplate() throws IOException {
         StringWriter writer = new StringWriter();
         Attribute attribute = new Attribute("/myTemplate.jsp",
@@ -138,21 +167,21 @@
                 .createMock(TilesApplicationContext.class);
         TilesRequestContextFactory contextFactory = EasyMock
                 .createMock(TilesRequestContextFactory.class);
-        TilesContainer container = EasyMock.createMock(TilesContainer.class);
         TilesRequestContext requestContext = EasyMock
                 .createMock(TilesRequestContext.class);
-        EasyMock.expect(contextFactory.createRequestContext(applicationContext))
-                .andReturn(requestContext);
         Object[] requestObjects = new Object[0];
-        EasyMock.expect(requestContext.getRequestObjects()).andReturn(requestObjects);
-        requestContext.dispatch("/myTemplate.jsp");
-        EasyMock.expect(container.isValidDefinition("my.definition"))
-                .andReturn(Boolean.TRUE);
-        EasyMock.replay(applicationContext, contextFactory, requestContext);
+        expect(requestContext.getRequestObjects()).andReturn(requestObjects);
+        expect(container.isValidDefinition("/myTemplate.jsp", requestObjects))
+                .andReturn(Boolean.FALSE);
+        templateRenderer.render(attribute, requestContext);
+
+        replay(applicationContext, contextFactory, requestContext, container,
+                stringRenderer, templateRenderer, definitionRenderer);
         renderer.setApplicationContext(applicationContext);
         renderer.setRequestContextFactory(contextFactory);
-        renderer.setContainer(container);
         renderer.render(attribute, requestContext);
         writer.close();
+        verify(applicationContext, contextFactory, requestContext, container,
+                stringRenderer, templateRenderer, definitionRenderer);
     }
 }