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/10/03 14:15:06 UTC

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

Author: apetrelli
Date: Sat Oct  3 12:15:05 2009
New Revision: 821299

URL: http://svn.apache.org/viewvc?rev=821299&view=rev
Log:
TILES-470
Added a chained attribute renderer and moved pattern recognition to single renderers.

Added:
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/TypeDetectingAttributeRenderer.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/AbstractTypeDetectingAttributeRenderer.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/ChainedDelegateAttributeRenderer.java
      - copied, changed from r820373, tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRenderer.java
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/AbstractTypeDetectingAttributeRendererTest.java   (with props)
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/ChainedDelegateAttributeRendererTest.java
      - copied, changed from r820373, tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRendererTest.java
    tiles/framework/trunk/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/renderer/
    tiles/framework/trunk/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRendererTest.java   (with props)
    tiles/framework/trunk/tiles-velocity/src/test/java/org/apache/tiles/velocity/renderer/
    tiles/framework/trunk/tiles-velocity/src/test/java/org/apache/tiles/velocity/renderer/VelocityAttributeRendererTest.java   (with props)
Removed:
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRenderer.java
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRendererTest.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/DefinitionAttributeRenderer.java
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/StringAttributeRenderer.java
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/TemplateAttributeRenderer.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
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/DefinitionAttributeRendererTest.java
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/StringAttributeRendererTest.java
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/TemplateAttributeRendererTest.java
    tiles/framework/trunk/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRenderer.java
    tiles/framework/trunk/tiles-velocity/src/main/java/org/apache/tiles/velocity/renderer/VelocityAttributeRenderer.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=821299&r1=821298&r2=821299&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 Sat Oct  3 12:15:05 2009
@@ -54,11 +54,12 @@
 import org.apache.tiles.reflect.ClassUtil;
 import org.apache.tiles.renderer.AttributeRenderer;
 import org.apache.tiles.renderer.RendererFactory;
+import org.apache.tiles.renderer.TypeDetectingAttributeRenderer;
 import org.apache.tiles.renderer.impl.BasicRendererFactory;
 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.UntypedDelegateAttributeRenderer;
+import org.apache.tiles.renderer.impl.ChainedDelegateAttributeRenderer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -73,17 +74,17 @@
     /**
      * The string renderer name.
      */
-    private static final String STRING_RENDERER_NAME = "string";
+    protected static final String STRING_RENDERER_NAME = "string";
 
     /**
      * The template renderer name.
      */
-    private static final String TEMPLATE_RENDERER_NAME = "template";
+    protected static final String TEMPLATE_RENDERER_NAME = "template";
 
     /**
      * The definition renderer name.
      */
-    private static final String DEFINITION_RENDERER_NAME = "definition";
+    protected static final String DEFINITION_RENDERER_NAME = "definition";
     /**
      * The logging object.
      */
@@ -416,7 +417,7 @@
 
     /**
      * Creates the default attribute renderer. By default it is an
-     * {@link UntypedDelegateAttributeRenderer}.
+     * {@link ChainedDelegateAttributeRenderer}.
      *
      * @param rendererFactory The renderer factory to configure.
      * @param applicationContext The Tiles application context.
@@ -432,10 +433,13 @@
             TilesRequestContextFactory contextFactory,
             TilesContainer container,
             AttributeEvaluatorFactory attributeEvaluatorFactory) {
-        UntypedDelegateAttributeRenderer retValue = new UntypedDelegateAttributeRenderer(
-                container, rendererFactory.getRenderer(STRING_RENDERER_NAME),
-                rendererFactory.getRenderer(TEMPLATE_RENDERER_NAME), rendererFactory
-                        .getRenderer(DEFINITION_RENDERER_NAME));
+        ChainedDelegateAttributeRenderer retValue = new ChainedDelegateAttributeRenderer();
+        retValue.addAttributeRenderer((TypeDetectingAttributeRenderer) rendererFactory
+                .getRenderer(DEFINITION_RENDERER_NAME));
+        retValue.addAttributeRenderer((TypeDetectingAttributeRenderer) rendererFactory
+                .getRenderer(TEMPLATE_RENDERER_NAME));
+        retValue.addAttributeRenderer((TypeDetectingAttributeRenderer) rendererFactory
+                .getRenderer(STRING_RENDERER_NAME));
         retValue.setApplicationContext(applicationContext);
         retValue.setRequestContextFactory(contextFactory);
         retValue.setAttributeEvaluatorFactory(attributeEvaluatorFactory);

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/TypeDetectingAttributeRenderer.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/TypeDetectingAttributeRenderer.java?rev=821299&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/TypeDetectingAttributeRenderer.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/TypeDetectingAttributeRenderer.java Sat Oct  3 12:15:05 2009
@@ -0,0 +1,58 @@
+/*
+ * $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;
+
+import org.apache.tiles.Attribute;
+import org.apache.tiles.context.TilesRequestContext;
+
+/**
+ * It represents a renderer that identifies attributes that can render.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.1
+ */
+public interface TypeDetectingAttributeRenderer extends AttributeRenderer {
+
+    /**
+     * Checks if this renderer can render an attribute. Note that this does not mean
+     * it is the <strong>best</strong> renderer available, but checks only its capability.
+     *
+     * @param attribute The attribute to be renderer.
+     * @param request The Tiles request context.
+     * @return <code>true</code> if this renderer can render the attribute.
+     * @since 2.2.1
+     */
+    boolean isRenderable(Attribute attribute, TilesRequestContext request);
+
+    /**
+     * Checks if this renderer can render an attribute. Note that this does not mean
+     * it is the <strong>best</strong> renderer available, but checks only its capability.
+     *
+     * @param value The attribute value, already evaluated.
+     * @param attribute The attribute to be renderer.
+     * @param request The Tiles request context.
+     * @return <code>true</code> if this renderer can render the attribute.
+     * @since 2.2.1
+     */
+    boolean isRenderable(Object value, Attribute attribute,
+            TilesRequestContext request);
+}

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

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

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/AbstractTypeDetectingAttributeRenderer.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/AbstractTypeDetectingAttributeRenderer.java?rev=821299&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/AbstractTypeDetectingAttributeRenderer.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/AbstractTypeDetectingAttributeRenderer.java Sat Oct  3 12:15:05 2009
@@ -0,0 +1,47 @@
+/*
+ * $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 org.apache.tiles.Attribute;
+import org.apache.tiles.context.TilesRequestContext;
+import org.apache.tiles.evaluator.AttributeEvaluator;
+import org.apache.tiles.renderer.TypeDetectingAttributeRenderer;
+
+/**
+ * Abstract implementation of {@link TypeDetectingAttributeRenderer} that
+ * implements {@link #isRenderable(Attribute, TilesRequestContext)} to delegate
+ * to {@link #isRenderable(Object, Attribute, TilesRequestContext)}.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.1
+ */
+public abstract class AbstractTypeDetectingAttributeRenderer extends
+        AbstractBaseAttributeRenderer implements TypeDetectingAttributeRenderer {
+
+    /** {@inheritDoc} */
+    public boolean isRenderable(Attribute attribute, TilesRequestContext request) {
+        AttributeEvaluator evaluator = attributeEvaluatorFactory
+                .getAttributeEvaluator(attribute);
+        Object value = evaluator.evaluate(attribute, request);
+        return isRenderable(value, attribute, request);
+    }
+}

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

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

Copied: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/ChainedDelegateAttributeRenderer.java (from r820373, 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/ChainedDelegateAttributeRenderer.java?p2=tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/ChainedDelegateAttributeRenderer.java&p1=tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRenderer.java&r1=820373&r2=821299&rev=821299&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRenderer.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/ChainedDelegateAttributeRenderer.java Sat Oct  3 12:15:05 2009
@@ -21,12 +21,13 @@
 package org.apache.tiles.renderer.impl;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 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;
+import org.apache.tiles.renderer.TypeDetectingAttributeRenderer;
 
 /**
  * Renders an attribute that has no associated renderer using delegation to
@@ -35,46 +36,30 @@
  * @version $Rev$ $Date$
  * @since 2.2.1
  */
-public class UntypedDelegateAttributeRenderer extends AbstractBaseAttributeRenderer {
+public class ChainedDelegateAttributeRenderer extends AbstractBaseAttributeRenderer {
 
     /**
-     * The Tiles container.
+     * The list of chained renderers.
      */
-    private TilesContainer container;
+    private List<TypeDetectingAttributeRenderer> renderers;
 
     /**
-     * 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".
+     * Constructor.
+     *
+     * @since 2.2.1
      */
-    private AttributeRenderer definitionRenderer;
+    public ChainedDelegateAttributeRenderer() {
+        renderers = new ArrayList<TypeDetectingAttributeRenderer>();
+    }
 
     /**
-     * Constructor.
+     * Adds an attribute renderer to the list. The first inserted this way, the
+     * first is checked when rendering.
      *
-     * @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
+     * @param renderer The renderer to add.
      */
-    public UntypedDelegateAttributeRenderer(TilesContainer container,
-            AttributeRenderer stringRenderer,
-            AttributeRenderer templateRenderer,
-            AttributeRenderer definitionRenderer) {
-        this.container = container;
-        this.stringRenderer = stringRenderer;
-        this.templateRenderer = templateRenderer;
-        this.definitionRenderer = definitionRenderer;
+    public void addAttributeRenderer(TypeDetectingAttributeRenderer renderer) {
+        renderers.add(renderer);
     }
 
     /** {@inheritDoc} */
@@ -82,19 +67,18 @@
     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);
+        if (value == null) {
+            throw new NullPointerException("The attribute value is null");
+        }
+
+        for (TypeDetectingAttributeRenderer renderer : renderers) {
+            if (renderer.isRenderable(value, attribute, request)) {
+                renderer.render(attribute, request);
+                return;
             }
-        } else {
-            throw new RendererException(
-                    "Cannot render an untyped object attribute");
         }
+
+        throw new RendererException("Type of the attribute not found, class '"
+                + value.getClass() + "' value '" + value.toString() + "'");
     }
 }

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/DefinitionAttributeRenderer.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/DefinitionAttributeRenderer.java?rev=821299&r1=821298&r2=821299&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/DefinitionAttributeRenderer.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/DefinitionAttributeRenderer.java Sat Oct  3 12:15:05 2009
@@ -26,7 +26,6 @@
 import org.apache.tiles.TilesContainer;
 import org.apache.tiles.awareness.TilesContainerAware;
 import org.apache.tiles.context.TilesRequestContext;
-import org.apache.tiles.renderer.AttributeRenderer;
 
 /**
  * Renders an attribute that contains a reference to a definition.
@@ -34,8 +33,8 @@
  * @version $Rev$ $Date$
  * @since 2.1.0
  */
-public class DefinitionAttributeRenderer extends AbstractBaseAttributeRenderer
-        implements TilesContainerAware, AttributeRenderer {
+public class DefinitionAttributeRenderer extends
+        AbstractTypeDetectingAttributeRenderer implements TilesContainerAware {
 
     /**
      * The Tiles container.
@@ -56,4 +55,14 @@
             throws IOException {
         container.render(value.toString(), request.getRequestObjects());
     }
+
+    /** {@inheritDoc} */
+    public boolean isRenderable(Object value, Attribute attribute,
+            TilesRequestContext request) {
+        if (value instanceof String) {
+            return container.isValidDefinition((String) value, request
+                    .getRequestObjects());
+        }
+        return false;
+    }
 }

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/StringAttributeRenderer.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/StringAttributeRenderer.java?rev=821299&r1=821298&r2=821299&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/StringAttributeRenderer.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/StringAttributeRenderer.java Sat Oct  3 12:15:05 2009
@@ -31,7 +31,7 @@
  * @version $Rev$ $Date$
  * @since 2.1.0
  */
-public class StringAttributeRenderer extends AbstractBaseAttributeRenderer {
+public class StringAttributeRenderer extends AbstractTypeDetectingAttributeRenderer {
 
     /** {@inheritDoc} */
     public void write(Object value, Attribute attribute,
@@ -39,4 +39,10 @@
             throws IOException {
         request.getWriter().write(value.toString());
     }
+
+    /** {@inheritDoc} */
+    public boolean isRenderable(Object value, Attribute attribute,
+            TilesRequestContext request) {
+        return value instanceof String;
+    }
 }

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/TemplateAttributeRenderer.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/TemplateAttributeRenderer.java?rev=821299&r1=821298&r2=821299&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/TemplateAttributeRenderer.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/renderer/impl/TemplateAttributeRenderer.java Sat Oct  3 12:15:05 2009
@@ -32,7 +32,7 @@
  * @version $Rev$ $Date$
  * @since 2.1.0
  */
-public class TemplateAttributeRenderer extends AbstractBaseAttributeRenderer {
+public class TemplateAttributeRenderer extends AbstractTypeDetectingAttributeRenderer {
 
     /** {@inheritDoc} */
     @Override
@@ -51,4 +51,13 @@
             throw new InvalidTemplateException("Cannot render a null template");
         }
     }
+
+    /** {@inheritDoc} */
+    public boolean isRenderable(Object value, Attribute attribute,
+            TilesRequestContext request) {
+        if (value instanceof String) {
+            return ((String) value).startsWith("/");
+        }
+        return false;
+    }
 }

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=821299&r1=821298&r2=821299&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 Sat Oct  3 12:15:05 2009
@@ -33,7 +33,7 @@
  *
  * @version $Rev$ $Date$
  * @since 2.1.0
- * @deprecated Use {@link UntypedDelegateAttributeRenderer}.
+ * @deprecated Use {@link ChainedDelegateAttributeRenderer}.
  */
 public class UntypedAttributeRenderer extends AbstractBaseAttributeRenderer
         implements TilesContainerAware {

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=821299&r1=821298&r2=821299&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 Sat Oct  3 12:15:05 2009
@@ -20,6 +20,7 @@
  */
 package org.apache.tiles.factory;
 
+import static org.easymock.EasyMock.*;
 import static org.easymock.classextension.EasyMock.*;
 
 import java.net.URL;
@@ -46,11 +47,12 @@
 import org.apache.tiles.preparer.PreparerFactory;
 import org.apache.tiles.renderer.AttributeRenderer;
 import org.apache.tiles.renderer.RendererFactory;
+import org.apache.tiles.renderer.TypeDetectingAttributeRenderer;
 import org.apache.tiles.renderer.impl.BasicRendererFactory;
+import org.apache.tiles.renderer.impl.ChainedDelegateAttributeRenderer;
 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.UntypedDelegateAttributeRenderer;
 import org.easymock.EasyMock;
 
 /**
@@ -230,9 +232,9 @@
         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);
+        AttributeRenderer stringRenderer = createMock(TypeDetectingAttributeRenderer.class);
+        AttributeRenderer templateRenderer = createMock(TypeDetectingAttributeRenderer.class);
+        AttributeRenderer definitionRenderer = createMock(TypeDetectingAttributeRenderer.class);
 
         expect(rendererFactory.getRenderer("string")).andReturn(stringRenderer);
         expect(rendererFactory.getRenderer("template")).andReturn(templateRenderer);
@@ -244,7 +246,7 @@
                 rendererFactory, applicationContext, requestContextFactory,
                 container, attributeEvaluatorFactory);
         assertTrue("The default renderer class is not correct",
-                renderer instanceof UntypedDelegateAttributeRenderer);
+                renderer instanceof ChainedDelegateAttributeRenderer);
         verify(container, requestContextFactory, attributeEvaluatorFactory,
                 rendererFactory);
     }

Added: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/AbstractTypeDetectingAttributeRendererTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/AbstractTypeDetectingAttributeRendererTest.java?rev=821299&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/AbstractTypeDetectingAttributeRendererTest.java (added)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/AbstractTypeDetectingAttributeRendererTest.java Sat Oct  3 12:15:05 2009
@@ -0,0 +1,80 @@
+/*
+ * $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 static org.junit.Assert.*;
+import static org.easymock.EasyMock.*;
+
+import java.io.IOException;
+
+import org.apache.tiles.Attribute;
+import org.apache.tiles.Expression;
+import org.apache.tiles.context.TilesRequestContext;
+import org.apache.tiles.evaluator.AttributeEvaluator;
+import org.apache.tiles.evaluator.AttributeEvaluatorFactory;
+import org.junit.Test;
+
+/**
+ * Tests {@link AbstractTypeDetectingAttributeRenderer}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class AbstractTypeDetectingAttributeRendererTest {
+
+    /**
+     * Tests
+     * {@link AbstractTypeDetectingAttributeRenderer#isRenderable(Attribute, TilesRequestContext)}
+     * .
+     */
+    @Test
+    public void testIsRenderable() {
+        AttributeEvaluatorFactory evaluatorFactory = createMock(AttributeEvaluatorFactory.class);
+        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
+        TilesRequestContext request = createMock(TilesRequestContext.class);
+        Attribute attribute = new Attribute("value", new Expression(
+                "expression"), "role", "rendererName");
+
+        expect(evaluatorFactory.getAttributeEvaluator(attribute)).andReturn(evaluator);
+        expect(evaluator.evaluate(attribute, request)).andReturn("myValue");
+
+        replay(evaluatorFactory, evaluator, request);
+
+        AbstractTypeDetectingAttributeRenderer renderer = new AbstractTypeDetectingAttributeRenderer() {
+
+            public boolean isRenderable(Object value, Attribute attribute,
+                    TilesRequestContext request) {
+                return "myValue".equals(value);
+            }
+
+            @Override
+            public void write(Object value, Attribute attribute,
+                    TilesRequestContext request) throws IOException {
+                // Does nothing.
+            }
+        };
+
+        renderer.setAttributeEvaluatorFactory(evaluatorFactory);
+        assertTrue(renderer.isRenderable(attribute, request));
+
+        verify(evaluatorFactory, evaluator, request);
+    }
+}

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

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

Copied: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/ChainedDelegateAttributeRendererTest.java (from r820373, tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRendererTest.java)
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/ChainedDelegateAttributeRendererTest.java?p2=tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/ChainedDelegateAttributeRendererTest.java&p1=tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRendererTest.java&r1=820373&r2=821299&rev=821299&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/UntypedDelegateAttributeRendererTest.java (original)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/ChainedDelegateAttributeRendererTest.java Sat Oct  3 12:15:05 2009
@@ -28,66 +28,61 @@
 import org.apache.tiles.Attribute;
 import org.apache.tiles.Expression;
 import org.apache.tiles.TilesApplicationContext;
-import org.apache.tiles.TilesContainer;
 import org.apache.tiles.context.TilesRequestContext;
 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.apache.tiles.renderer.TypeDetectingAttributeRenderer;
 import org.easymock.EasyMock;
 import org.junit.Before;
 import org.junit.Test;
 
 /**
- * Tests {@link UntypedAttributeRenderer}.
+ * Tests {@link ChainedDelegateAttributeRenderer}.
  *
  * @version $Rev$ $Date$
  */
-public class UntypedDelegateAttributeRendererTest {
+public class ChainedDelegateAttributeRendererTest {
 
     /**
      * The renderer.
      */
-    private UntypedDelegateAttributeRenderer renderer;
-
-    /**
-     * A mock container.
-     */
-    private TilesContainer container;
+    private ChainedDelegateAttributeRenderer renderer;
 
     /**
      * A mock string attribute renderer.
      */
-    private AttributeRenderer stringRenderer;
+    private TypeDetectingAttributeRenderer stringRenderer;
 
     /**
      * A mock template attribute renderer.
      */
-    private AttributeRenderer templateRenderer;
+    private TypeDetectingAttributeRenderer templateRenderer;
 
     /**
      * A mock definition attribute renderer.
      */
-    private AttributeRenderer definitionRenderer;
+    private TypeDetectingAttributeRenderer 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);
+        stringRenderer = createMock(TypeDetectingAttributeRenderer.class);
+        templateRenderer = createMock(TypeDetectingAttributeRenderer.class);
+        definitionRenderer = createMock(TypeDetectingAttributeRenderer.class);
+        renderer = new ChainedDelegateAttributeRenderer();
         renderer.setAttributeEvaluatorFactory(new BasicAttributeEvaluatorFactory(
                 new DirectAttributeEvaluator()));
+        renderer.addAttributeRenderer(definitionRenderer);
+        renderer.addAttributeRenderer(templateRenderer);
+        renderer.addAttributeRenderer(stringRenderer);
     }
 
     /**
      * Tests
-     * {@link UntypedDelegateAttributeRenderer#render(Attribute, TilesRequestContext)}
+     * {@link ChainedDelegateAttributeRenderer#render(Attribute, TilesRequestContext)}
      * writing a definition.
      *
      * @throws IOException If something goes wrong during rendition.
@@ -103,25 +98,25 @@
                 .createMock(TilesRequestContextFactory.class);
         TilesRequestContext requestContext = EasyMock
                 .createMock(TilesRequestContext.class);
-        Object[] requestObjects = new Object[0];
-        expect(requestContext.getRequestObjects()).andReturn(requestObjects);
-        expect(container.isValidDefinition("my.definition", requestObjects))
-                .andReturn(Boolean.TRUE);
+
+        expect(
+                definitionRenderer.isRenderable("my.definition", attribute,
+                        requestContext)).andReturn(Boolean.TRUE);
         definitionRenderer.render(attribute, requestContext);
 
-        replay(applicationContext, contextFactory, requestContext, container,
+        replay(applicationContext, contextFactory, requestContext,
                 stringRenderer, templateRenderer, definitionRenderer);
         renderer.setApplicationContext(applicationContext);
         renderer.setRequestContextFactory(contextFactory);
         renderer.render(attribute, requestContext);
         writer.close();
         verify(applicationContext, contextFactory, requestContext,
-                container, stringRenderer, templateRenderer, definitionRenderer);
+                stringRenderer, templateRenderer, definitionRenderer);
     }
 
     /**
      * Tests
-     * {@link UntypedDelegateAttributeRenderer#render(Attribute, TilesRequestContext)}
+     * {@link ChainedDelegateAttributeRenderer#render(Attribute, TilesRequestContext)}
      * writing a string.
      *
      * @throws IOException If something goes wrong during rendition.
@@ -136,24 +131,29 @@
                 .createMock(TilesRequestContextFactory.class);
         TilesRequestContext requestContext = EasyMock
                 .createMock(TilesRequestContext.class);
-        Object[] requestObjects = new Object[0];
-        expect(requestContext.getRequestObjects()).andReturn(requestObjects);
-        expect(container.isValidDefinition("Result", requestObjects))
-                .andReturn(Boolean.FALSE);
+        expect(
+                definitionRenderer.isRenderable("Result", attribute,
+                        requestContext)).andReturn(Boolean.FALSE);
+        expect(
+                templateRenderer.isRenderable("Result", attribute,
+                        requestContext)).andReturn(Boolean.FALSE);
+        expect(
+                stringRenderer.isRenderable("Result", attribute,
+                        requestContext)).andReturn(Boolean.TRUE);
         stringRenderer.render(attribute, requestContext);
 
-        replay(applicationContext, contextFactory, requestContext, container,
+        replay(applicationContext, contextFactory, requestContext,
                 stringRenderer, templateRenderer, definitionRenderer);
         renderer.setApplicationContext(applicationContext);
         renderer.setRequestContextFactory(contextFactory);
         renderer.render(attribute, requestContext);
-        verify(applicationContext, contextFactory, requestContext, container,
+        verify(applicationContext, contextFactory, requestContext,
                 stringRenderer, templateRenderer, definitionRenderer);
     }
 
     /**
      * Tests
-     * {@link UntypedDelegateAttributeRenderer#render(Attribute, TilesRequestContext)}
+     * {@link ChainedDelegateAttributeRenderer#render(Attribute, TilesRequestContext)}
      * writing a template.
      *
      * @throws IOException If something goes wrong during rendition.
@@ -169,19 +169,21 @@
                 .createMock(TilesRequestContextFactory.class);
         TilesRequestContext requestContext = EasyMock
                 .createMock(TilesRequestContext.class);
-        Object[] requestObjects = new Object[0];
-        expect(requestContext.getRequestObjects()).andReturn(requestObjects);
-        expect(container.isValidDefinition("/myTemplate.jsp", requestObjects))
-                .andReturn(Boolean.FALSE);
         templateRenderer.render(attribute, requestContext);
+        expect(
+                definitionRenderer.isRenderable("/myTemplate.jsp", attribute,
+                        requestContext)).andReturn(Boolean.FALSE);
+        expect(
+                templateRenderer.isRenderable("/myTemplate.jsp", attribute,
+                        requestContext)).andReturn(Boolean.TRUE);
 
-        replay(applicationContext, contextFactory, requestContext, container,
+        replay(applicationContext, contextFactory, requestContext,
                 stringRenderer, templateRenderer, definitionRenderer);
         renderer.setApplicationContext(applicationContext);
         renderer.setRequestContextFactory(contextFactory);
         renderer.render(attribute, requestContext);
         writer.close();
-        verify(applicationContext, contextFactory, requestContext, container,
+        verify(applicationContext, contextFactory, requestContext,
                 stringRenderer, templateRenderer, definitionRenderer);
     }
 }

Modified: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/DefinitionAttributeRendererTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/DefinitionAttributeRendererTest.java?rev=821299&r1=821298&r2=821299&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/DefinitionAttributeRendererTest.java (original)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/DefinitionAttributeRendererTest.java Sat Oct  3 12:15:05 2009
@@ -20,10 +20,10 @@
  */
 package org.apache.tiles.renderer.impl;
 
-import java.io.IOException;
-import java.io.StringWriter;
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.*;
 
-import junit.framework.TestCase;
+import java.io.IOException;
 
 import org.apache.tiles.Attribute;
 import org.apache.tiles.Expression;
@@ -33,14 +33,15 @@
 import org.apache.tiles.context.TilesRequestContextFactory;
 import org.apache.tiles.evaluator.BasicAttributeEvaluatorFactory;
 import org.apache.tiles.evaluator.impl.DirectAttributeEvaluator;
-import org.easymock.EasyMock;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Tests {@link DefinitionAttributeRenderer}.
  *
  * @version $Rev$ $Date$
  */
-public class DefinitionAttributeRendererTest extends TestCase {
+public class DefinitionAttributeRendererTest {
 
     /**
      * The renderer.
@@ -48,8 +49,8 @@
     private DefinitionAttributeRenderer renderer;
 
     /** {@inheritDoc} */
-    @Override
-    protected void setUp() throws Exception {
+    @Before
+    public void setUp() throws Exception {
         renderer = new DefinitionAttributeRenderer();
         renderer.setAttributeEvaluatorFactory(new BasicAttributeEvaluatorFactory(
                 new DirectAttributeEvaluator()));
@@ -61,28 +62,50 @@
      *
      * @throws IOException If something goes wrong during rendition.
      */
+    @Test
     public void testWrite() throws IOException {
-        StringWriter writer = new StringWriter();
         Attribute attribute = new Attribute("my.definition", (Expression) null,
                 null, "definition");
-        TilesApplicationContext applicationContext = EasyMock
-                .createMock(TilesApplicationContext.class);
-        TilesRequestContextFactory contextFactory = EasyMock
-                .createMock(TilesRequestContextFactory.class);
-        TilesContainer container = EasyMock.createMock(TilesContainer.class);
-        TilesRequestContext requestContext = EasyMock
-                .createMock(TilesRequestContext.class);
+        TilesApplicationContext applicationContext = createMock(TilesApplicationContext.class);
+        TilesRequestContextFactory contextFactory = createMock(TilesRequestContextFactory.class);
+        TilesContainer container = createMock(TilesContainer.class);
+        TilesRequestContext requestContext = createMock(TilesRequestContext.class);
         Object[] requestObjects = new Object[0];
-        EasyMock.expect(requestContext.getRequestObjects()).andReturn(requestObjects);
-        EasyMock.expect(contextFactory.createRequestContext(applicationContext))
-                .andReturn(requestContext);
+        expect(requestContext.getRequestObjects()).andReturn(requestObjects);
         container.render("my.definition");
-        EasyMock.replay(applicationContext, contextFactory, requestContext,
+        replay(applicationContext, contextFactory, requestContext,
                 container);
         renderer.setApplicationContext(applicationContext);
         renderer.setRequestContextFactory(contextFactory);
         renderer.setContainer(container);
         renderer.render(attribute, requestContext);
-        writer.close();
+        verify(applicationContext, contextFactory, requestContext,
+                container);
+    }
+
+    /**
+     * Tests
+     * {@link DefinitionAttributeRenderer#isRenderable(Object, Attribute, TilesRequestContext)}
+     * .
+     */
+    @Test
+    public void testIsRenderable() {
+        Attribute attribute = new Attribute("my.definition", (Expression) null,
+                null, "definition");
+        TilesApplicationContext applicationContext = createMock(TilesApplicationContext.class);
+        TilesRequestContextFactory contextFactory = createMock(TilesRequestContextFactory.class);
+        TilesContainer container = createMock(TilesContainer.class);
+        TilesRequestContext requestContext = createMock(TilesRequestContext.class);
+        Object[] requestObjects = new Object[0];
+        expect(requestContext.getRequestObjects()).andReturn(requestObjects);
+        expect(container.isValidDefinition("my.definition", requestObjects)).andReturn(Boolean.TRUE);
+        replay(applicationContext, contextFactory, requestContext,
+                container);
+        renderer.setApplicationContext(applicationContext);
+        renderer.setRequestContextFactory(contextFactory);
+        renderer.setContainer(container);
+        assertTrue(renderer.isRenderable("my.definition", attribute, requestContext));
+        verify(applicationContext, contextFactory, requestContext,
+                container);
     }
 }

Modified: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/StringAttributeRendererTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/StringAttributeRendererTest.java?rev=821299&r1=821298&r2=821299&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/StringAttributeRendererTest.java (original)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/StringAttributeRendererTest.java Sat Oct  3 12:15:05 2009
@@ -20,11 +20,12 @@
  */
 package org.apache.tiles.renderer.impl;
 
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.*;
+
 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;
@@ -32,14 +33,15 @@
 import org.apache.tiles.context.TilesRequestContextFactory;
 import org.apache.tiles.evaluator.BasicAttributeEvaluatorFactory;
 import org.apache.tiles.evaluator.impl.DirectAttributeEvaluator;
-import org.easymock.EasyMock;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Tests {@link StringAttributeRenderer}.
  *
  * @version $Rev$ $Date$
  */
-public class StringAttributeRendererTest extends TestCase {
+public class StringAttributeRendererTest {
 
     /**
      * The renderer.
@@ -47,8 +49,8 @@
     private StringAttributeRenderer renderer;
 
     /** {@inheritDoc} */
-    @Override
-    protected void setUp() throws Exception {
+    @Before
+    public void setUp() throws Exception {
         renderer = new StringAttributeRenderer();
         renderer.setAttributeEvaluatorFactory(new BasicAttributeEvaluatorFactory(
                 new DirectAttributeEvaluator()));
@@ -60,24 +62,41 @@
      *
      * @throws IOException If something goes wrong during rendition.
      */
+    @Test
     public void testWrite() 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);
-        TilesRequestContext requestContext = EasyMock
-                .createMock(TilesRequestContext.class);
-        EasyMock.expect(contextFactory.createRequestContext(applicationContext))
-                .andReturn(requestContext);
-        EasyMock.expect(requestContext.getWriter()).andReturn(writer);
-        EasyMock.replay(applicationContext, contextFactory, requestContext);
+        TilesApplicationContext applicationContext = createMock(TilesApplicationContext.class);
+        TilesRequestContextFactory contextFactory = createMock(TilesRequestContextFactory.class);
+        TilesRequestContext requestContext = createMock(TilesRequestContext.class);
+        expect(requestContext.getWriter()).andReturn(writer);
+        replay(applicationContext, contextFactory, requestContext);
         renderer.setApplicationContext(applicationContext);
         renderer.setRequestContextFactory(contextFactory);
         renderer.render(attribute, requestContext);
         writer.close();
         assertEquals("Not written 'Result'", "Result", writer.toString());
+        verify(applicationContext, contextFactory, requestContext);
+    }
+
+    /**
+     * Tests
+     * {@link StringAttributeRenderer#isRenderable(Object, Attribute, TilesRequestContext)}.
+     *
+     * @throws IOException If something goes wrong.
+     */
+    @Test
+    public void testIsRenderable() throws IOException {
+        Attribute attribute = new Attribute("Result", (Expression) null, null,
+                "string");
+        TilesApplicationContext applicationContext = createMock(TilesApplicationContext.class);
+        TilesRequestContextFactory contextFactory = createMock(TilesRequestContextFactory.class);
+        TilesRequestContext requestContext = createMock(TilesRequestContext.class);
+        replay(applicationContext, contextFactory, requestContext);
+        renderer.setApplicationContext(applicationContext);
+        renderer.setRequestContextFactory(contextFactory);
+        assertTrue(renderer.isRenderable("Result", attribute, requestContext));
+        verify(applicationContext, contextFactory, requestContext);
     }
 }

Modified: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/TemplateAttributeRendererTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/TemplateAttributeRendererTest.java?rev=821299&r1=821298&r2=821299&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/TemplateAttributeRendererTest.java (original)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/renderer/impl/TemplateAttributeRendererTest.java Sat Oct  3 12:15:05 2009
@@ -20,10 +20,10 @@
  */
 package org.apache.tiles.renderer.impl;
 
-import java.io.IOException;
-import java.io.StringWriter;
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.*;
 
-import junit.framework.TestCase;
+import java.io.IOException;
 
 import org.apache.tiles.Attribute;
 import org.apache.tiles.Expression;
@@ -32,14 +32,15 @@
 import org.apache.tiles.context.TilesRequestContextFactory;
 import org.apache.tiles.evaluator.BasicAttributeEvaluatorFactory;
 import org.apache.tiles.evaluator.impl.DirectAttributeEvaluator;
-import org.easymock.EasyMock;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Tests {@link TemplateAttributeRenderer}.
  *
  * @version $Rev$ $Date$
  */
-public class TemplateAttributeRendererTest extends TestCase {
+public class TemplateAttributeRendererTest {
 
     /**
      * The renderer.
@@ -47,8 +48,8 @@
     private TemplateAttributeRenderer renderer;
 
     /** {@inheritDoc} */
-    @Override
-    protected void setUp() throws Exception {
+    @Before
+    public void setUp() throws Exception {
         renderer = new TemplateAttributeRenderer();
         renderer.setAttributeEvaluatorFactory(new BasicAttributeEvaluatorFactory(
                 new DirectAttributeEvaluator()));
@@ -60,23 +61,39 @@
      *
      * @throws IOException If something goes wrong during rendition.
      */
+    @Test
     public void testWrite() throws IOException {
-        StringWriter writer = new StringWriter();
         Attribute attribute = new Attribute("/myTemplate.jsp",
                 (Expression) null, null, "template");
-        TilesApplicationContext applicationContext = EasyMock
-                .createMock(TilesApplicationContext.class);
-        TilesRequestContextFactory contextFactory = EasyMock
-                .createMock(TilesRequestContextFactory.class);
-        TilesRequestContext requestContext = EasyMock
-                .createMock(TilesRequestContext.class);
-        EasyMock.expect(contextFactory.createRequestContext(applicationContext))
-                .andReturn(requestContext);
+        TilesApplicationContext applicationContext = createMock(TilesApplicationContext.class);
+        TilesRequestContextFactory contextFactory = createMock(TilesRequestContextFactory.class);
+        TilesRequestContext requestContext = createMock(TilesRequestContext.class);
         requestContext.dispatch("/myTemplate.jsp");
-        EasyMock.replay(applicationContext, contextFactory, requestContext);
+        replay(applicationContext, contextFactory, requestContext);
         renderer.setApplicationContext(applicationContext);
         renderer.setRequestContextFactory(contextFactory);
         renderer.render(attribute, requestContext);
-        writer.close();
+        verify(applicationContext, contextFactory, requestContext);
+    }
+
+    /**
+     * Tests
+     * {@link StringAttributeRenderer#isRenderable(Object, Attribute, TilesRequestContext)}.
+     *
+     * @throws IOException If something goes wrong during rendition.
+     */
+    @Test
+    public void testIsRenderable() throws IOException {
+        Attribute attribute = new Attribute("/myTemplate.jsp",
+                (Expression) null, null, "template");
+        TilesApplicationContext applicationContext = createMock(TilesApplicationContext.class);
+        TilesRequestContextFactory contextFactory = createMock(TilesRequestContextFactory.class);
+        TilesRequestContext requestContext = createMock(TilesRequestContext.class);
+        replay(applicationContext, contextFactory, requestContext);
+        renderer.setApplicationContext(applicationContext);
+        renderer.setRequestContextFactory(contextFactory);
+        assertTrue(renderer.isRenderable("/myTemplate.jsp", attribute,
+                requestContext));
+        verify(applicationContext, contextFactory, requestContext);
     }
 }

Modified: tiles/framework/trunk/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRenderer.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRenderer.java?rev=821299&r1=821298&r2=821299&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRenderer.java (original)
+++ tiles/framework/trunk/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRenderer.java Sat Oct  3 12:15:05 2009
@@ -37,7 +37,7 @@
 import org.apache.tiles.freemarker.FreeMarkerTilesException;
 import org.apache.tiles.freemarker.servlet.TilesFreemarkerServlet;
 import org.apache.tiles.impl.InvalidTemplateException;
-import org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer;
+import org.apache.tiles.renderer.impl.AbstractTypeDetectingAttributeRenderer;
 import org.apache.tiles.servlet.context.ExternalWriterHttpServletResponse;
 import org.apache.tiles.servlet.context.ServletTilesRequestContext;
 import org.apache.tiles.servlet.context.ServletUtil;
@@ -53,7 +53,7 @@
  * @version $Rev$ $Date$
  * @since 2.2.0
  */
-public class FreeMarkerAttributeRenderer extends AbstractBaseAttributeRenderer {
+public class FreeMarkerAttributeRenderer extends AbstractTypeDetectingAttributeRenderer {
 
     /**
      * The servlet that is used to forward the request to.
@@ -118,6 +118,16 @@
         }
     }
 
+    /** {@inheritDoc} */
+    public boolean isRenderable(Object value, Attribute attribute,
+            TilesRequestContext request) {
+        if (value instanceof String) {
+            String string = (String) value;
+            return string.startsWith("/") && string.endsWith(".ftl");
+        }
+        return false;
+    }
+
     /**
      * Extends {@link TilesFreemarkerServlet} to use the attribute value as the template name.
      *

Added: tiles/framework/trunk/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRendererTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRendererTest.java?rev=821299&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRendererTest.java (added)
+++ tiles/framework/trunk/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRendererTest.java Sat Oct  3 12:15:05 2009
@@ -0,0 +1,50 @@
+/*
+ * $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.freemarker.renderer;
+
+import static org.junit.Assert.*;
+
+import org.apache.tiles.renderer.TypeDetectingAttributeRenderer;
+import org.junit.Test;
+
+/**
+ * Tests {@link FreeMarkerAttributeRenderer}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class FreeMarkerAttributeRendererTest {
+
+    /**
+     * Test method for
+     * {@link FreeMarkerAttributeRenderer
+     * #isRenderable(Object, org.apache.tiles.Attribute, org.apache.tiles.context.TilesRequestContext)}
+     * .
+     */
+    @Test
+    public void testIsRenderable() {
+        TypeDetectingAttributeRenderer renderer = new FreeMarkerAttributeRenderer();
+        assertTrue(renderer.isRenderable("/my/template.ftl", null, null));
+        assertFalse(renderer.isRenderable("my/template.ftl", null, null));
+        assertFalse(renderer.isRenderable("/my/template.jsp", null, null));
+        assertFalse(renderer.isRenderable(0, null, null));
+    }
+
+}

Propchange: tiles/framework/trunk/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRendererTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/renderer/FreeMarkerAttributeRendererTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: tiles/framework/trunk/tiles-velocity/src/main/java/org/apache/tiles/velocity/renderer/VelocityAttributeRenderer.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-velocity/src/main/java/org/apache/tiles/velocity/renderer/VelocityAttributeRenderer.java?rev=821299&r1=821298&r2=821299&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-velocity/src/main/java/org/apache/tiles/velocity/renderer/VelocityAttributeRenderer.java (original)
+++ tiles/framework/trunk/tiles-velocity/src/main/java/org/apache/tiles/velocity/renderer/VelocityAttributeRenderer.java Sat Oct  3 12:15:05 2009
@@ -31,7 +31,7 @@
 import org.apache.tiles.Attribute;
 import org.apache.tiles.context.TilesRequestContext;
 import org.apache.tiles.impl.InvalidTemplateException;
-import org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer;
+import org.apache.tiles.renderer.impl.AbstractTypeDetectingAttributeRenderer;
 import org.apache.tiles.servlet.context.ServletTilesRequestContext;
 import org.apache.tiles.servlet.context.ServletUtil;
 import org.apache.tiles.util.IteratorEnumeration;
@@ -50,7 +50,7 @@
  * @version $Rev$ $Date$
  * @since 2.2.0
  */
-public class VelocityAttributeRenderer extends AbstractBaseAttributeRenderer {
+public class VelocityAttributeRenderer extends AbstractTypeDetectingAttributeRenderer {
 
     /**
      * The VelocityView object to use.
@@ -108,6 +108,16 @@
         }
     }
 
+    /** {@inheritDoc} */
+    public boolean isRenderable(Object value, Attribute attribute,
+            TilesRequestContext request) {
+        if (value instanceof String) {
+            String string = (String) value;
+            return string.startsWith("/") && string.endsWith(".vm");
+        }
+        return false;
+    }
+
     /**
      * Implements JeeConfig to use parameters set through
      * {@link VelocityAttributeRenderer#setParameter(String, String)}.

Added: tiles/framework/trunk/tiles-velocity/src/test/java/org/apache/tiles/velocity/renderer/VelocityAttributeRendererTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-velocity/src/test/java/org/apache/tiles/velocity/renderer/VelocityAttributeRendererTest.java?rev=821299&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-velocity/src/test/java/org/apache/tiles/velocity/renderer/VelocityAttributeRendererTest.java (added)
+++ tiles/framework/trunk/tiles-velocity/src/test/java/org/apache/tiles/velocity/renderer/VelocityAttributeRendererTest.java Sat Oct  3 12:15:05 2009
@@ -0,0 +1,50 @@
+/*
+ * $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.velocity.renderer;
+
+import static org.junit.Assert.*;
+
+import org.apache.tiles.renderer.TypeDetectingAttributeRenderer;
+import org.junit.Test;
+
+/**
+ * Tests {@link VelocityAttributeRenderer}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class VelocityAttributeRendererTest {
+
+    /**
+     * Test method for
+     * {@link VelocityAttributeRenderer
+     * #isRenderable(Object, org.apache.tiles.Attribute, org.apache.tiles.context.TilesRequestContext)}
+     * .
+     */
+    @Test
+    public void testIsRenderable() {
+        TypeDetectingAttributeRenderer renderer = new VelocityAttributeRenderer();
+        assertTrue(renderer.isRenderable("/my/template.vm", null, null));
+        assertFalse(renderer.isRenderable("my/template.vm", null, null));
+        assertFalse(renderer.isRenderable("/my/template.jsp", null, null));
+        assertFalse(renderer.isRenderable(0, null, null));
+    }
+
+}

Propchange: tiles/framework/trunk/tiles-velocity/src/test/java/org/apache/tiles/velocity/renderer/VelocityAttributeRendererTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-velocity/src/test/java/org/apache/tiles/velocity/renderer/VelocityAttributeRendererTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL