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/02/20 13:14:17 UTC

svn commit: r912109 - in /tiles/sandbox/trunk/tiles3: tiles-freemarker/src/main/java/org/apache/tiles/freemarker/ tiles-freemarker/src/main/java/org/apache/tiles/freemarker/context/ tiles-freemarker/src/main/java/org/apache/tiles/freemarker/io/ tiles-f...

Author: apetrelli
Date: Sat Feb 20 12:14:16 2010
New Revision: 912109

URL: http://svn.apache.org/viewvc?rev=912109&view=rev
Log:
TILESSB-23
Created body abstraction and implementations for JSP, Freemarker and Velocity.
Modified AddAttribute and PutAttribute tags for all technologies.

Added:
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/FreemarkerModelBody.java   (with props)
    tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/JspModelBody.java   (with props)
    tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/
    tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/AbstractModelBody.java   (with props)
    tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/ModelBody.java   (with props)
    tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/NullWriter.java
      - copied, changed from r903407, tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/io/NullWriter.java
    tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/VelocityModelBody.java   (with props)
Removed:
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/io/NullWriter.java
Modified:
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/context/FreeMarkerUtil.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/template/AddAttributeFMModel.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/template/PutAttributeFMModel.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/context/FreeMarkerUtilTest.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/io/NullWriterTest.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/AddAttributeFMModelTest.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/AddListAttributeFMModelTest.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/DefinitionFMModelTest.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/GetAsStringFMModelTest.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertAttributeFMModelTest.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertDefinitionFMModelTest.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertTemplateFMModelTest.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/PutAttributeFMModelTest.java
    tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/PutListAttributeFMModelTest.java
    tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/AddAttributeTag.java
    tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/PutAttributeTag.java
    tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/AddAttributeModel.java
    tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/PutAttributeModel.java
    tiles/sandbox/trunk/tiles3/tiles-template/src/test/java/org/apache/tiles/template/AddAttributeModelTest.java
    tiles/sandbox/trunk/tiles3/tiles-template/src/test/java/org/apache/tiles/template/PutAttributeModelTest.java
    tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/AddAttributeDirective.java
    tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/BodyBlockDirective.java
    tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/PutAttributeDirective.java
    tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/AddAttributeDirectiveTest.java
    tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/BodyBlockDirectiveTest.java
    tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/PutAttributeDirectiveTest.java

Added: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/FreemarkerModelBody.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/FreemarkerModelBody.java?rev=912109&view=auto
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/FreemarkerModelBody.java (added)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/FreemarkerModelBody.java Sat Feb 20 12:14:16 2010
@@ -0,0 +1,33 @@
+package org.apache.tiles.freemarker;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import org.apache.tiles.template.body.AbstractModelBody;
+
+import freemarker.template.TemplateDirectiveBody;
+import freemarker.template.TemplateException;
+
+public class FreemarkerModelBody extends AbstractModelBody {
+
+    private TemplateDirectiveBody templateDirectiveBody;
+
+    public FreemarkerModelBody(Writer defaultWriter, TemplateDirectiveBody templateDirectiveBody) {
+        super(defaultWriter);
+        this.templateDirectiveBody = templateDirectiveBody;
+    }
+
+    @Override
+    public void evaluate(Writer writer) throws IOException {
+        if (templateDirectiveBody == null) {
+            return;
+        }
+
+        try {
+            templateDirectiveBody.render(writer);
+        } catch (TemplateException e) {
+            throw new IOException("TemplateException when rendering body", e);
+        }
+    }
+
+}

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

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

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/context/FreeMarkerUtil.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/context/FreeMarkerUtil.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/context/FreeMarkerUtil.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/context/FreeMarkerUtil.java Sat Feb 20 12:14:16 2010
@@ -25,8 +25,8 @@
 import java.io.StringWriter;
 
 import org.apache.tiles.freemarker.FreeMarkerTilesException;
-import org.apache.tiles.freemarker.io.NullWriter;
 import org.apache.tiles.request.freemarker.FreemarkerRequestUtil;
+import org.apache.tiles.template.body.NullWriter;
 
 import freemarker.core.Environment;
 import freemarker.template.TemplateDirectiveBody;

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/template/AddAttributeFMModel.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/template/AddAttributeFMModel.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/template/AddAttributeFMModel.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/template/AddAttributeFMModel.java Sat Feb 20 12:14:16 2010
@@ -24,16 +24,17 @@
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.tiles.freemarker.FreemarkerModelBody;
 import org.apache.tiles.freemarker.context.FreeMarkerUtil;
 import org.apache.tiles.request.Request;
 import org.apache.tiles.request.freemarker.FreemarkerRequest;
 import org.apache.tiles.request.freemarker.FreemarkerRequestUtil;
 import org.apache.tiles.template.AddAttributeModel;
+import org.apache.tiles.template.body.ModelBody;
 
 import freemarker.core.Environment;
 import freemarker.template.TemplateDirectiveBody;
 import freemarker.template.TemplateDirectiveModel;
-import freemarker.template.TemplateException;
 import freemarker.template.TemplateModel;
 
 /**
@@ -64,15 +65,15 @@
     /** {@inheritDoc} */
     @SuppressWarnings("unchecked")
     public void execute(Environment env, Map params, TemplateModel[] loopVars,
-            TemplateDirectiveBody body) throws TemplateException, IOException {
+            TemplateDirectiveBody body) throws IOException {
         Request request = FreemarkerRequest
                 .createServletFreemarkerRequest(FreemarkerRequestUtil
                         .getApplicationContext(env), env);
-        model.start(request);
-        String bodyString = FreeMarkerUtil.renderAsString(body);
+        ModelBody modelBody = new FreemarkerModelBody(env.getOut(), body);
         Map<String, TemplateModel> parms = params;
-        model.end(FreeMarkerUtil.getAsObject(parms.get("value")), FreeMarkerUtil.getAsString(parms.get("expression")),
-                bodyString, FreeMarkerUtil.getAsString(parms.get("role")),
-                FreeMarkerUtil.getAsString(parms.get("type")), request);
+        model.execute(FreeMarkerUtil.getAsObject(parms.get("value")),
+                FreeMarkerUtil.getAsString(parms.get("expression")),
+                FreeMarkerUtil.getAsString(parms.get("role")), FreeMarkerUtil
+                        .getAsString(parms.get("type")), request, modelBody);
     }
 }

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/template/PutAttributeFMModel.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/template/PutAttributeFMModel.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/template/PutAttributeFMModel.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/template/PutAttributeFMModel.java Sat Feb 20 12:14:16 2010
@@ -24,16 +24,17 @@
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.tiles.freemarker.FreemarkerModelBody;
 import org.apache.tiles.freemarker.context.FreeMarkerUtil;
 import org.apache.tiles.request.Request;
 import org.apache.tiles.request.freemarker.FreemarkerRequest;
 import org.apache.tiles.request.freemarker.FreemarkerRequestUtil;
 import org.apache.tiles.template.PutAttributeModel;
+import org.apache.tiles.template.body.ModelBody;
 
 import freemarker.core.Environment;
 import freemarker.template.TemplateDirectiveBody;
 import freemarker.template.TemplateDirectiveModel;
-import freemarker.template.TemplateException;
 import freemarker.template.TemplateModel;
 
 /**
@@ -66,19 +67,19 @@
     /** {@inheritDoc} */
     @SuppressWarnings("unchecked")
     public void execute(Environment env, Map params, TemplateModel[] loopVars,
-            TemplateDirectiveBody body) throws TemplateException, IOException {
+            TemplateDirectiveBody body) throws IOException {
         Request request = FreemarkerRequest
                 .createServletFreemarkerRequest(FreemarkerRequestUtil
                         .getApplicationContext(env), env);
-        model.start(request);
-        String bodyString = FreeMarkerUtil.renderAsString(body);
+        ModelBody modelBody = new FreemarkerModelBody(env.getOut(), body);
         Map<String, TemplateModel> parms = params;
-        model.end(FreeMarkerUtil.getAsString(parms
-                .get("name")), FreeMarkerUtil.getAsObject(parms.get("value")), FreeMarkerUtil.getAsString(parms.get("expression")), bodyString,
-                FreeMarkerUtil.getAsString(parms.get("role")),
-                FreeMarkerUtil.getAsString(parms.get("type")), FreeMarkerUtil
-                        .getAsBoolean(parms.get("cascade"), false),
-                request);
+        model.execute(FreeMarkerUtil.getAsString(parms.get("name")),
+                FreeMarkerUtil.getAsObject(parms.get("value")), FreeMarkerUtil
+                        .getAsString(parms.get("expression")), FreeMarkerUtil
+                        .getAsString(parms.get("role")), FreeMarkerUtil
+                        .getAsString(parms.get("type")), FreeMarkerUtil
+                        .getAsBoolean(parms.get("cascade"), false), request,
+                modelBody);
     }
 
 }

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/context/FreeMarkerUtilTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/context/FreeMarkerUtilTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/context/FreeMarkerUtilTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/context/FreeMarkerUtilTest.java Sat Feb 20 12:14:16 2010
@@ -36,7 +36,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
-import org.apache.tiles.freemarker.io.NullWriter;
+import org.apache.tiles.template.body.NullWriter;
 import org.junit.Before;
 import org.junit.Test;
 

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/io/NullWriterTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/io/NullWriterTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/io/NullWriterTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/io/NullWriterTest.java Sat Feb 20 12:14:16 2010
@@ -20,6 +20,7 @@
  */
 package org.apache.tiles.freemarker.io;
 
+import org.apache.tiles.template.body.NullWriter;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -48,7 +49,7 @@
     }
 
     /**
-     * Test method for {@link org.apache.tiles.freemarker.io.NullWriter#write(char[], int, int)}.
+     * Test method for {@link org.apache.tiles.template.body.NullWriter#write(char[], int, int)}.
      */
     @Test
     public void testWriteCharArrayIntInt() {
@@ -56,7 +57,7 @@
     }
 
     /**
-     * Test method for {@link org.apache.tiles.freemarker.io.NullWriter#flush()}.
+     * Test method for {@link org.apache.tiles.template.body.NullWriter#flush()}.
      */
     @Test
     public void testFlush() {
@@ -64,7 +65,7 @@
     }
 
     /**
-     * Test method for {@link org.apache.tiles.freemarker.io.NullWriter#close()}.
+     * Test method for {@link org.apache.tiles.template.body.NullWriter#close()}.
      */
     @Test
     public void testClose() {

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/AddAttributeFMModelTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/AddAttributeFMModelTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/AddAttributeFMModelTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/AddAttributeFMModelTest.java Sat Feb 20 12:14:16 2010
@@ -34,6 +34,7 @@
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.tiles.freemarker.FreemarkerModelBody;
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.freemarker.FreemarkerRequest;
 import org.apache.tiles.request.util.ApplicationAccess;
@@ -136,10 +137,9 @@
         params.put("role", objectWrapper.wrap("myRole"));
         params.put("type", objectWrapper.wrap("myType"));
 
-        tModel.start(isA(FreemarkerRequest.class));
-        tModel.end(eq(value), eq("myExpression"), eq(""), eq("myRole"),
-                eq("myType"), isA(FreemarkerRequest.class));
-        body.render(isA(StringWriter.class));
+        tModel.execute(eq(value), eq("myExpression"), eq("myRole"),
+                eq("myType"), isA(FreemarkerRequest.class),
+                isA(FreemarkerModelBody.class));
 
         replay(request, tModel, body, applicationContext);
         fmModel.execute(env, params, null, body);

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/AddListAttributeFMModelTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/AddListAttributeFMModelTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/AddListAttributeFMModelTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/AddListAttributeFMModelTest.java Sat Feb 20 12:14:16 2010
@@ -34,11 +34,11 @@
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.tiles.freemarker.io.NullWriter;
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.freemarker.FreemarkerRequest;
 import org.apache.tiles.request.util.ApplicationAccess;
 import org.apache.tiles.template.AddListAttributeModel;
+import org.apache.tiles.template.body.NullWriter;
 import org.junit.Before;
 import org.junit.Test;
 

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/DefinitionFMModelTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/DefinitionFMModelTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/DefinitionFMModelTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/DefinitionFMModelTest.java Sat Feb 20 12:14:16 2010
@@ -34,11 +34,11 @@
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.tiles.freemarker.io.NullWriter;
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.freemarker.FreemarkerRequest;
 import org.apache.tiles.request.util.ApplicationAccess;
 import org.apache.tiles.template.DefinitionModel;
+import org.apache.tiles.template.body.NullWriter;
 import org.junit.Before;
 import org.junit.Test;
 

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/GetAsStringFMModelTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/GetAsStringFMModelTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/GetAsStringFMModelTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/GetAsStringFMModelTest.java Sat Feb 20 12:14:16 2010
@@ -35,11 +35,11 @@
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.tiles.Attribute;
-import org.apache.tiles.freemarker.io.NullWriter;
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.freemarker.FreemarkerRequest;
 import org.apache.tiles.request.util.ApplicationAccess;
 import org.apache.tiles.template.GetAsStringModel;
+import org.apache.tiles.template.body.NullWriter;
 import org.junit.Before;
 import org.junit.Test;
 

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertAttributeFMModelTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertAttributeFMModelTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertAttributeFMModelTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertAttributeFMModelTest.java Sat Feb 20 12:14:16 2010
@@ -35,11 +35,11 @@
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.tiles.Attribute;
-import org.apache.tiles.freemarker.io.NullWriter;
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.freemarker.FreemarkerRequest;
 import org.apache.tiles.request.util.ApplicationAccess;
 import org.apache.tiles.template.InsertAttributeModel;
+import org.apache.tiles.template.body.NullWriter;
 import org.junit.Before;
 import org.junit.Test;
 

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertDefinitionFMModelTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertDefinitionFMModelTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertDefinitionFMModelTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertDefinitionFMModelTest.java Sat Feb 20 12:14:16 2010
@@ -35,11 +35,11 @@
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.tiles.Attribute;
-import org.apache.tiles.freemarker.io.NullWriter;
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.freemarker.FreemarkerRequest;
 import org.apache.tiles.request.util.ApplicationAccess;
 import org.apache.tiles.template.InsertDefinitionModel;
+import org.apache.tiles.template.body.NullWriter;
 import org.junit.Before;
 import org.junit.Test;
 

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertTemplateFMModelTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertTemplateFMModelTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertTemplateFMModelTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/InsertTemplateFMModelTest.java Sat Feb 20 12:14:16 2010
@@ -35,11 +35,11 @@
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.tiles.Attribute;
-import org.apache.tiles.freemarker.io.NullWriter;
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.freemarker.FreemarkerRequest;
 import org.apache.tiles.request.util.ApplicationAccess;
 import org.apache.tiles.template.InsertTemplateModel;
+import org.apache.tiles.template.body.NullWriter;
 import org.junit.Before;
 import org.junit.Test;
 

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/PutAttributeFMModelTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/PutAttributeFMModelTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/PutAttributeFMModelTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/PutAttributeFMModelTest.java Sat Feb 20 12:14:16 2010
@@ -34,6 +34,7 @@
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.tiles.freemarker.FreemarkerModelBody;
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.freemarker.FreemarkerRequest;
 import org.apache.tiles.request.util.ApplicationAccess;
@@ -139,10 +140,9 @@
         params.put("type", objectWrapper.wrap("myType"));
         params.put("cascade", objectWrapper.wrap(false));
 
-        tModel.start(isA(FreemarkerRequest.class));
-        tModel.end(eq("myName"), eq(value), eq("myExpression"), eq(""),
-                eq("myRole"), eq("myType"), eq(false), isA(FreemarkerRequest.class));
-        body.render(isA(StringWriter.class));
+        tModel.execute(eq("myName"), eq(value), eq("myExpression"),
+                eq("myRole"), eq("myType"), eq(false),
+                isA(FreemarkerRequest.class), isA(FreemarkerModelBody.class));
 
         replay(tModel, body, applicationContext);
         fmModel.execute(env, params, null, body);

Modified: tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/PutListAttributeFMModelTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/PutListAttributeFMModelTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/PutListAttributeFMModelTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/template/PutListAttributeFMModelTest.java Sat Feb 20 12:14:16 2010
@@ -34,11 +34,11 @@
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.tiles.freemarker.io.NullWriter;
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.freemarker.FreemarkerRequest;
 import org.apache.tiles.request.util.ApplicationAccess;
 import org.apache.tiles.template.PutListAttributeModel;
+import org.apache.tiles.template.body.NullWriter;
 import org.junit.Before;
 import org.junit.Test;
 

Added: tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/JspModelBody.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/JspModelBody.java?rev=912109&view=auto
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/JspModelBody.java (added)
+++ tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/JspModelBody.java Sat Feb 20 12:14:16 2010
@@ -0,0 +1,34 @@
+package org.apache.tiles.jsp;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import javax.servlet.jsp.JspContext;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.JspFragment;
+
+import org.apache.tiles.template.body.AbstractModelBody;
+
+public class JspModelBody extends AbstractModelBody {
+
+    private JspFragment jspFragment;
+
+    public JspModelBody(JspFragment jspFragment, JspContext jspContext) {
+        super(jspContext.getOut());
+        this.jspFragment = jspFragment;
+    }
+
+    @Override
+    public void evaluate(Writer writer) throws IOException {
+        if (jspFragment == null) {
+            return;
+        }
+
+        try {
+            jspFragment.invoke(writer);
+        } catch (JspException e) {
+            throw new IOException("JspException when evaluating the body", e);
+        }
+    }
+
+}

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

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

Modified: tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/AddAttributeTag.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/AddAttributeTag.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/AddAttributeTag.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/AddAttributeTag.java Sat Feb 20 12:14:16 2010
@@ -24,14 +24,14 @@
 import java.io.IOException;
 
 import javax.servlet.jsp.JspContext;
-import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.PageContext;
 import javax.servlet.jsp.tagext.SimpleTagSupport;
 
-import org.apache.tiles.jsp.JspUtil;
+import org.apache.tiles.jsp.JspModelBody;
 import org.apache.tiles.request.Request;
 import org.apache.tiles.request.jsp.JspRequest;
 import org.apache.tiles.template.AddAttributeModel;
+import org.apache.tiles.template.body.ModelBody;
 
 /**
  * <p>
@@ -199,15 +199,13 @@
 
     /** {@inheritDoc} */
     @Override
-    public void doTag() throws JspException, IOException {
+    public void doTag() throws IOException {
         JspContext pageContext = getJspContext();
         Request request = JspRequest.createServletJspRequest(
                 org.apache.tiles.request.jsp.JspUtil
                         .getApplicationContext(pageContext),
                 (PageContext) pageContext);
-        model.start(request);
-        String body = JspUtil.evaluateFragmentAsString(getJspBody());
-        model.end(value, expression, body,
-                role, type, request);
+        ModelBody modelBody = new JspModelBody(getJspBody(), pageContext);
+        model.execute(value, expression, role, type, request, modelBody);
     }
 }

Modified: tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/PutAttributeTag.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/PutAttributeTag.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/PutAttributeTag.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/PutAttributeTag.java Sat Feb 20 12:14:16 2010
@@ -24,14 +24,14 @@
 import java.io.IOException;
 
 import javax.servlet.jsp.JspContext;
-import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.PageContext;
 import javax.servlet.jsp.tagext.SimpleTagSupport;
 
-import org.apache.tiles.jsp.JspUtil;
+import org.apache.tiles.jsp.JspModelBody;
 import org.apache.tiles.request.Request;
 import org.apache.tiles.request.jsp.JspRequest;
 import org.apache.tiles.template.PutAttributeModel;
+import org.apache.tiles.template.body.ModelBody;
 
 /**
  * <p>
@@ -266,15 +266,14 @@
 
     /** {@inheritDoc} */
     @Override
-    public void doTag() throws JspException, IOException {
+    public void doTag() throws IOException {
         JspContext jspContext = getJspContext();
         Request request = JspRequest.createServletJspRequest(
                 org.apache.tiles.request.jsp.JspUtil
                         .getApplicationContext(jspContext),
                 (PageContext) jspContext);
-        model.start(request);
-        String body = JspUtil.evaluateFragmentAsString(getJspBody());
-        model.end(name, value, expression,
-                body, role, type, cascade, request);
+        ModelBody modelBody = new JspModelBody(getJspBody(), jspContext);
+        model.execute(name, value, expression, role, type, cascade, request,
+                modelBody);
     }
 }

Modified: tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/AddAttributeModel.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/AddAttributeModel.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/AddAttributeModel.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/AddAttributeModel.java Sat Feb 20 12:14:16 2010
@@ -21,11 +21,14 @@
 
 package org.apache.tiles.template;
 
+import java.io.IOException;
+
 import org.apache.tiles.ArrayStack;
 import org.apache.tiles.Attribute;
 import org.apache.tiles.Expression;
 import org.apache.tiles.ListAttribute;
 import org.apache.tiles.request.Request;
+import org.apache.tiles.template.body.ModelBody;
 
 /**
  * <p>
@@ -85,20 +88,23 @@
      * expression, or body.
      * @param expression The expression to calculate the value from. Use this
      * parameter, or value, or body.
-     * @param body The body of the tag. Use this parameter, or value, or
-     * expression.
      * @param role A comma-separated list of roles. If present, the attribute
      * will be rendered only if the current user belongs to one of the roles.
      * @param type The type (renderer) of the attribute.
      * @param request TODO
-     *
+     * @param modelBody TODO
      * @since 2.2.0
      */
-    public void execute(Object value, String expression,
-            String body, String role, String type, Request request) {
+    public void execute(Object value, String expression, String role,
+            String type, Request request, ModelBody modelBody)
+            throws IOException {
+        Attribute attribute = new Attribute();
         ArrayStack<Object> composeStack = ComposeStackUtil.getComposeStack(request);
-        addAttributeToList(new Attribute(), composeStack, value, expression,
-                body, role, type);
+        composeStack.push(attribute);
+        String body = modelBody.evaluateAsString();
+        attribute = (Attribute) composeStack.pop();
+        addAttributeToList(attribute, composeStack, value, expression, body,
+                role, type);
     }
 
     /**

Modified: tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/PutAttributeModel.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/PutAttributeModel.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/PutAttributeModel.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/PutAttributeModel.java Sat Feb 20 12:14:16 2010
@@ -21,6 +21,8 @@
 
 package org.apache.tiles.template;
 
+import java.io.IOException;
+
 import org.apache.tiles.ArrayStack;
 import org.apache.tiles.Attribute;
 import org.apache.tiles.AttributeContext;
@@ -28,6 +30,7 @@
 import org.apache.tiles.TilesContainer;
 import org.apache.tiles.access.TilesAccess;
 import org.apache.tiles.request.Request;
+import org.apache.tiles.template.body.ModelBody;
 
 /**
  * <p>
@@ -116,25 +119,27 @@
      * expression, or body.
      * @param expression The expression to calculate the value from. Use this
      * parameter, or value, or body.
-     * @param body The body of the tag. Use this parameter, or value, or
-     * expression.
      * @param role A comma-separated list of roles. If present, the attribute
      * will be rendered only if the current user belongs to one of the roles.
      * @param type The type (renderer) of the attribute.
      * @param cascade If <code>true</code> the attribute will be cascaded to all nested attributes.
      * @param request TODO
+     * @param modelBody TODO
      * @param container The Tiles container to use.
      * @param composeStack The composing stack.
-     *
      * @since 2.2.0
      */
     public void execute(String name, Object value,
-            String expression, String body, String role, String type,
-            boolean cascade, Request request) {
-        TilesContainer container = TilesAccess.getCurrentContainer(request);
+            String expression, String role, String type, boolean cascade,
+            Request request, ModelBody modelBody) throws IOException {
         ArrayStack<Object> composeStack = ComposeStackUtil.getComposeStack(request);
-        putAttributeInParent(new Attribute(), container, composeStack, name,
-                value, expression, body, role, type, cascade, request);
+        Attribute attribute = new Attribute();
+        composeStack.push(attribute);
+        String currentBody = modelBody.evaluateAsString();
+        TilesContainer container = TilesAccess.getCurrentContainer(request);
+        attribute = (Attribute) composeStack.pop();
+        putAttributeInParent(attribute, container, composeStack, name,
+                value, expression, currentBody, role, type, cascade, request);
     }
 
     /**

Added: tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/AbstractModelBody.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/AbstractModelBody.java?rev=912109&view=auto
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/AbstractModelBody.java (added)
+++ tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/AbstractModelBody.java Sat Feb 20 12:14:16 2010
@@ -0,0 +1,48 @@
+package org.apache.tiles.template.body;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+
+public abstract class AbstractModelBody implements ModelBody {
+
+    private Writer defaultWriter;
+
+    public AbstractModelBody(Writer defaultWriter) {
+        this.defaultWriter = defaultWriter;
+    }
+
+    @Override
+    public void evaluate() throws IOException {
+        evaluate(defaultWriter);
+    }
+
+    @Override
+    public String evaluateAsString() throws IOException {
+        StringWriter writer = new StringWriter();
+        try {
+            evaluate(writer);
+        } finally {
+            writer.close();
+        }
+        String body = writer.toString();
+        if (body != null) {
+            body = body.replaceAll("^\\s*|\\s*$", "");
+            if (body.length() <= 0) {
+                body = null;
+            }
+        }
+        return body;
+    }
+
+    @Override
+    public void evaluateWithoutWriting() throws IOException {
+        NullWriter writer = new NullWriter();
+        try {
+            evaluate(writer);
+        } finally {
+            writer.close();
+        }
+    }
+
+}

Propchange: tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/AbstractModelBody.java
------------------------------------------------------------------------------
    svn:eol-style = native

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

Added: tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/ModelBody.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/ModelBody.java?rev=912109&view=auto
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/ModelBody.java (added)
+++ tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/ModelBody.java Sat Feb 20 12:14:16 2010
@@ -0,0 +1,15 @@
+package org.apache.tiles.template.body;
+
+import java.io.IOException;
+import java.io.Writer;
+
+public interface ModelBody {
+
+    String evaluateAsString() throws IOException;
+
+    void evaluateWithoutWriting() throws IOException;
+
+    void evaluate() throws IOException;
+
+    void evaluate(Writer writer) throws IOException;
+}

Propchange: tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/ModelBody.java
------------------------------------------------------------------------------
    svn:eol-style = native

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

Copied: tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/NullWriter.java (from r903407, tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/io/NullWriter.java)
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/NullWriter.java?p2=tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/NullWriter.java&p1=tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/io/NullWriter.java&r1=903407&r2=912109&rev=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/io/NullWriter.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-template/src/main/java/org/apache/tiles/template/body/NullWriter.java Sat Feb 20 12:14:16 2010
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-package org.apache.tiles.freemarker.io;
+package org.apache.tiles.template.body;
 
 import java.io.Writer;
 

Modified: tiles/sandbox/trunk/tiles3/tiles-template/src/test/java/org/apache/tiles/template/AddAttributeModelTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-template/src/test/java/org/apache/tiles/template/AddAttributeModelTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-template/src/test/java/org/apache/tiles/template/AddAttributeModelTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-template/src/test/java/org/apache/tiles/template/AddAttributeModelTest.java Sat Feb 20 12:14:16 2010
@@ -24,6 +24,7 @@
 import static org.easymock.classextension.EasyMock.*;
 import static org.junit.Assert.*;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -32,6 +33,7 @@
 import org.apache.tiles.Attribute;
 import org.apache.tiles.ListAttribute;
 import org.apache.tiles.request.Request;
+import org.apache.tiles.template.body.ModelBody;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -122,11 +124,13 @@
     /**
      * Test method for {@link org.apache.tiles.template.AddAttributeModel
      * #execute(java.lang.Object, java.lang.String, java.lang.String, java.lang.String,
-     * java.lang.String, Request)}.
+     * Request, ModelBody)}.
+     * @throws IOException If something goes wrong.
      */
     @Test
-    public void testExecute() {
+    public void testExecute() throws IOException {
         Request request = createMock(Request.class);
+        ModelBody modelBody = createMock(ModelBody.class);
         ArrayStack<Object> composeStack = new ArrayStack<Object>();
         ListAttribute listAttribute = new ListAttribute();
         Attribute attribute;
@@ -135,10 +139,12 @@
         requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
 
         expect(request.getContext("request")).andReturn(requestScope).times(2);
+        expect(modelBody.evaluateAsString()).andReturn(null);
+        expect(modelBody.evaluateAsString()).andReturn("myBody");
 
-        replay(request);
-        model.execute("myValue", "myExpression", "myBody", "myRole",
-                "myType", request);
+        replay(request, modelBody);
+        model.execute("myValue", "myExpression", "myRole", "myType",
+                request, modelBody);
         List<Attribute> attributes = listAttribute.getValue();
         assertEquals(1, attributes.size());
         attribute = attributes.iterator().next();
@@ -153,8 +159,8 @@
         composeStack.push(listAttribute);
         composeStack.push(attribute);
 
-        model.execute(null, "myExpression", "myBody", "myRole", "myType",
-                request);
+        model.execute(null, "myExpression", "myRole", "myType", request,
+                modelBody);
         attributes = listAttribute.getValue();
         assertEquals(1, attributes.size());
         attribute = attributes.iterator().next();
@@ -163,7 +169,7 @@
                 .getExpression());
         assertEquals("myRole", attribute.getRole());
         assertEquals("myType", attribute.getRenderer());
-        verify(request);
+        verify(request, modelBody);
     }
 
 }

Modified: tiles/sandbox/trunk/tiles3/tiles-template/src/test/java/org/apache/tiles/template/PutAttributeModelTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-template/src/test/java/org/apache/tiles/template/PutAttributeModelTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-template/src/test/java/org/apache/tiles/template/PutAttributeModelTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-template/src/test/java/org/apache/tiles/template/PutAttributeModelTest.java Sat Feb 20 12:14:16 2010
@@ -25,6 +25,7 @@
 import static org.easymock.classextension.EasyMock.*;
 import static org.junit.Assert.*;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -36,6 +37,7 @@
 import org.apache.tiles.access.TilesAccess;
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.Request;
+import org.apache.tiles.template.body.ModelBody;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -148,12 +150,14 @@
     /**
      * Test method for {@link org.apache.tiles.template.PutAttributeModel
      * #execute(String, Object, String, String, String,
-     * String, boolean, Request)}.
+     * boolean, Request, ModelBody)}.
+     * @throws IOException If something goes wrong.
      */
     @Test
-    public void testExecuteListAttribute() {
+    public void testExecuteListAttribute() throws IOException {
         TilesContainer container = createMock(TilesContainer.class);
         Request request = createMock(Request.class);
+        ModelBody modelBody = createMock(ModelBody.class);
         AttributeContext attributeContext = createMock(AttributeContext.class);
         ArrayStack<Object> composeStack = new ArrayStack<Object>();
         ListAttribute listAttribute = new ListAttribute();
@@ -167,10 +171,11 @@
         expect(request.getContext("request")).andReturn(requestScope).anyTimes();
         expect(container.getAttributeContext(request)).andReturn(attributeContext);
         attributeContext.putAttribute(eq("myName"), (Attribute) notNull(), eq(false));
+        expect(modelBody.evaluateAsString()).andReturn(null);
 
-        replay(container, attributeContext, request, applicationContext);
-        model.execute("myName", "myValue", "myExpression", "myBody",
-                "myRole", "myType", false, request);
-        verify(container, attributeContext, request, applicationContext);
+        replay(container, attributeContext, request, applicationContext, modelBody);
+        model.execute("myName", "myValue", "myExpression", "myRole",
+                "myType", false, request, modelBody);
+        verify(container, attributeContext, request, applicationContext, modelBody);
     }
 }

Added: tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/VelocityModelBody.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/VelocityModelBody.java?rev=912109&view=auto
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/VelocityModelBody.java (added)
+++ tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/VelocityModelBody.java Sat Feb 20 12:14:16 2010
@@ -0,0 +1,27 @@
+package org.apache.tiles.velocity;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import org.apache.tiles.template.body.AbstractModelBody;
+import org.apache.velocity.context.InternalContextAdapter;
+import org.apache.velocity.runtime.parser.node.ASTBlock;
+
+public class VelocityModelBody extends AbstractModelBody {
+
+    private ASTBlock body;
+
+    private InternalContextAdapter context;
+
+    public VelocityModelBody(InternalContextAdapter context, ASTBlock body, Writer defaultWriter) {
+        super(defaultWriter);
+        this.context = context;
+        this.body = body;
+    }
+
+    @Override
+    public void evaluate(Writer writer) throws IOException {
+        body.render(context, writer);
+    }
+
+}

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

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

Modified: tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/AddAttributeDirective.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/AddAttributeDirective.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/AddAttributeDirective.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/AddAttributeDirective.java Sat Feb 20 12:14:16 2010
@@ -21,25 +21,19 @@
 
 package org.apache.tiles.velocity.template;
 
-import java.io.Writer;
+import java.io.IOException;
 import java.util.Map;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import org.apache.tiles.request.Request;
-import org.apache.tiles.request.servlet.ServletUtil;
-import org.apache.tiles.request.velocity.VelocityRequest;
 import org.apache.tiles.template.AddAttributeModel;
-import org.apache.velocity.context.InternalContextAdapter;
+import org.apache.tiles.template.body.ModelBody;
 
 /**
  * Wraps {@link AddAttributeModel} to be used in Velocity. For the list of
  * parameters, see {@link AddAttributeModel#start(java.util.Stack)},
  * {@link AddAttributeModel#end(java.util.Stack, Object, String, String, String, String)}
  * and
- * {@link AddAttributeModel#execute(java.util.Stack, Object, String, String, String, String)}
+ * {@link AddAttributeModel#execute(java.util.Stack, Object, String, String, String, ModelBody)}
  *
  * @version $Rev$ $Date$
  * @since 2.2.2
@@ -76,29 +70,11 @@
         return "tiles_addAttribute";
     }
 
-    /** {@inheritDoc} */
     @Override
-    protected void end(InternalContextAdapter context, Writer writer,
-            Map<String, Object> params, String body,
-            HttpServletRequest request, HttpServletResponse response,
-            ServletContext servletContext) {
-        Request currentRequest = VelocityRequest.createVelocityRequest(
-                ServletUtil.getApplicationContext(servletContext), request,
-                response, context, writer);
-        model.end(params.get("value"), (String) params.get("expression"), body,
+    protected void execute(Map<String, Object> params, Request request,
+            ModelBody modelBody) throws IOException {
+        model.execute(params.get("value"), (String) params.get("expression"),
                 (String) params.get("role"), (String) params.get("type"),
-                currentRequest);
+                request, modelBody);
     }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void start(InternalContextAdapter context, Writer writer,
-            Map<String, Object> params, HttpServletRequest request,
-            HttpServletResponse response, ServletContext servletContext) {
-        Request currentRequest = VelocityRequest.createVelocityRequest(
-                ServletUtil.getApplicationContext(servletContext), request,
-                response, context, writer);
-        model.start(currentRequest);
-    }
-
 }

Modified: tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/BodyBlockDirective.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/BodyBlockDirective.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/BodyBlockDirective.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/BodyBlockDirective.java Sat Feb 20 12:14:16 2010
@@ -29,9 +29,15 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.tiles.request.Request;
+import org.apache.tiles.request.servlet.ServletUtil;
+import org.apache.tiles.request.velocity.VelocityRequest;
+import org.apache.tiles.template.body.ModelBody;
+import org.apache.tiles.velocity.VelocityModelBody;
 import org.apache.tiles.velocity.context.VelocityUtil;
 import org.apache.velocity.context.InternalContextAdapter;
 import org.apache.velocity.runtime.directive.Directive;
+import org.apache.velocity.runtime.parser.node.ASTBlock;
 import org.apache.velocity.runtime.parser.node.Node;
 import org.apache.velocity.tools.view.ViewContext;
 
@@ -61,42 +67,15 @@
         HttpServletRequest request = viewContext.getRequest();
         HttpServletResponse response = viewContext.getResponse();
         ServletContext servletContext = viewContext.getServletContext();
-        start(context, writer, params, request, response, servletContext);
-        String body = VelocityUtil.getBodyAsString(context, node);
-        end(context, writer, params, body, request, response, servletContext);
+        Request currentRequest = VelocityRequest.createVelocityRequest(
+                ServletUtil.getApplicationContext(servletContext), request,
+                response, context, writer);
+        ASTBlock block = (ASTBlock) node.jjtGetChild(1);
+        ModelBody modelBody = new VelocityModelBody(context, block, writer);
+        execute(params, currentRequest, modelBody);
         return true;
     }
 
-    /**
-     * Starts the directive, before evaluating the body.
-     *
-     * @param context The Velocity context.
-     * @param writer The writer user to write the result.
-     * @param params The parameters got from the first node of the directive.
-     * @param request The HTTP request.
-     * @param response The HTTP response.
-     * @param servletContext The servlet context.
-     * @since 2.2.2
-     */
-    protected abstract void start(InternalContextAdapter context, Writer writer,
-            Map<String, Object> params, HttpServletRequest request,
-            HttpServletResponse response, ServletContext servletContext);
-
-    /**
-     * Ends the directive, after evaluating the body.
-     *
-     * @param context The Velocity context.
-     * @param writer The writer user to write the result.
-     * @param params The parameters got from the first node of the directive.
-     * @param body The body contained in this directive, as a string.
-     * @param request The HTTP request.
-     * @param response The HTTP response.
-     * @param servletContext The servlet context.
-     * @throws IOException If something goes wrong when finishing this directive.
-     * @since 2.2.2
-     */
-    protected abstract void end(InternalContextAdapter context, Writer writer,
-            Map<String, Object> params, String body,
-            HttpServletRequest request, HttpServletResponse response, ServletContext servletContext)
-            throws IOException;
+    protected abstract void execute(Map<String, Object> params,
+            Request request, ModelBody modelBody) throws IOException;
 }

Modified: tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/PutAttributeDirective.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/PutAttributeDirective.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/PutAttributeDirective.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/PutAttributeDirective.java Sat Feb 20 12:14:16 2010
@@ -21,19 +21,13 @@
 
 package org.apache.tiles.velocity.template;
 
-import java.io.Writer;
+import java.io.IOException;
 import java.util.Map;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import org.apache.tiles.request.Request;
-import org.apache.tiles.request.servlet.ServletUtil;
-import org.apache.tiles.request.velocity.VelocityRequest;
 import org.apache.tiles.template.PutAttributeModel;
+import org.apache.tiles.template.body.ModelBody;
 import org.apache.tiles.velocity.context.VelocityUtil;
-import org.apache.velocity.context.InternalContextAdapter;
 
 /**
  * Wraps {@link PutAttributeModel} to be used in Velocity. For the list of
@@ -78,31 +72,13 @@
         return "tiles_putAttribute";
     }
 
-    /** {@inheritDoc} */
     @Override
-    protected void end(InternalContextAdapter context, Writer writer,
-            Map<String, Object> params, String body,
-            HttpServletRequest request, HttpServletResponse response,
-            ServletContext servletContext) {
-        Request currentRequest = VelocityRequest.createVelocityRequest(
-                ServletUtil.getApplicationContext(servletContext), request,
-                response, context, writer);
-        model.end((String) params.get("name"), params.get("value"),
-                (String) params.get("expression"), body, (String) params
-                        .get("role"), (String) params.get("type"),
-                VelocityUtil.toSimpleBoolean((Boolean) params.get("cascade"),
-                        false), currentRequest);
+    protected void execute(Map<String, Object> params, Request request,
+            ModelBody modelBody) throws IOException {
+        model.execute((String) params.get("name"), params.get("value"),
+                (String) params.get("expression"), (String) params.get("role"),
+                (String) params.get("type"), VelocityUtil.toSimpleBoolean(
+                        (Boolean) params.get("cascade"), false), request,
+                modelBody);
     }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void start(InternalContextAdapter context, Writer writer,
-            Map<String, Object> params, HttpServletRequest request,
-            HttpServletResponse response, ServletContext servletContext) {
-        Request currentRequest = VelocityRequest.createVelocityRequest(
-                ServletUtil.getApplicationContext(servletContext), request,
-                response, context, writer);
-        model.start(currentRequest);
-    }
-
 }

Modified: tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/AddAttributeDirectiveTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/AddAttributeDirectiveTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/AddAttributeDirectiveTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/AddAttributeDirectiveTest.java Sat Feb 20 12:14:16 2010
@@ -24,19 +24,13 @@
 import static org.easymock.EasyMock.*;
 import static org.easymock.classextension.EasyMock.*;
 
-import java.io.Writer;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.util.ApplicationAccess;
-import org.apache.tiles.request.velocity.VelocityRequest;
+import org.apache.tiles.request.Request;
 import org.apache.tiles.template.AddAttributeModel;
-import org.apache.velocity.context.InternalContextAdapter;
+import org.apache.tiles.template.body.ModelBody;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -65,50 +59,23 @@
     }
 
     /**
-     * Test method for {@link AddAttributeDirective#start(InternalContextAdapter,
-     * Writer, Map, HttpServletRequest, HttpServletResponse, ServletContext)}.
+     * Test method for
+     * {@link AddAttributeDirective#execute(Map, org.apache.tiles.request.Request, org.apache.tiles.template.body.ModelBody)}
+     * .
+     * @throws IOException If something goes wrong.
      */
     @Test
-    public void testStart() {
-        HttpServletRequest request = createMock(HttpServletRequest.class);
-        HttpServletResponse response = createMock(HttpServletResponse.class);
-        InternalContextAdapter velocityContext = createMock(InternalContextAdapter.class);
+    public void testExecute() throws IOException {
+        Request request = createMock(Request.class);
         Map<String, Object> params = createParams();
-        Writer writer = createMock(Writer.class);
-        ServletContext servletContext = createMock(ServletContext.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        expect(servletContext.getAttribute(ApplicationAccess.APPLICATION_CONTEXT_ATTRIBUTE))
-                .andReturn(applicationContext);
-        tModel.start(isA(VelocityRequest.class));
-
-        replay(tModel, request, response, velocityContext, writer, servletContext, applicationContext);
-        model.start(velocityContext, writer, params, request, response, servletContext);
-        verify(tModel, request, response, velocityContext, writer, servletContext, applicationContext);
-    }
+        ModelBody modelBody = createMock(ModelBody.class);
 
-    /**
-     * Test method for {@link AddAttributeDirective#end(InternalContextAdapter,
-     * Writer, Map, String, HttpServletRequest, HttpServletResponse, ServletContext)}.
-     */
-    @Test
-    public void testEnd() {
-        HttpServletRequest request = createMock(HttpServletRequest.class);
-        HttpServletResponse response = createMock(HttpServletResponse.class);
-        InternalContextAdapter velocityContext = createMock(InternalContextAdapter.class);
-        Map<String, Object> params = createParams();
-        Writer writer = createMock(Writer.class);
-        ServletContext servletContext = createMock(ServletContext.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        expect(servletContext.getAttribute(ApplicationAccess.APPLICATION_CONTEXT_ATTRIBUTE))
-                .andReturn(applicationContext);
-        tModel.end(eq("myValue"), eq("myExpression"), eq("myBody"),
-                eq("myRole"), eq("myType"), isA(VelocityRequest.class));
-
-        replay(tModel, request, response, velocityContext, writer, servletContext);
-        model.end(velocityContext, writer, params, "myBody", request, response, servletContext);
-        verify(tModel, request, response, velocityContext);
+        tModel.execute("myValue", "myExpression", "myRole", "myType", request,
+                modelBody);
+
+        replay(tModel, request, modelBody);
+        model.execute(params, request, modelBody);
+        verify(tModel, request, modelBody);
     }
 
     /**

Modified: tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/BodyBlockDirectiveTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/BodyBlockDirectiveTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/BodyBlockDirectiveTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/BodyBlockDirectiveTest.java Sat Feb 20 12:14:16 2010
@@ -26,7 +26,6 @@
 import static org.junit.Assert.*;
 
 import java.io.IOException;
-import java.io.StringWriter;
 import java.io.Writer;
 import java.lang.reflect.Method;
 import java.util.Map;
@@ -35,6 +34,10 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.util.ApplicationAccess;
+import org.apache.tiles.request.velocity.VelocityRequest;
+import org.apache.tiles.velocity.VelocityModelBody;
 import org.apache.velocity.context.InternalContextAdapter;
 import org.apache.velocity.runtime.directive.DirectiveConstants;
 import org.apache.velocity.runtime.parser.node.ASTBlock;
@@ -91,6 +94,7 @@
         ASTMap astMap = createMock(ASTMap.class);
         ASTBlock block = createMock(ASTBlock.class);
         Map<String, Object> params = createMock(Map.class);
+        ApplicationContext applicationContext = createMock(ApplicationContext.class);
 
         expect(context.getInternalUserContext()).andReturn(viewContext);
         expect(viewContext.getRequest()).andReturn(request);
@@ -99,13 +103,17 @@
         expect(node.jjtGetChild(0)).andReturn(astMap);
         expect(astMap.value(context)).andReturn(params);
         expect(node.jjtGetChild(1)).andReturn(block);
-        expect(block.render(eq(context), isA(StringWriter.class))).andReturn(true);
+        expect(servletContext.getAttribute(ApplicationAccess.APPLICATION_CONTEXT_ATTRIBUTE))
+                .andReturn(applicationContext);
 
-        directive.start(context, writer, params, request, response, servletContext);
-        directive.end(context, writer, params, null, request, response, servletContext);
+        directive.execute(eq(params), isA(VelocityRequest.class), isA(VelocityModelBody.class));
 
-        replay(directive, context, writer, node, viewContext, servletContext, request, response, astMap, params, block);
+        replay(directive, context, writer, node, viewContext,
+                applicationContext, servletContext, request, response, astMap,
+                params, block);
         directive.render(context, writer, node);
-        verify(directive, context, writer, node, viewContext, servletContext, request, response, astMap, params, block);
+        verify(directive, context, writer, node, viewContext,
+                applicationContext, servletContext, request, response, astMap,
+                params, block);
     }
 }

Modified: tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/PutAttributeDirectiveTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/PutAttributeDirectiveTest.java?rev=912109&r1=912108&r2=912109&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/PutAttributeDirectiveTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/PutAttributeDirectiveTest.java Sat Feb 20 12:14:16 2010
@@ -21,22 +21,15 @@
 
 package org.apache.tiles.velocity.template;
 
-import static org.easymock.EasyMock.*;
 import static org.easymock.classextension.EasyMock.*;
 
-import java.io.Writer;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.util.ApplicationAccess;
-import org.apache.tiles.request.velocity.VelocityRequest;
+import org.apache.tiles.request.Request;
 import org.apache.tiles.template.PutAttributeModel;
-import org.apache.velocity.context.InternalContextAdapter;
+import org.apache.tiles.template.body.ModelBody;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -64,53 +57,24 @@
     }
 
     /**
-     * Test method for {@link PutAttributeDirective#start(InternalContextAdapter,
-     * Writer, Map, HttpServletRequest, HttpServletResponse, ServletContext)}.
+     * Test method for
+     * {@link PutAttributeDirective#execute(Map, org.apache.tiles.request.Request, org.apache.tiles.template.body.ModelBody)}
+     * .
+     * @throws IOException If something goes wrong.
      */
     @Test
-    public void testStart() {
-        HttpServletRequest request = createMock(HttpServletRequest.class);
-        HttpServletResponse response = createMock(HttpServletResponse.class);
-        InternalContextAdapter velocityContext = createMock(InternalContextAdapter.class);
-        Writer writer = createMock(Writer.class);
-        ServletContext servletContext = createMock(ServletContext.class);
+    public void testExecute() throws IOException {
+        Request request = createMock(Request.class);
         Map<String, Object> params = createParams();
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
+        ModelBody modelBody = createMock(ModelBody.class);
 
-        expect(servletContext.getAttribute(ApplicationAccess.APPLICATION_CONTEXT_ATTRIBUTE))
-                .andReturn(applicationContext);
-        tModel.start(isA(VelocityRequest.class));
+        tModel.execute("myName", "myValue", "myExpression", "myRole", "myType",
+                false, request, modelBody);
 
-        replay(tModel, request, response, velocityContext, writer, servletContext, applicationContext);
+        replay(tModel, request, modelBody);
         initializeModel();
-        model.start(velocityContext, writer, params, request, response, servletContext);
-        verify(tModel, request, response, velocityContext, writer, servletContext, applicationContext);
-    }
-
-    /**
-     * Test method for {@link PutAttributeDirective#end(InternalContextAdapter,
-     * Writer, Map, String, HttpServletRequest, HttpServletResponse, ServletContext)}.
-     */
-    @Test
-    public void testEnd() {
-        HttpServletRequest request = createMock(HttpServletRequest.class);
-        HttpServletResponse response = createMock(HttpServletResponse.class);
-        InternalContextAdapter velocityContext = createMock(InternalContextAdapter.class);
-        Writer writer = createMock(Writer.class);
-        ServletContext servletContext = createMock(ServletContext.class);
-        Map<String, Object> params = createParams();
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        expect(servletContext.getAttribute(ApplicationAccess.APPLICATION_CONTEXT_ATTRIBUTE))
-                .andReturn(applicationContext);
-        tModel.end(eq("myName"), eq("myValue"),
-                eq("myExpression"), eq("myBody"), eq("myRole"), eq("myType"),
-                eq(false), isA(VelocityRequest.class));
-
-        replay(tModel, request, response, velocityContext, writer, servletContext, applicationContext);
-        initializeModel();
-        model.end(velocityContext, writer, params, "myBody", request, response, servletContext);
-        verify(tModel, request, response, velocityContext, writer, servletContext, applicationContext);
+        model.execute(params, request, modelBody);
+        verify(tModel, request, modelBody);
     }
 
     /**