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 2010/05/23 20:59:54 UTC

svn commit: r947468 - in /tiles/sandbox/trunk/tiles3: tiles-api/ tiles-api/src/main/java/org/apache/tiles/ tiles-api/src/test/java/org/apache/tiles/ tiles-core/src/main/java/org/apache/tiles/factory/ tiles-core/src/main/java/org/apache/tiles/impl/ tile...

Author: apetrelli
Date: Sun May 23 18:59:53 2010
New Revision: 947468

URL: http://svn.apache.org/viewvc?rev=947468&view=rev
Log:
TILESSB-34
Now CachingTilesContainer is a decorator of a generic TilesContainer.
Added more methods to TilesContainer.

Added:
    tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainerWrapper.java   (with props)
    tiles/sandbox/trunk/tiles3/tiles-api/src/test/java/org/apache/tiles/TilesContainerWrapperTest.java   (with props)
    tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/mgmt/
    tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/mgmt/CachingTilesContainerTest.java   (with props)
Modified:
    tiles/sandbox/trunk/tiles3/tiles-api/pom.xml
    tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java
    tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
    tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java
    tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java
    tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/BasicTilesContainerUnitTest.java
    tiles/sandbox/trunk/tiles3/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java
    tiles/sandbox/trunk/tiles3/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactoryTest.java

Modified: tiles/sandbox/trunk/tiles3/tiles-api/pom.xml
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-api/pom.xml?rev=947468&r1=947467&r2=947468&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-api/pom.xml (original)
+++ tiles/sandbox/trunk/tiles3/tiles-api/pom.xml Sun May 23 18:59:53 2010
@@ -89,8 +89,8 @@
           </dependency>
         <dependency>
               <groupId>org.easymock</groupId>
-              <artifactId>easymock</artifactId>
-              <version>2.5.1</version>
+              <artifactId>easymockclassextension</artifactId>
+              <version>2.5.2</version>
               <scope>test</scope>
           </dependency>
         <dependency>

Modified: tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java?rev=947468&r1=947467&r2=947468&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java Sun May 23 18:59:53 2010
@@ -95,6 +95,13 @@ public interface TilesContainer {
     void render(String definition, Request request);
 
     /**
+     * Renders the specified definition.
+     * @param definition The definition to render.
+     * @param request The request context.
+     */
+    public void render(Definition definition, Request request);
+
+    /**
      * Render the given Attribute.
      *
      * @param attribute The attribute to render.
@@ -116,6 +123,18 @@ public interface TilesContainer {
     Object evaluate(Attribute attribute, Request request);
 
     /**
+     * Returns a definition specifying its name.
+     *
+     * @param definitionName The name of the definition to find.
+     * @param request The request context.
+     * @return The definition, if found.
+     * @throws DefinitionsFactoryException If the definitions factory throws an
+     * exception.
+     */
+    public Definition getDefinition(String definitionName,
+            Request request);
+
+    /**
      * Determine whether or not the definition exists.
      *
      * @param definition the name of the definition.

Added: tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainerWrapper.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainerWrapper.java?rev=947468&view=auto
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainerWrapper.java (added)
+++ tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainerWrapper.java Sun May 23 18:59:53 2010
@@ -0,0 +1,82 @@
+package org.apache.tiles;
+
+import java.io.IOException;
+
+import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.Request;
+
+public class TilesContainerWrapper implements TilesContainer {
+
+    protected TilesContainer container;
+
+    public TilesContainerWrapper(TilesContainer container) {
+        this.container = container;
+        if (container == null) {
+            throw new NullPointerException("The wrapped container must be not null");
+        }
+    }
+
+    public TilesContainer getWrappedContainer() {
+        return container;
+    }
+
+    @Override
+    public void endContext(Request request) {
+        container.endContext(request);
+    }
+
+    @Override
+    public Object evaluate(Attribute attribute, Request request) {
+        return container.evaluate(attribute, request);
+    }
+
+    @Override
+    public ApplicationContext getApplicationContext() {
+        return container.getApplicationContext();
+    }
+
+    @Override
+    public AttributeContext getAttributeContext(Request request) {
+        return container.getAttributeContext(request);
+    }
+
+    @Override
+    public Definition getDefinition(String definitionName, Request request) {
+        return container.getDefinition(definitionName, request);
+    }
+
+    @Override
+    public boolean isValidDefinition(String definition, Request request) {
+        return container.isValidDefinition(definition, request);
+    }
+
+    @Override
+    public void prepare(String preparer, Request request) {
+        container.prepare(preparer, request);
+    }
+
+    @Override
+    public void render(String definition, Request request) {
+        container.render(definition, request);
+    }
+
+    @Override
+    public void render(Definition definition, Request request) {
+        container.render(definition, request);
+    }
+
+    @Override
+    public void render(Attribute attribute, Request request) throws IOException {
+        container.render(attribute, request);
+    }
+
+    @Override
+    public void renderContext(Request request) {
+        container.renderContext(request);
+    }
+
+    @Override
+    public AttributeContext startContext(Request request) {
+        return container.startContext(request);
+    }
+}

Propchange: tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainerWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/sandbox/trunk/tiles3/tiles-api/src/main/java/org/apache/tiles/TilesContainerWrapper.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/sandbox/trunk/tiles3/tiles-api/src/test/java/org/apache/tiles/TilesContainerWrapperTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-api/src/test/java/org/apache/tiles/TilesContainerWrapperTest.java?rev=947468&view=auto
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-api/src/test/java/org/apache/tiles/TilesContainerWrapperTest.java (added)
+++ tiles/sandbox/trunk/tiles3/tiles-api/src/test/java/org/apache/tiles/TilesContainerWrapperTest.java Sun May 23 18:59:53 2010
@@ -0,0 +1,229 @@
+/**
+ *
+ */
+package org.apache.tiles;
+
+import static org.easymock.classextension.EasyMock.*;
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.Request;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests {@link TilesContainerWrapper}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TilesContainerWrapperTest {
+
+    private TilesContainer container;
+
+    private TilesContainerWrapper wrapper;
+
+    /**
+     * Sets up the test.
+     */
+    @Before
+    public void setUp() {
+        container = createMock(TilesContainer.class);
+        wrapper = new TilesContainerWrapper(container);
+    }
+
+    /**
+     * Tests {@link TilesContainerWrapper#TilesContainerWrapper(TilesContainer)}.
+     */
+    @Test(expected=NullPointerException.class)
+    public void testTilesContainerWrapperNPE() {
+        new TilesContainerWrapper(null);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#getWrappedContainer()}.
+     */
+    @Test
+    public void testGetWrappedContainer() {
+        replay(container);
+        assertSame(container, wrapper.getWrappedContainer());
+        verify(container);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#endContext(org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testEndContext() {
+        Request request = createMock(Request.class);
+
+        container.endContext(request);
+
+        replay(container, request);
+        wrapper.endContext(request);
+        verify(container, request);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#evaluate(org.apache.tiles.Attribute, org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testEvaluate() {
+        Request request = createMock(Request.class);
+        Attribute attribute = createMock(Attribute.class);
+
+        expect(container.evaluate(attribute, request)).andReturn(new Integer(1));
+
+        replay(container, request, attribute);
+        assertEquals(new Integer(1), wrapper.evaluate(attribute, request));
+        verify(container, request, attribute);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#getApplicationContext()}.
+     */
+    @Test
+    public void testGetApplicationContext() {
+        ApplicationContext applicationContext = createMock(ApplicationContext.class);
+
+        expect(container.getApplicationContext()).andReturn(applicationContext);
+
+        replay(container, applicationContext);
+        assertSame(applicationContext, wrapper.getApplicationContext());
+        verify(container, applicationContext);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#getAttributeContext(org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testGetAttributeContext() {
+        Request request = createMock(Request.class);
+        AttributeContext attribute = createMock(AttributeContext.class);
+
+        expect(container.getAttributeContext(request)).andReturn(attribute);
+
+        replay(container, request, attribute);
+        assertSame(attribute, wrapper.getAttributeContext(request));
+        verify(container, request, attribute);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#getDefinition(java.lang.String, org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testGetDefinition() {
+        Request request = createMock(Request.class);
+        Definition definition = createMock(Definition.class);
+
+        expect(container.getDefinition("definition", request)).andReturn(definition);
+
+        replay(container, request, definition);
+        assertSame(definition, wrapper.getDefinition("definition", request));
+        verify(container, request, definition);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#isValidDefinition(java.lang.String, org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testIsValidDefinition() {
+        Request request = createMock(Request.class);
+
+        expect(container.isValidDefinition("definition", request)).andReturn(true);
+
+        replay(container, request);
+        assertTrue(wrapper.isValidDefinition("definition", request));
+        verify(container, request);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#prepare(java.lang.String, org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testPrepare() {
+        Request request = createMock(Request.class);
+
+        container.prepare("preparer", request);
+
+        replay(container, request);
+        wrapper.prepare("preparer", request);
+        verify(container, request);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#render(java.lang.String, org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testRenderStringRequest() {
+        Request request = createMock(Request.class);
+
+        container.render("definition", request);
+
+        replay(container, request);
+        wrapper.render("definition", request);
+        verify(container, request);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#render(org.apache.tiles.Definition, org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testRenderDefinitionRequest() {
+        Request request = createMock(Request.class);
+        Definition definition = createMock(Definition.class);
+
+        container.render(definition, request);
+
+        replay(container, request, definition);
+        wrapper.render(definition, request);
+        verify(container, request, definition);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#render(org.apache.tiles.Attribute, org.apache.tiles.request.Request)}.
+     * @throws IOException If something goes wrong.
+     */
+    @Test
+    public void testRenderAttributeRequest() throws IOException {
+        Request request = createMock(Request.class);
+        Attribute attribute = createMock(Attribute.class);
+
+        container.render(attribute, request);
+
+        replay(container, request, attribute);
+        wrapper.render(attribute, request);
+        verify(container, request, attribute);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#renderContext(org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testRenderContext() {
+        Request request = createMock(Request.class);
+
+        container.renderContext(request);
+
+        replay(container, request);
+        wrapper.renderContext(request);
+        verify(container, request);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.TilesContainerWrapper#startContext(org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testStartContext() {
+        Request request = createMock(Request.class);
+        AttributeContext attribute = createMock(AttributeContext.class);
+
+        expect(container.startContext(request)).andReturn(attribute);
+
+        replay(container, request, attribute);
+        assertSame(attribute, wrapper.startContext(request));
+        verify(container, request, attribute);
+    }
+
+}

Propchange: tiles/sandbox/trunk/tiles3/tiles-api/src/test/java/org/apache/tiles/TilesContainerWrapperTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/sandbox/trunk/tiles3/tiles-api/src/test/java/org/apache/tiles/TilesContainerWrapperTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java?rev=947468&r1=947467&r2=947468&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java Sun May 23 18:59:53 2010
@@ -92,9 +92,10 @@ public class BasicTilesContainerFactory 
                 applicationContext, resolver);
         container.setAttributeEvaluatorFactory(attributeEvaluatorFactory);
         container.setPreparerFactory(createPreparerFactory(applicationContext));
+        TilesContainer injectedContainer = createDecoratedContainer(container, applicationContext);
         container.setRendererFactory(createRendererFactory(applicationContext,
-                container, attributeEvaluatorFactory));
-        return container;
+                injectedContainer, attributeEvaluatorFactory));
+        return injectedContainer;
     }
 
     /**
@@ -110,6 +111,19 @@ public class BasicTilesContainerFactory 
     }
 
     /**
+     * Instantiate the container that will be injected to child objects.
+     *
+     * @param originalContainer The original instantiated container.
+     * @param context The Tiles application context object.
+     * @return The instantiated container.
+     * @since 3.0.0
+     */
+    protected TilesContainer createDecoratedContainer(TilesContainer originalContainer,
+            ApplicationContext context) {
+        return originalContainer;
+    }
+
+    /**
      * Creates the definitions factory. By default it creates a
      * {@link UnresolvingLocaleDefinitionsFactory} with default dependencies.
      *

Modified: tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java?rev=947468&r1=947467&r2=947468&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java Sun May 23 18:59:53 2010
@@ -31,7 +31,6 @@ import org.apache.tiles.BasicAttributeCo
 import org.apache.tiles.Definition;
 import org.apache.tiles.TilesContainer;
 import org.apache.tiles.definition.DefinitionsFactory;
-import org.apache.tiles.definition.DefinitionsFactoryException;
 import org.apache.tiles.definition.NoSuchDefinitionException;
 import org.apache.tiles.evaluator.AttributeEvaluator;
 import org.apache.tiles.evaluator.AttributeEvaluatorFactory;
@@ -218,7 +217,27 @@ public class BasicTilesContainer impleme
             throw new NoSuchDefinitionException("Unable to find the definition '" + definitionName + "'");
         }
 
-        render(request, definition);
+        render(definition, request);
+    }
+
+    /**
+     * Renders the specified definition.
+     * @param definition The definition to render.
+     * @param request The request context.
+     * @since 2.1.3
+     */
+    public void render(Definition definition, Request request) {
+        AttributeContext originalContext = getAttributeContext(request);
+        BasicAttributeContext subContext = new BasicAttributeContext(originalContext);
+        subContext.inherit(definition);
+
+        pushContext(subContext, request);
+
+        try {
+            render(request, subContext);
+        } finally {
+            popContext(request);
+        }
     }
 
     /** {@inheritDoc} */
@@ -257,16 +276,9 @@ public class BasicTilesContainer impleme
         }
     }
 
-    /**
-     * Returns a definition specifying its name.
-     *
-     * @param definitionName The name of the definition to find.
-     * @param request The request context.
-     * @return The definition, if found.
-     * @throws DefinitionsFactoryException If the definitions factory throws an
-     * exception.
-     */
-    protected Definition getDefinition(String definitionName,
+    /** {@inheritDoc} */
+    @Override
+    public Definition getDefinition(String definitionName,
             Request request) {
         Definition definition =
             definitionsFactory.getDefinition(definitionName, request);
@@ -363,26 +375,6 @@ public class BasicTilesContainer impleme
     }
 
     /**
-     * Renders the specified definition.
-     * @param request The request context.
-     * @param definition The definition to render.
-     * @since 2.1.3
-     */
-    protected void render(Request request, Definition definition) {
-        AttributeContext originalContext = getAttributeContext(request);
-        BasicAttributeContext subContext = new BasicAttributeContext(originalContext);
-        subContext.inherit(definition);
-
-        pushContext(subContext, request);
-
-        try {
-            render(request, subContext);
-        } finally {
-            popContext(request);
-        }
-    }
-
-    /**
      * Renders the specified attribute context.
      *
      * @param request The request context.

Modified: tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java?rev=947468&r1=947467&r2=947468&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java Sun May 23 18:59:53 2010
@@ -22,17 +22,14 @@ package org.apache.tiles.impl.mgmt;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
 
-import org.apache.tiles.Attribute;
 import org.apache.tiles.Definition;
+import org.apache.tiles.TilesContainer;
+import org.apache.tiles.TilesContainerWrapper;
 import org.apache.tiles.definition.DefinitionsFactory;
 import org.apache.tiles.definition.NoSuchDefinitionException;
-import org.apache.tiles.impl.BasicTilesContainer;
 import org.apache.tiles.mgmt.MutableTilesContainer;
 import org.apache.tiles.request.Request;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Manages custom and configured definitions, so they can be used by the
@@ -40,12 +37,7 @@ import org.slf4j.LoggerFactory;
  *
  * @version $Rev$ $Date$
  */
-public class CachingTilesContainer extends BasicTilesContainer implements MutableTilesContainer {
-
-    /**
-     * The logging object.
-     */
-    private final Logger log = LoggerFactory.getLogger(CachingTilesContainer.class);
+public class CachingTilesContainer extends TilesContainerWrapper implements MutableTilesContainer {
 
     /**
      * The default name of the attribute in which storing custom definitions.
@@ -60,18 +52,21 @@ public class CachingTilesContainer exten
 
     /**
      * Constructor.
+     * @param originalContainer The original container to wrap.
      */
-    public CachingTilesContainer() {
+    public CachingTilesContainer(TilesContainer originalContainer) {
+        super(originalContainer);
         definitionsAttributeName = DEFAULT_DEFINITIONS_ATTRIBUTE_NAME;
     }
 
     /**
      * Constructor.
-     *
+     * @param originalContainer The original container to wrap.
      * @param definitionsAttributeName The name of the attribute in which
      * storing custom definitions.
      */
-    public CachingTilesContainer(String definitionsAttributeName) {
+    public CachingTilesContainer(TilesContainer originalContainer, String definitionsAttributeName) {
+        super(originalContainer);
         this.definitionsAttributeName = definitionsAttributeName;
         if (this.definitionsAttributeName == null) {
             this.definitionsAttributeName = DEFAULT_DEFINITIONS_ATTRIBUTE_NAME;
@@ -89,12 +84,21 @@ public class CachingTilesContainer exten
      */
     public Definition getDefinition(String definition,
             Request request) {
-        Map<String, Definition> definitions =
-            getDefinitions(request);
-        if (definitions != null && definitions.containsKey(definition)) {
-            return definitions.get(definition);
+        Definition retValue = null;
+        retValue = getCustomDefinition(definition, request);
+        if (retValue == null) {
+            retValue = super.getDefinition(definition, request);
         }
-        return super.getDefinition(definition, request);
+        return retValue;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean isValidDefinition(String definition, Request request) {
+        if (getCustomDefinition(definition, request) != null) {
+            return true;
+        }
+        return super.isValidDefinition(definition, request);
     }
 
     /** {@inheritDoc} */
@@ -104,49 +108,30 @@ public class CachingTilesContainer exten
         if (definition.getName() == null) {
             definition.setName(getNextUniqueDefinitionName(definitions));
         }
-        validate(definition);
 
         if (definition.isExtending()) {
             this.resolveInheritance(definition, request);
         }
 
         definitions.put(definition.getName(), definition);
-
     }
 
-    /**
-     * Validates a custom definition.
-     *
-     * @param definition The definition to validate.
-     */
-    private void validate(Definition definition) {
-        Set<String> names = definition.getLocalAttributeNames();
-        if (names != null) {
-            for (String name : names) {
-                Attribute attribute = definition.getLocalAttribute(name);
-                if (attribute.getValue() == null) {
-                    throw new IllegalArgumentException(
-                            "Attribute '" + name + "' value not defined");
-                }
-            }
-        }
-        names = definition.getCascadedAttributeNames();
-        if (names != null) {
-            for (String name : names) {
-                Attribute attribute = definition.getCascadedAttribute(name);
-                if (attribute.getValue() == null) {
-                    throw new IllegalArgumentException(
-                            "Attribute '" + name + "' value not defined");
-                }
-            }
+    /** {@inheritDoc} */
+    @Override
+    public void render(String definition, Request request) {
+        Definition toRender = getDefinition(definition, request);
+        if (toRender == null) {
+            throw new NoSuchDefinitionException(
+                    "Cannot find definition named '" + definition + "'");
         }
+        super.render(toRender, request);
     }
 
     /**
      * Resolve inheritance.
      * First, resolve parent's inheritance, then set template to the parent's
      * template.
-     * Also copy attributes setted in parent, and not set in child
+     * Also copy attributes set in parent, and not set in child
      * If instance doesn't extend anything, do nothing.
      *
      * @param definition The definition that needs to have its inheritances
@@ -155,38 +140,35 @@ public class CachingTilesContainer exten
      * @throws org.apache.tiles.definition.DefinitionsFactoryException If an
      * inheritance can not be solved.
      */
-    protected void resolveInheritance(Definition definition,
+    private void resolveInheritance(Definition definition,
             Request request) {
         // Already done, or not needed ?
         if (!definition.isExtending()) {
             return;
         }
 
-        if (log.isDebugEnabled()) {
-            log.debug("Resolve definition for child name='"
-                + definition.getName()
-                + "' extends='" + definition.getExtends() + "'.");
-        }
-
-        // TODO Factories our factory implementations will be context agnostic,
-        //  however, this may cause errors for other implementations.
-        //  we should probably make all factories agnostic and allow the manager to
-        //  utilize the correct factory based on the context.
-        Definition parent = getDefinition(definition.getExtends(), request);
-
-        if (parent == null) { // error
-            String msg = "Error while resolving definition inheritance: child '"
-                + definition.getName()
-                + "' can't find its ancestor '"
-                + definition.getExtends()
-                + "'. Please check your description file.";
-            log.error(msg);
-            // to do : find better exception
-            throw new NoSuchDefinitionException(msg);
+        String parentDefinitionName = definition.getExtends();
+
+        boolean recurse = true;
+        Definition parent = getCustomDefinition(parentDefinitionName, request);
+        if (parent == null) {
+            parent = container.getDefinition(parentDefinitionName, request);
+            recurse = false;
+        }
+
+        if (parent == null) {
+            throw new NoSuchDefinitionException(
+                    "Error while resolving definition inheritance: child '"
+                            + definition.getName()
+                            + "' can't find its ancestor '"
+                            + parentDefinitionName
+                            + "'. Please check your description file.");
         }
 
         // Resolve parent before itself.
-        resolveInheritance(parent, request);
+        if (recurse) {
+            resolveInheritance(parent, request);
+        }
         definition.inherit(parent);
     }
 
@@ -197,7 +179,7 @@ public class CachingTilesContainer exten
      * @return A map that connects a definition name to a definition.
      */
     @SuppressWarnings("unchecked")
-    protected Map<String, Definition> getDefinitions(
+    private Map<String, Definition> getDefinitions(
             Request request) {
         return (Map<String, Definition>) request.getContext("request")
                 .get(definitionsAttributeName);
@@ -211,11 +193,10 @@ public class CachingTilesContainer exten
      * @return A map that connects a definition name to a definition.
      */
     @SuppressWarnings("unchecked")
-    protected Map<String, Definition> getOrCreateDefinitions(
+    private Map<String, Definition> getOrCreateDefinitions(
             Request request) {
         Map<String, Definition> definitions =
-            (Map<String, Definition>) request
-                .getContext("request").get(definitionsAttributeName);
+            (Map<String, Definition>) request.getContext("request").get(definitionsAttributeName);
         if (definitions == null) {
             definitions = new HashMap<String, Definition>();
             request.getContext("request")
@@ -232,7 +213,7 @@ public class CachingTilesContainer exten
      * @return The unique definition name to be used to store the definition.
      * @since 2.1.0
      */
-    protected String getNextUniqueDefinitionName(
+    private String getNextUniqueDefinitionName(
             Map<String, Definition> definitions) {
         String candidate;
         int anonymousDefinitionIndex = 1;
@@ -244,4 +225,12 @@ public class CachingTilesContainer exten
 
         return candidate;
     }
+
+    private Definition getCustomDefinition(String definition, Request request) {
+        Map<String, Definition> definitions = getDefinitions(request);
+        if (definitions != null) {
+            return definitions.get(definition);
+        }
+        return null;
+    }
 }

Modified: tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/BasicTilesContainerUnitTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/BasicTilesContainerUnitTest.java?rev=947468&r1=947467&r2=947468&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/BasicTilesContainerUnitTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/BasicTilesContainerUnitTest.java Sun May 23 18:59:53 2010
@@ -75,6 +75,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#startContext(org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testStartContext() {
         Request request = createMock(Request.class);
@@ -101,6 +102,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#endContext(org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testEndContext() {
         Request request = createMock(Request.class);
@@ -125,6 +127,7 @@ public class BasicTilesContainerUnitTest
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#renderContext(org.apache.tiles.request.Request)}.
      * @throws IOException If something goes wrong.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testRenderContext() throws IOException {
         Request request = createMock(Request.class);
@@ -169,6 +172,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#getAttributeContext(org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testGetAttributeContext() {
         Request request = createMock(Request.class);
@@ -193,6 +197,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#getAttributeContext(org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testGetAttributeContextNew() {
         Request request = createMock(Request.class);
@@ -241,6 +246,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#prepare(java.lang.String, org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testPrepare() {
         Request request = createMock(Request.class);
@@ -268,6 +274,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#prepare(java.lang.String, org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test(expected=NoSuchPreparerException.class)
     public void testPrepareException() {
         Request request = createMock(Request.class);
@@ -290,9 +297,10 @@ public class BasicTilesContainerUnitTest
     }
 
     /**
-     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(java.lang.String, org.apache.tiles.request.Request)}.
+     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.request.Request, java.lang.String)}.
      * @throws IOException If something goes wrong.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testRenderStringRequest() throws IOException {
         Request request = createMock(Request.class);
@@ -330,7 +338,7 @@ public class BasicTilesContainerUnitTest
     }
 
     /**
-     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(java.lang.String, org.apache.tiles.request.Request)}.
+     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.request.Request, java.lang.String)}.
      */
     @Test(expected=NoSuchDefinitionException.class)
     public void testRenderStringRequestException() {
@@ -349,7 +357,7 @@ public class BasicTilesContainerUnitTest
     }
 
     /**
-     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.Attribute, org.apache.tiles.request.Request)}.
+     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.request.Request, org.apache.tiles.Attribute)}.
      * @throws IOException If something goes wrong.
      */
     @Test
@@ -372,7 +380,7 @@ public class BasicTilesContainerUnitTest
     }
 
     /**
-     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.Attribute, org.apache.tiles.request.Request)}.
+     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.request.Request, org.apache.tiles.Attribute)}.
      * @throws IOException If something goes wrong.
      */
     @Test(expected=CannotRenderException.class)
@@ -391,7 +399,7 @@ public class BasicTilesContainerUnitTest
     }
 
     /**
-     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.Attribute, org.apache.tiles.request.Request)}.
+     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.request.Request, org.apache.tiles.Attribute)}.
      * @throws IOException If something goes wrong.
      */
     @Test(expected=CannotRenderException.class)
@@ -505,6 +513,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#getContextStack(org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testGetContextStack() {
         Request request = createMock(Request.class);
@@ -526,6 +535,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#getContextStack(org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testGetContextStackNew() {
         Request request = createMock(Request.class);
@@ -547,6 +557,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#pushContext(org.apache.tiles.AttributeContext, org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testPushContext() {
         Request request = createMock(Request.class);
@@ -570,6 +581,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#popContext(org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testPopContext() {
         Request request = createMock(Request.class);
@@ -593,6 +605,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#getContext(org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testGetContext() {
         Request request = createMock(Request.class);
@@ -617,6 +630,7 @@ public class BasicTilesContainerUnitTest
     /**
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#getContext(org.apache.tiles.request.Request)}.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testGetContextNull() {
         Request request = createMock(Request.class);
@@ -637,9 +651,10 @@ public class BasicTilesContainerUnitTest
     }
 
     /**
-     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.request.Request, org.apache.tiles.Definition)}.
+     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.Definition, org.apache.tiles.request.Request)}.
      * @throws IOException If something goes wrong.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testRenderRequestDefinition() throws IOException {
         Request request = createMock(Request.class);
@@ -669,16 +684,17 @@ public class BasicTilesContainerUnitTest
         replay(applicationContext, attributeEvaluatorFactory,
                 definitionsFactory, preparerFactory, rendererFactory, request,
                 requestScope, deque, attributeContext, preparer, renderer, definition);
-        container.render(request, definition);
+        container.render(definition, request);
         verify(applicationContext, attributeEvaluatorFactory,
                 definitionsFactory, preparerFactory, rendererFactory, request,
                 requestScope, deque, attributeContext, preparer, renderer, definition);
     }
 
     /**
-     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.request.Request, org.apache.tiles.Definition)}.
+     * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.Definition, org.apache.tiles.request.Request)}.
      * @throws IOException If something goes wrong.
      */
+    @SuppressWarnings("unchecked")
     @Test(expected=CannotRenderException.class)
     public void testRenderRequestDefinitionException() throws IOException {
         Request request = createMock(Request.class);
@@ -710,7 +726,7 @@ public class BasicTilesContainerUnitTest
                 definitionsFactory, preparerFactory, rendererFactory, request,
                 requestScope, deque, attributeContext, preparer, renderer, definition);
         try {
-            container.render(request, definition);
+            container.render(definition, request);
         } finally {
             verify(applicationContext, attributeEvaluatorFactory,
                     definitionsFactory, preparerFactory, rendererFactory,
@@ -723,6 +739,7 @@ public class BasicTilesContainerUnitTest
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.request.Request, org.apache.tiles.AttributeContext)}.
      * @throws IOException If something goes wrong.
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testRenderRequestAttributeContext() throws IOException {
         Request request = createMock(Request.class);
@@ -752,6 +769,7 @@ public class BasicTilesContainerUnitTest
      * Test method for {@link org.apache.tiles.impl.BasicTilesContainer#render(org.apache.tiles.request.Request, org.apache.tiles.AttributeContext)}.
      * @throws IOException If something goes wrong.
      */
+    @SuppressWarnings("unchecked")
     @Test(expected=CannotRenderException.class)
     public void testRenderRequestAttributeContextException() throws IOException {
         Request request = createMock(Request.class);

Added: tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/mgmt/CachingTilesContainerTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/mgmt/CachingTilesContainerTest.java?rev=947468&view=auto
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/mgmt/CachingTilesContainerTest.java (added)
+++ tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/mgmt/CachingTilesContainerTest.java Sun May 23 18:59:53 2010
@@ -0,0 +1,378 @@
+/**
+ *
+ */
+package org.apache.tiles.impl.mgmt;
+
+import static org.easymock.EasyMock.*;
+import static org.easymock.classextension.EasyMock.*;
+import static org.junit.Assert.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tiles.Definition;
+import org.apache.tiles.TilesContainer;
+import org.apache.tiles.definition.NoSuchDefinitionException;
+import org.apache.tiles.request.Request;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests {@link CachingTilesContainer}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class CachingTilesContainerTest {
+
+    /**
+     * The default name of the attribute in which storing custom definitions.
+     */
+    private static final String DEFAULT_DEFINITIONS_ATTRIBUTE_NAME = "org.apache.tiles.impl.mgmt.DefinitionManager.DEFINITIONS";
+
+    private TilesContainer wrapped;
+
+    private CachingTilesContainer container;
+
+    /**
+     * Sets up the test.
+     */
+    @Before
+    public void setUp() {
+        wrapped = createMock(TilesContainer.class);
+        container = new CachingTilesContainer(wrapped);
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#CachingTilesContainer(org.apache.tiles.TilesContainer, java.lang.String)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testCachingTilesContainerTilesContainerString() {
+        TilesContainer wrapped = createMock(TilesContainer.class);
+        Request request = createMock(Request.class);
+        Map<String, Definition> definitions = createMock(Map.class);
+        Map<String, Object> scope = createMock(Map.class);
+        Definition definition = createMock(Definition.class);
+
+        expect(request.getContext("request")).andReturn(scope);
+        expect(scope.get("myattribute")).andReturn(definitions);
+        expect(definitions.get("definition")).andReturn(definition);
+
+        replay(wrapped, request, definitions, scope, definition);
+        CachingTilesContainer container = new CachingTilesContainer(wrapped,
+                "myattribute");
+        assertSame(definition, container.getDefinition("definition", request));
+        verify(wrapped, request, definitions, scope, definition);
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#CachingTilesContainer(TilesContainer, String)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testCachingTilesContainer() {
+        Request request = createMock(Request.class);
+        Map<String, Definition> definitions = createMock(Map.class);
+        Map<String, Object> scope = createMock(Map.class);
+        Definition definition = createMock(Definition.class);
+        TilesContainer wrapped = createMock(TilesContainer.class);
+
+        expect(request.getContext("request")).andReturn(scope);
+        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
+                definitions);
+        expect(definitions.get("definition")).andReturn(definition);
+
+        replay(wrapped, request, definitions, scope, definition);
+        CachingTilesContainer container = new CachingTilesContainer(wrapped,
+                null);
+        assertSame(definition, container.getDefinition("definition", request));
+        verify(wrapped, request, definitions, scope, definition);
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#getDefinition(java.lang.String, org.apache.tiles.request.Request)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testGetDefinition() {
+        Request request = createMock(Request.class);
+        Map<String, Definition> definitions = createMock(Map.class);
+        Map<String, Object> scope = createMock(Map.class);
+        Definition definition = createMock(Definition.class);
+
+        expect(request.getContext("request")).andReturn(scope);
+        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
+                definitions);
+        expect(definitions.get("definition")).andReturn(definition);
+
+        replay(wrapped, request, definitions, scope, definition);
+        assertSame(definition, container.getDefinition("definition", request));
+        verify(wrapped, request, definitions, scope, definition);
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#getDefinition(java.lang.String, org.apache.tiles.request.Request)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testGetDefinitionContainer() {
+        Request request = createMock(Request.class);
+        Map<String, Object> scope = createMock(Map.class);
+        Definition definition = createMock(Definition.class);
+
+        expect(request.getContext("request")).andReturn(scope);
+        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
+                null);
+        expect(wrapped.getDefinition("definition", request)).andReturn(
+                definition);
+
+        replay(wrapped, request, scope, definition);
+        assertSame(definition, container.getDefinition("definition", request));
+        verify(wrapped, request, scope, definition);
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#isValidDefinition(String, Request)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testIsValidDefinition() {
+        Request request = createMock(Request.class);
+        Map<String, Definition> definitions = createMock(Map.class);
+        Map<String, Object> scope = createMock(Map.class);
+        Definition definition = createMock(Definition.class);
+
+        expect(request.getContext("request")).andReturn(scope);
+        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
+                definitions);
+        expect(definitions.get("definition")).andReturn(definition);
+
+        replay(wrapped, request, definitions, scope, definition);
+        assertTrue(container.isValidDefinition("definition", request));
+        verify(wrapped, request, definitions, scope, definition);
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#isValidDefinition(String, Request)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testIsValidDefinitionContainer() {
+        Request request = createMock(Request.class);
+        Map<String, Definition> definitions = createMock(Map.class);
+        Map<String, Object> scope = createMock(Map.class);
+
+        expect(request.getContext("request")).andReturn(scope);
+        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
+                definitions);
+        expect(definitions.get("definition")).andReturn(null);
+        expect(wrapped.isValidDefinition("definition", request)).andReturn(true);
+
+        replay(wrapped, request, definitions, scope);
+        assertTrue(container.isValidDefinition("definition", request));
+        verify(wrapped, request, definitions, scope);
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#register(org.apache.tiles.Definition, org.apache.tiles.request.Request)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testRegister() {
+        Request request = createMock(Request.class);
+        Map<String, Definition> definitions = createMock(Map.class);
+        Map<String, Object> scope = createMock(Map.class);
+        Definition definition = createMock(Definition.class);
+
+        expect(request.getContext("request")).andReturn(scope);
+        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
+                definitions);
+        expect(definition.getName()).andReturn(null);
+        expect(definitions.containsKey("$anonymousMutableDefinition1"))
+                .andReturn(false);
+        definition.setName("$anonymousMutableDefinition1");
+        expect(definition.isExtending()).andReturn(true);
+        // trick to test resolve definition separately.
+        expect(definition.isExtending()).andReturn(false);
+        expect(definition.getName()).andReturn("$anonymousMutableDefinition1");
+        expect(definitions.put("$anonymousMutableDefinition1", definition))
+                .andReturn(null);
+
+        replay(wrapped, request, definitions, scope, definition);
+        container.register(definition, request);
+        verify(wrapped, request, definitions, scope, definition);
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#register(org.apache.tiles.Definition, org.apache.tiles.request.Request)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testRegisterInheritance() {
+        Request request = createMock(Request.class);
+        Map<String, Definition> definitions = createMock(Map.class);
+        Map<String, Object> scope = createMock(Map.class);
+        Definition definition = createMock(Definition.class);
+        Definition parent = createMock(Definition.class);
+        Definition grandparent = createMock(Definition.class);
+
+        expect(request.getContext("request")).andReturn(scope).anyTimes();
+        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
+                definitions).anyTimes();
+        expect(definition.getName()).andReturn(null);
+        expect(definitions.containsKey("$anonymousMutableDefinition1"))
+                .andReturn(false);
+        definition.setName("$anonymousMutableDefinition1");
+        expect(definition.isExtending()).andReturn(true);
+        // trick to test resolve definition separately.
+        expect(definition.isExtending()).andReturn(true);
+        expect(definition.getExtends()).andReturn("parent");
+        expect(definitions.get("parent")).andReturn(parent);
+        expect(parent.isExtending()).andReturn(true);
+        expect(parent.getExtends()).andReturn("grandparent");
+        expect(definition.getName()).andReturn("$anonymousMutableDefinition1");
+        expect(definitions.get("grandparent")).andReturn(null);
+        expect(wrapped.getDefinition("grandparent", request)).andReturn(
+                grandparent);
+        parent.inherit(grandparent);
+        definition.inherit(parent);
+        expect(definitions.put("$anonymousMutableDefinition1", definition))
+                .andReturn(null);
+
+        replay(wrapped, request, definitions, scope, definition, parent,
+                grandparent);
+        container.register(definition, request);
+        verify(wrapped, request, definitions, scope, definition, parent,
+                grandparent);
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#register(org.apache.tiles.Definition, org.apache.tiles.request.Request)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test(expected = NoSuchDefinitionException.class)
+    public void testRegisterInheritanceFail() {
+        Request request = createMock(Request.class);
+        Map<String, Definition> definitions = createMock(Map.class);
+        Map<String, Object> scope = createMock(Map.class);
+        Definition definition = createMock(Definition.class);
+
+        expect(request.getContext("request")).andReturn(scope).anyTimes();
+        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
+                definitions).anyTimes();
+        expect(definition.getName()).andReturn(null);
+        expect(definitions.containsKey("$anonymousMutableDefinition1"))
+                .andReturn(false);
+        definition.setName("$anonymousMutableDefinition1");
+        expect(definition.isExtending()).andReturn(true);
+        // trick to test resolve definition separately.
+        expect(definition.isExtending()).andReturn(true);
+        expect(definition.getExtends()).andReturn("parent");
+        expect(definitions.get("parent")).andReturn(null);
+        expect(wrapped.getDefinition("parent", request)).andReturn(null);
+        expect(definition.getName()).andReturn("$anonymousMutableDefinition1");
+
+        replay(wrapped, request, definitions, scope, definition);
+        try {
+            container.register(definition, request);
+        } finally {
+            verify(wrapped, request, definitions, scope, definition);
+        }
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#register(org.apache.tiles.Definition, org.apache.tiles.request.Request)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testRegisterCreateDefinitions() {
+        Request request = createMock(Request.class);
+        Map<String, Object> scope = createMock(Map.class);
+        Definition definition = createMock(Definition.class);
+
+        expect(request.getContext("request")).andReturn(scope).anyTimes();
+        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
+                null);
+        expect(scope.put(eq(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME), isA(HashMap.class))).andReturn(null);
+        expect(definition.getName()).andReturn(null);
+        definition.setName("$anonymousMutableDefinition1");
+        expect(definition.isExtending()).andReturn(true);
+        // trick to test resolve definition separately.
+        expect(definition.isExtending()).andReturn(false);
+        expect(definition.getName()).andReturn("$anonymousMutableDefinition1");
+
+        replay(wrapped, request, scope, definition);
+        container.register(definition, request);
+        verify(wrapped, request, scope, definition);
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#render(String, Request)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testRender() {
+        Request request = createMock(Request.class);
+        Map<String, Definition> definitions = createMock(Map.class);
+        Map<String, Object> scope = createMock(Map.class);
+        Definition definition = createMock(Definition.class);
+
+        expect(request.getContext("request")).andReturn(scope);
+        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
+                definitions);
+        expect(definitions.get("definition")).andReturn(definition);
+        container.render(definition, request);
+
+        replay(wrapped, request, definitions, scope, definition);
+        container.render("definition", request);
+        verify(wrapped, request, definitions, scope, definition);
+    }
+
+    /**
+     * Test method for
+     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#render(String, Request)}
+     * .
+     */
+    @SuppressWarnings("unchecked")
+    @Test(expected=NoSuchDefinitionException.class)
+    public void testRenderFail() {
+        Request request = createMock(Request.class);
+        Map<String, Definition> definitions = createMock(Map.class);
+        Map<String, Object> scope = createMock(Map.class);
+
+        expect(request.getContext("request")).andReturn(scope);
+        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
+                definitions);
+        expect(definitions.get("definition")).andReturn(null);
+        expect(wrapped.getDefinition("definition", request)).andReturn(null);
+
+        replay(wrapped, request, definitions, scope);
+        try {
+            container.render("definition", request);
+        } finally {
+            verify(wrapped, request, definitions, scope);
+        }
+    }
+}

Propchange: tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/mgmt/CachingTilesContainerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/impl/mgmt/CachingTilesContainerTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: tiles/sandbox/trunk/tiles3/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java?rev=947468&r1=947467&r2=947468&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java Sun May 23 18:59:53 2010
@@ -59,7 +59,6 @@ import org.apache.tiles.evaluator.BasicA
 import org.apache.tiles.factory.BasicTilesContainerFactory;
 import org.apache.tiles.factory.TilesContainerFactoryException;
 import org.apache.tiles.freemarker.renderer.FreeMarkerAttributeRenderer;
-import org.apache.tiles.impl.BasicTilesContainer;
 import org.apache.tiles.impl.mgmt.CachingTilesContainer;
 import org.apache.tiles.locale.LocaleResolver;
 import org.apache.tiles.mvel.MVELAttributeEvaluator;
@@ -114,9 +113,10 @@ public class CompleteAutoloadTilesContai
 
     /** {@inheritDoc} */
     @Override
-    protected BasicTilesContainer instantiateContainer(
+    public TilesContainer createDecoratedContainer(
+            TilesContainer originalContainer,
             ApplicationContext applicationContext) {
-        return new CachingTilesContainer();
+        return new CachingTilesContainer(originalContainer);
     }
 
     /** {@inheritDoc} */

Modified: tiles/sandbox/trunk/tiles3/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactoryTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactoryTest.java?rev=947468&r1=947467&r2=947468&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactoryTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactoryTest.java Sun May 23 18:59:53 2010
@@ -85,12 +85,19 @@ public class CompleteAutoloadTilesContai
 
     /**
      * Test method for
-     * {@link CompleteAutoloadTilesContainerFactory#instantiateContainer(ApplicationContext)}
+     * {@link CompleteAutoloadTilesContainerFactory#createDecoratedContainer(TilesContainer, ApplicationContext)
      * .
      */
     @Test
-    public void testInstantiateContainerTilesApplicationContext() {
-        assertTrue(factory.instantiateContainer(null) instanceof CachingTilesContainer);
+    public void testCreateDecoratedContainer() {
+        ApplicationContext applicationContext = createMock(ServletApplicationContext.class);
+        TilesContainer wrapped = createMock(TilesContainer.class);
+
+        replay(applicationContext, wrapped);
+        assertSame(wrapped, ((CachingTilesContainer) factory
+                .createDecoratedContainer(wrapped, applicationContext))
+                .getWrappedContainer());
+        verify(applicationContext, wrapped);
     }
 
     /**