Author: apetrelli
Date: Mon Feb  5 07:23:04 2007
New Revision: 503719

URL: http://svn.apache.org/viewvc?view=rev&rev=503719
Log:
TILES-101
Added support for a stack of ComponentContext objects.
TILES-100
Rolled-back implementation since it is not correct.

Modified:
    
tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java
    
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/BasicComponentContext.java
    
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java
    
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/ComponentConstants.java
    
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/ContainerTagSupport.java
    
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertAttributeTag.java
    
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertDefinitionTag.java
    
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertTemplateTag.java
    
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/RenderTagSupport.java

Modified: 
tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java?view=diff&rev=503719&r1=503718&r2=503719
==============================================================================
--- 
tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java
 (original)
+++ 
tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java
 Mon Feb  5 07:23:04 2007
@@ -68,45 +68,63 @@
     ComponentContext getComponentContext(PageContext context);
 
     /**
-     * Creates a new component context from the current request
-     * @return map of the attributes in the current component context.
+     * Starts a new context, where attribute values are stored independently
+     * from others.<br>
+     * When the use of the contexts is finished, call
+     * [EMAIL PROTECTED] TilesContainer#endContext(Object, Object)}
+     *
+     * @param request the current request.
+     * @param response the current reponse.
+     * @return The newly created context.
      */
-    ComponentContext createComponentContext();
+    ComponentContext startContext(Object request, Object response);
 
     /**
-     * @param request the current request
-     * @param response the current response
-     * @param definition the requested definition
-     * @throws TilesException is processing fails.
+     * Starts a new context, where attribute values are stored independently
+     * from others.<br>
+     * When the use of the contexts is finished, call
+     * [EMAIL PROTECTED] TilesContainer#endContext(PageContext)}
+     *
+     * @param context the current request.
+     * @return The newly created context.
      */
-    void prepare(Object request, Object response, String definition) throws 
TilesException;
-
+    ComponentContext startContext(PageContext context);
+    
     /**
-     * @param pageContext the current pageContext
-     * @param definition the current definition
-     * @throws TilesException is processing fails.
+     * Ends a context, where attribute values are stored independently
+     * from others.<br>
+     * It must be called after a
+     * [EMAIL PROTECTED] TilesContainer#startContext(Object, Object)} call.
+     *
+     * @param request the current request.
+     * @param response the current reponse.
      */
-    void prepare(PageContext pageContext, String definition) throws 
TilesException;
-
+    void endContext(Object request, Object response);
+    
+    /**
+     * Ends a context, where attribute values are stored independently
+     * from others.<br>
+     * It must be called after a
+     * [EMAIL PROTECTED] TilesContainer#startContext(PageContext)} call.
+     *
+     * @param context the current request.
+     */
+    void endContext(PageContext context);
 
     /**
      * @param request the current request
      * @param response the current response
-     * @param componentContext the current component context
      * @param definition the requested definition
      * @throws TilesException is processing fails.
      */
-    void prepare(Object request, Object response, ComponentContext 
componentContext,
-               String definition) throws TilesException;
+    void prepare(Object request, Object response, String definition) throws 
TilesException;
 
     /**
      * @param pageContext the current pageContext
      * @param definition the current definition
-     * @param componentContext the current component context
      * @throws TilesException is processing fails.
      */
-    void prepare(PageContext pageContext, ComponentContext componentContext,
-               String definition) throws TilesException;
+    void prepare(PageContext pageContext, String definition) throws 
TilesException;
 
     /**
      * Render the given tiles request
@@ -133,34 +151,6 @@
      */
     void render(PageContext pageContext, ComponentAttribute attribute)
         throws TilesException, IOException;
-
-    /**
-     * Render the given tiles request
-     *
-     * @param request the current request
-     * @param response the current response
-     * @param definition the current definition
-     * @throws TilesException is processing fails.
-     */
-    void render(Object request, Object response, ComponentContext 
componentContext,
-               String definition) throws TilesException;
-
-    /**
-     * @param pageContext the current pageContext.
-     * @param definition the requested definition.
-     * @throws TilesException is processing fails.
-     */
-    void render(PageContext pageContext, ComponentContext componentContext,
-               String definition) throws TilesException;
-
-    /**
-     * Render the given ComponentAttribute.
-     * @param pageContext
-     * @param attribute
-     * @throws TilesException
-     */
-    void render(PageContext pageContext, ComponentContext componentContext,
-               ComponentAttribute attribute) throws TilesException, 
IOException;
 
     /**
      * Determine whether or not the definition exists.

Modified: 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/BasicComponentContext.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/BasicComponentContext.java?view=diff&rev=503719&r1=503718&r2=503719
==============================================================================
--- 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/BasicComponentContext.java
 (original)
+++ 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/BasicComponentContext.java
 Mon Feb  5 07:23:04 2007
@@ -209,23 +209,55 @@
      *         jspException is present in the request.
      */
     static public ComponentContext getContext(TilesRequestContext 
tilesContext) {
-        if 
(tilesContext.getRequestScope().get("javax.servlet.jsp.jspException") != null) {
+        Stack<ComponentContext> contextStack = getContextStack(tilesContext);
+        if (!contextStack.isEmpty()) {
+            return contextStack.peek();
+        } else {
             return null;
         }
-        return (ComponentContext) tilesContext.getRequestScope().get(
-            ComponentConstants.COMPONENT_CONTEXT);
     }
-
+    
     /**
-     * Store component context into request.
+     * Returns the context stack.
      *
-     * @param context      BasicComponentContext to store.
-     * @param tilesContext current Tiles application context.
+     * @param tilesContext The Tiles context object to use.
+     * @return The needed stack of contexts.
      */
-    static public void setContext(ComponentContext context,
-        TilesRequestContext tilesContext) {
-
-        
tilesContext.getRequestScope().put(ComponentConstants.COMPONENT_CONTEXT, 
context);
+    @SuppressWarnings("unchecked")
+    static public Stack<ComponentContext> getContextStack(TilesRequestContext 
tilesContext) {
+        Stack<ComponentContext> contextStack =
+            (Stack<ComponentContext>) tilesContext.getRequestScope().get(
+                ComponentConstants.COMPONENT_CONTEXT_STACK);
+        if (contextStack == null) {
+            contextStack = new Stack<ComponentContext>();
+            
tilesContext.getRequestScope().put(ComponentConstants.COMPONENT_CONTEXT_STACK,
+                    contextStack);
+        }
+        
+        return contextStack;
+    }
+    
+    /**
+     * Pushes a context object in the stack.
+     *
+     * @param context The context to push.
+     * @param tilesContext The Tiles context object to use.
+     */
+    static public void pushContext(ComponentContext context,
+            TilesRequestContext tilesContext) {
+        Stack<ComponentContext> contextStack = getContextStack(tilesContext);
+        contextStack.push(context);
+    }
+    
+    /**
+     * Pops a context object out of the stack
+     *
+     * @param tilesContext The Tiles context object to use.
+     * @return The popped context object.
+     */
+    static public ComponentContext popContext(TilesRequestContext 
tilesContext) {
+        Stack<ComponentContext> contextStack = getContextStack(tilesContext);
+        return contextStack.pop();
     }
 
     public void clear() {

Modified: 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java?view=diff&rev=503719&r1=503718&r2=503719
==============================================================================
--- 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java
 (original)
+++ 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java
 Mon Feb  5 07:23:04 2007
@@ -108,6 +108,36 @@
                        initParameters);
     }
 
+       public ComponentContext startContext(Object request, Object response) {
+        TilesRequestContext tilesContext = getRequestContext(request, 
response);
+               return startContext(tilesContext);
+       }
+
+       public ComponentContext startContext(PageContext context) {
+        TilesRequestContext tilesContext = getRequestContext(context);
+        return startContext(tilesContext);
+       }
+
+    public void endContext(Object request, Object response) {
+        TilesRequestContext tilesContext = getRequestContext(request, 
response);
+        endContext(tilesContext);
+    }
+
+    public void endContext(PageContext context) {
+        TilesRequestContext tilesContext = getRequestContext(context);
+        endContext(tilesContext);
+    }
+    
+    private ComponentContext startContext(TilesRequestContext tilesContext) {
+        ComponentContext context = new BasicComponentContext();
+        BasicComponentContext.pushContext(context, tilesContext);
+        return context;
+    }
+
+    private void endContext(TilesRequestContext tilesContext) {
+        BasicComponentContext.popContext(tilesContext);
+    }
+
     /**
      * Determine whether or not the container has been
      * initialized. Utility method used for methods which
@@ -182,20 +212,16 @@
         return getComponentContext(tilesContext);
     }
 
-       public ComponentContext createComponentContext() {
-               return new BasicComponentContext();
-       }
-
     private ComponentContext getComponentContext(TilesRequestContext 
tilesContext) {
         ComponentContext context = 
BasicComponentContext.getContext(tilesContext);
         if (context == null) {
             context = new BasicComponentContext();
-            BasicComponentContext.setContext(context, tilesContext);
+            BasicComponentContext.pushContext(context, tilesContext);
         }
         return context;
     }
 
-       private TilesRequestContext getRequestContext(Object request, Object 
response) {
+    private TilesRequestContext getRequestContext(Object request, Object 
response) {
         return getContextFactory().createRequestContext(
             getApplicationContext(),
             request,
@@ -262,23 +288,11 @@
     public void prepare(Object request, Object response, String preparer)
         throws TilesException {
         TilesRequestContext requestContext = 
getContextFactory().createRequestContext(
-                getApplicationContext(),
-                request,
-                response
-            );
-        ComponentContext componentContext = 
BasicComponentContext.getContext(requestContext);
-        prepare(requestContext, componentContext, preparer, false);
-    }
-
-    public void prepare(Object request, Object response,
-               ComponentContext componentContext, String preparer)
-        throws TilesException {
-        TilesRequestContext requestContext = 
getContextFactory().createRequestContext(
             getApplicationContext(),
             request,
             response
         );
-        prepare(requestContext, componentContext, preparer, false);
+        prepare(requestContext, preparer, false);
     }
 
     public void prepare(PageContext context, String preparer)
@@ -286,21 +300,10 @@
         TilesRequestContext requestContext = 
getContextFactory().createRequestContext(
             getApplicationContext(), context
         );
-        ComponentContext componentContext = 
BasicComponentContext.getContext(requestContext);
-        prepare(requestContext, componentContext, preparer, false);
+        prepare(requestContext, preparer, false);
     }
 
-    public void prepare(PageContext context,
-               ComponentContext componentContext, String preparer)
-        throws TilesException {
-        TilesRequestContext requestContext = 
getContextFactory().createRequestContext(
-            getApplicationContext(), context
-        );
-        prepare(requestContext, componentContext, preparer, false);
-    }
-
-       private void prepare(TilesRequestContext context,
-                       ComponentContext componentContext, String preparerName, 
boolean ignoreMissing)
+    private void prepare(TilesRequestContext context, String preparerName, 
boolean ignoreMissing)
         throws TilesException {
 
         if (LOG.isDebugEnabled()) {
@@ -316,6 +319,8 @@
             throw new NoSuchPreparerException("Preparer '" + preparerName + " 
not found");
         }
 
+        ComponentContext componentContext = 
BasicComponentContext.getContext(context);
+
         // TODO: Temporary while preparerInstance gets refactored to throw a 
more specific exception.
         try {
             preparer.execute(context, componentContext);
@@ -337,8 +342,7 @@
             request,
             response
         );
-        ComponentContext componentContext = 
getComponentContext(requestContext);
-        render(requestContext, componentContext, definitionName);
+        render(requestContext, definitionName);
     }
 
     public void render(PageContext context, String definitionName)
@@ -346,37 +350,10 @@
         TilesRequestContext requestContext = 
getContextFactory().createRequestContext(
             getApplicationContext(), context
         );
-        ComponentContext componentContext = 
getComponentContext(requestContext);
-        render(requestContext, componentContext, definitionName);
+        render(requestContext, definitionName);
     }
 
-    /**
-     * Render the specified definition.
-     *
-     * @param request the TilesRequestContext
-     * @throws TilesException
-     */
-    public void render(Object request, Object response,
-               ComponentContext componentContext, String definitionName)
-        throws TilesException {
-        TilesRequestContext requestContext = 
getContextFactory().createRequestContext(
-            getApplicationContext(),
-            request,
-            response
-        );
-        render(requestContext, componentContext, definitionName);
-    }
-
-    public void render(PageContext context, ComponentContext componentContext,
-               String definitionName)
-        throws TilesException {
-        TilesRequestContext requestContext = 
getContextFactory().createRequestContext(
-            getApplicationContext(), context
-        );
-        render(requestContext, componentContext, definitionName);
-    }
-
-    private void render(TilesRequestContext request, ComponentContext 
originalContext, String definitionName)
+    private void render(TilesRequestContext request, String definitionName)
         throws TilesException {
 
         if (LOG.isDebugEnabled()) {
@@ -399,13 +376,14 @@
             return;
         }
 
+        ComponentContext originalContext = getComponentContext(request);
         BasicComponentContext subContext = new 
BasicComponentContext(originalContext);
         subContext.addMissing(definition.getAttributes());
-        BasicComponentContext.setContext(subContext, request);
+        BasicComponentContext.pushContext(subContext, request);
 
         try {
             if (definition.getPreparer() != null) {
-                prepare(request, subContext, definition.getPreparer(), true);
+                prepare(request, definition.getPreparer(), true);
             }
 
             String dispatchPath = definition.getTemplate();
@@ -424,19 +402,13 @@
             // TODO it would be nice to make the preparerInstance throw a more 
specific
             throw new TilesException(e.getMessage(), e);
         } finally {
-            BasicComponentContext.setContext(originalContext, request);
+            BasicComponentContext.popContext(request);
         }
     }
 
     public void render(PageContext pageContext, ComponentAttribute attr)
         throws TilesException, IOException {
         ComponentContext context = getComponentContext(pageContext);
-        render(pageContext, context, attr);
-    }
-
-    public void render(PageContext pageContext, ComponentContext 
componentContext,
-               ComponentAttribute attr)
-        throws TilesException, IOException {
         TilesRequestContext request = getRequestContext(pageContext);
 
         String type = calculateType(pageContext, attr);
@@ -449,12 +421,12 @@
         Map<String, ComponentAttribute> attrs = attr.getAttributes();
         if (attrs != null) {
             for (Map.Entry<String, ComponentAttribute> a : attrs.entrySet()) {
-                componentContext.putAttribute(a.getKey(), a.getValue());
+                context.putAttribute(a.getKey(), a.getValue());
             }
         }
 
         if (isDefinition(pageContext, attr)) {
-            render(request, componentContext, attr.getValue().toString());
+            render(request, attr.getValue().toString());
         } else {
             request.include(attr.getValue().toString());
         }

Modified: 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/ComponentConstants.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/ComponentConstants.java?view=diff&rev=503719&r1=503718&r2=503719
==============================================================================
--- 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/ComponentConstants.java
 (original)
+++ 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/ComponentConstants.java
 Mon Feb  5 07:23:04 2007
@@ -32,7 +32,7 @@
     /**
      * Name used to store Tile/Component context.
      */
-    public static final String COMPONENT_CONTEXT = 
"org.apache.tiles.CompContext";
+    public static final String COMPONENT_CONTEXT_STACK = 
"org.apache.tiles.ComponentContext.STACK";
 
     public static final int COMPONENT_SCOPE = 8;
     public static final String LOCALE_KEY = "org.apache.tiles.LOCALE";

Modified: 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/ContainerTagSupport.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/ContainerTagSupport.java?view=diff&rev=503719&r1=503718&r2=503719
==============================================================================
--- 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/ContainerTagSupport.java
 (original)
+++ 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/ContainerTagSupport.java
 Mon Feb  5 07:23:04 2007
@@ -69,7 +69,7 @@
      */
     public int doStartTag() {
         container = TilesAccess.getContainer(pageContext.getServletContext());
-        componentContext = getComponentContext(pageContext);
+        startContext(pageContext);
         return EVAL_BODY_BUFFERED;
     }
     
@@ -88,6 +88,8 @@
                 throw new JspException(message, io);
             }
         }
+        endContext(pageContext);
+        
         return EVAL_PAGE;
     }
 
@@ -106,15 +108,16 @@
         HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
         return (role == null || req.isUserInRole(role));
     }
-
-    protected ComponentContext getComponentContext(PageContext pageContext) {
-       ComponentContext componentContext = null;
-       
+    
+    protected void startContext(PageContext context) {
         if (container != null) {
-               componentContext = container.createComponentContext();
+            componentContext = container.startContext(pageContext);
+        }
+    }
+    
+    protected void endContext(PageContext context) {
+        if (componentContext != null && container != null) {
+            container.endContext(pageContext);
         }
-        
-        return componentContext;
     }
-
 }

Modified: 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertAttributeTag.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertAttributeTag.java?view=diff&rev=503719&r1=503718&r2=503719
==============================================================================
--- 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertAttributeTag.java
 (original)
+++ 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertAttributeTag.java
 Mon Feb  5 07:23:04 2007
@@ -27,6 +27,8 @@
 import org.apache.tiles.TilesException;
 
 import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.PageContext;
+
 import java.io.IOException;
 
 /**
@@ -67,6 +69,18 @@
             throw new TilesException("Attribute '" + name + "' not found.");
         }
 
-        container.render(pageContext, componentContext, attr);
+        container.render(pageContext, attr);
+    }
+
+    @Override
+    protected void startContext(PageContext context) {
+        if (container != null) {
+            componentContext = container.getComponentContext(context);
+        }
+    }
+
+    @Override
+    protected void endContext(PageContext context) {
+        // Do nothing
     }
 }

Modified: 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertDefinitionTag.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertDefinitionTag.java?view=diff&rev=503719&r1=503718&r2=503719
==============================================================================
--- 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertDefinitionTag.java
 (original)
+++ 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertDefinitionTag.java
 Mon Feb  5 07:23:04 2007
@@ -48,6 +48,6 @@
 
 
     protected void render() throws JspException, TilesException {
-        container.render(pageContext, componentContext, name);
+        container.render(pageContext, name);
     }
 }

Modified: 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertTemplateTag.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertTemplateTag.java?view=diff&rev=503719&r1=503718&r2=503719
==============================================================================
--- 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertTemplateTag.java
 (original)
+++ 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/InsertTemplateTag.java
 Mon Feb  5 07:23:04 2007
@@ -22,13 +22,11 @@
 
 package org.apache.tiles.taglib;
 
-import org.apache.tiles.ComponentContext;
 import org.apache.tiles.context.jsp.JspUtil;
 import org.apache.tiles.taglib.RenderTagSupport;
 import org.apache.tiles.taglib.PutTagParent;
 
 import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.PageContext;
 
 /**
  * This is the tag handler for &lt;tiles:insertTemplate&gt;, which includes a
@@ -52,15 +50,4 @@
     protected void render() throws JspException {
         JspUtil.doInclude(pageContext, template, flush);
     }
-
-       @Override
-       protected ComponentContext getComponentContext(PageContext pageContext) 
{
-               ComponentContext componentContext = null;
-               
-               if (container != null) {
-                       componentContext = 
container.getComponentContext(pageContext);
-               }
-               
-               return componentContext;
-       }
 }

Modified: 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/RenderTagSupport.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/RenderTagSupport.java?view=diff&rev=503719&r1=503718&r2=503719
==============================================================================
--- 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/RenderTagSupport.java
 (original)
+++ 
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/taglib/RenderTagSupport.java
 Mon Feb  5 07:23:04 2007
@@ -117,7 +117,7 @@
      */
     protected void execute() throws TilesException, JspException, IOException {
         if (preparer != null) {
-            container.prepare(pageContext, componentContext, preparer);
+            container.prepare(pageContext, preparer);
         }
         render();
     }


Reply via email to