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 2008/11/03 13:43:46 UTC

svn commit: r710046 - in /tiles/framework/trunk: tiles-core/src/main/java/org/apache/tiles/context/ tiles-core/src/test/java/org/apache/tiles/context/ tiles-core/src/test/java/org/apache/tiles/mock/ tiles-jsp/src/main/java/org/apache/tiles/jsp/context/...

Author: apetrelli
Date: Mon Nov  3 04:43:44 2008
New Revision: 710046

URL: http://svn.apache.org/viewvc?rev=710046&view=rev
Log:
TILES-329
TilesContextFactory now is re-evaluated by passing the parent TilesContextFactory to all children, in particular from a ChainedTilesContextFactory to all elements of the chain.
Modified JspTilesContextFactory accordingly.

Modified:
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesContextFactory.java
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/context/ChainedTilesContextFactoryTest.java
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/mock/RepeaterTilesContextFactory.java
    tiles/framework/trunk/tiles-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesContextFactory.java
    tiles/framework/trunk/tiles-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesRequestContext.java
    tiles/framework/trunk/tiles-servlet/src/main/java/org/apache/tiles/servlet/context/ServletTilesRequestContext.java
    tiles/framework/trunk/tiles-servlet/src/main/java/org/apache/tiles/servlet/context/ServletUtil.java

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesContextFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesContextFactory.java?rev=710046&r1=710045&r2=710046&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesContextFactory.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesContextFactory.java Mon Nov  3 04:43:44 2008
@@ -24,6 +24,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.tiles.TilesApplicationContext;
+import org.apache.tiles.awareness.TilesContextFactoryAware;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -70,6 +71,7 @@
      */
     public void setFactories(List<TilesContextFactory> factories) {
         this.factories = factories;
+        injectParentTilesContextFactory();
     }
 
     /** {@inheritDoc} */
@@ -116,6 +118,7 @@
                                 + " default constructor", e);
             }
         }
+        injectParentTilesContextFactory();
     }
 
     /** {@inheritDoc} */
@@ -153,4 +156,15 @@
 
         return retValue;
     }
+
+    /**
+     * Injects this context factory to all chained context factories.
+     */
+    protected void injectParentTilesContextFactory() {
+        for (TilesContextFactory factory : factories) {
+            if (factory instanceof TilesContextFactoryAware) {
+                ((TilesContextFactoryAware) factory).setContextFactory(this);
+            }
+        }
+    }
 }

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java?rev=710046&r1=710045&r2=710046&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java Mon Nov  3 04:43:44 2008
@@ -49,6 +49,16 @@
         this.context = context;
     }
 
+    /**
+     * Returns the wrapped Tiles request.
+     *
+     * @return The wrapped Tiles request.
+     * @since 2.1.1
+     */
+    public TilesRequestContext getWrappedRequest() {
+        return context;
+    }
+
     /** {@inheritDoc} */
     public Map<String, String> getHeader() {
         return context.getHeader();

Modified: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/context/ChainedTilesContextFactoryTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/context/ChainedTilesContextFactoryTest.java?rev=710046&r1=710045&r2=710046&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/context/ChainedTilesContextFactoryTest.java (original)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/context/ChainedTilesContextFactoryTest.java Mon Nov  3 04:43:44 2008
@@ -20,7 +20,9 @@
  */
 package org.apache.tiles.context;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import junit.framework.TestCase;
@@ -55,10 +57,8 @@
 
     /**
      * Tests the initialization method.
-     *
-     * @throws Exception If something goes wrong during testing.
      */
-    public void testInit() throws Exception {
+    public void testInit() {
         Map<String, String> config = new HashMap<String, String>();
         config.put(ChainedTilesContextFactory.FACTORY_CLASS_NAMES,
                 "this.is.not.a.class.Name,"
@@ -66,6 +66,21 @@
         ChainedTilesContextFactory factory = new ChainedTilesContextFactory();
         factory.init(config);
         TilesRequestContext context = factory.createRequestContext(appContext, requestContext);
-        assertNotNull("The request context cannot be null", context);
+        assertNotNull("The request context is not correct",
+                context == requestContext);
+    }
+
+    /**
+     * Tests {@link ChainedTilesContextFactory#setFactories(java.util.List)}.
+     */
+    public void testSetFactories() {
+        ChainedTilesContextFactory factory = new ChainedTilesContextFactory();
+        List<TilesContextFactory> factories = new ArrayList<TilesContextFactory>();
+        RepeaterTilesContextFactory repFactory = new RepeaterTilesContextFactory();
+        factories.add(repFactory);
+        factory.setFactories(factories);
+        TilesRequestContext context = factory.createRequestContext(appContext, requestContext);
+        assertNotNull("The request context is not correct",
+                context == requestContext);
     }
 }

Modified: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/mock/RepeaterTilesContextFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/mock/RepeaterTilesContextFactory.java?rev=710046&r1=710045&r2=710046&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/mock/RepeaterTilesContextFactory.java (original)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/mock/RepeaterTilesContextFactory.java Mon Nov  3 04:43:44 2008
@@ -26,6 +26,7 @@
 import java.util.Set;
 
 import org.apache.tiles.TilesApplicationContext;
+import org.apache.tiles.awareness.TilesContextFactoryAware;
 import org.apache.tiles.context.TilesContextFactory;
 import org.apache.tiles.context.TilesRequestContext;
 
@@ -36,7 +37,8 @@
  *
  * @version $Rev$ $Date$
  */
-public class RepeaterTilesContextFactory implements TilesContextFactory {
+public class RepeaterTilesContextFactory implements TilesContextFactory,
+        TilesContextFactoryAware {
 
     /**
      * The application context.
@@ -44,6 +46,11 @@
     private TilesApplicationContext applicationContext;
 
     /**
+     * The parent context factory.
+     */
+    private TilesContextFactory parent;
+
+    /**
      * Constructor.
      */
     public RepeaterTilesContextFactory() {
@@ -60,6 +67,11 @@
     }
 
     /** {@inheritDoc} */
+    public void setContextFactory(TilesContextFactory contextFactory) {
+        this.parent = contextFactory;
+    }
+
+    /** {@inheritDoc} */
     public TilesApplicationContext createApplicationContext(Object context) {
         if (context instanceof TilesApplicationContext) {
             return (TilesApplicationContext) context;
@@ -71,6 +83,9 @@
     /** {@inheritDoc} */
     public TilesRequestContext createRequestContext(
             TilesApplicationContext context, Object... requestItems) {
+        if (parent == null) {
+            throw new RuntimeException("The parent is null");
+        }
         TilesRequestContext retValue = null;
         if (requestItems.length > 0) {
             retValue = (TilesRequestContext) requestItems[0];

Modified: tiles/framework/trunk/tiles-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesContextFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesContextFactory.java?rev=710046&r1=710045&r2=710046&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesContextFactory.java (original)
+++ tiles/framework/trunk/tiles-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesContextFactory.java Mon Nov  3 04:43:44 2008
@@ -22,11 +22,17 @@
 package org.apache.tiles.jsp.context;
 
 import org.apache.tiles.TilesApplicationContext;
+import org.apache.tiles.awareness.TilesContextFactoryAware;
 import org.apache.tiles.context.TilesContextFactory;
 import org.apache.tiles.context.TilesRequestContext;
 import org.apache.tiles.servlet.context.ServletTilesApplicationContext;
+import org.apache.tiles.servlet.context.ServletTilesRequestContext;
 
 import javax.servlet.ServletContext;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.servlet.jsp.PageContext;
 import java.util.Map;
 
@@ -35,13 +41,24 @@
  *
  * @version $Rev$ $Date$
  */
-public class JspTilesContextFactory implements TilesContextFactory {
+public class JspTilesContextFactory implements TilesContextFactory, TilesContextFactoryAware {
+
+    /**
+     * Parent Tiles context factory.
+     */
+    private TilesContextFactory parent;
 
     /** {@inheritDoc} */
     public void init(Map<String, String> configParameters) {
     }
 
     /** {@inheritDoc} */
+    public void setContextFactory(TilesContextFactory contextFactory) {
+        parent = contextFactory;
+    }
+
+    /** {@inheritDoc} */
+    @Deprecated
     public TilesApplicationContext createApplicationContext(Object context) {
         if (context instanceof ServletContext) {
             ServletContext servletContext = (ServletContext) context;
@@ -55,7 +72,19 @@
     public TilesRequestContext createRequestContext(TilesApplicationContext context,
                                                     Object... requestItems) {
         if (requestItems.length == 1 && requestItems[0] instanceof PageContext) {
-            return new JspTilesRequestContext(context, (PageContext) requestItems[0]);
+            PageContext pageContext = (PageContext) requestItems[0];
+            ServletRequest request = pageContext.getRequest();
+            ServletResponse response = pageContext.getResponse();
+            TilesRequestContext enclosedRequest;
+            if (parent != null) {
+                enclosedRequest = parent.createRequestContext(context, request,
+                        response);
+            } else {
+                enclosedRequest = new ServletTilesRequestContext(context,
+                        (HttpServletRequest) request,
+                        (HttpServletResponse) response);
+            }
+            return new JspTilesRequestContext(enclosedRequest, pageContext);
         }
 
         return null;

Modified: tiles/framework/trunk/tiles-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesRequestContext.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesRequestContext.java?rev=710046&r1=710045&r2=710046&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesRequestContext.java (original)
+++ tiles/framework/trunk/tiles-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesRequestContext.java Mon Nov  3 04:43:44 2008
@@ -20,9 +20,10 @@
  */
 package org.apache.tiles.jsp.context;
 
-import org.apache.tiles.TilesApplicationContext;
 import org.apache.tiles.context.TilesRequestContext;
+import org.apache.tiles.context.TilesRequestContextWrapper;
 import org.apache.tiles.servlet.context.ServletTilesRequestContext;
+import org.apache.tiles.servlet.context.ServletUtil;
 
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
@@ -37,7 +38,7 @@
  *
  * @version $Rev$ $Date$
  */
-public class JspTilesRequestContext extends ServletTilesRequestContext
+public class JspTilesRequestContext extends TilesRequestContextWrapper
     implements TilesRequestContext {
 
     /**
@@ -53,14 +54,12 @@
     /**
      * Constructor.
      *
-     * @param applicationContext The Tiles application context.
+     * @param enclosedRequest The request that is wrapped here.
      * @param pageContext The page context to use.
      */
-    public JspTilesRequestContext(TilesApplicationContext applicationContext,
+    public JspTilesRequestContext(TilesRequestContext enclosedRequest,
             PageContext pageContext) {
-        super(applicationContext,
-            (HttpServletRequest) pageContext.getRequest(),
-            (HttpServletResponse) pageContext.getResponse());
+        super(enclosedRequest);
         this.pageContext = pageContext;
     }
 
@@ -70,14 +69,13 @@
      * @param context The servlet context to use.
      * @param pageContext The page context to use.
      * @deprecated Use
-     * {@link #JspTilesRequestContext(TilesApplicationContext, PageContext)}.
+     * {@link #JspTilesRequestContext(TilesRequestContext, PageContext)}.
      */
     @Deprecated
     public JspTilesRequestContext(ServletContext context, PageContext pageContext) {
-        super(context,
-            (HttpServletRequest) pageContext.getRequest(),
-            (HttpServletResponse) pageContext.getResponse());
-        this.pageContext = pageContext;
+        this(new ServletTilesRequestContext(context,
+                (HttpServletRequest) pageContext.getRequest(),
+                (HttpServletResponse) pageContext.getResponse()), pageContext);
     }
 
     /**
@@ -97,7 +95,7 @@
         try {
             pageContext.include(path, false);
         } catch (ServletException e) {
-            throw wrapServletException(e, "JSPException including path '"
+            throw ServletUtil.wrapServletException(e, "JSPException including path '"
                     + path + "'.");
         }
     }

Modified: tiles/framework/trunk/tiles-servlet/src/main/java/org/apache/tiles/servlet/context/ServletTilesRequestContext.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-servlet/src/main/java/org/apache/tiles/servlet/context/ServletTilesRequestContext.java?rev=710046&r1=710045&r2=710046&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-servlet/src/main/java/org/apache/tiles/servlet/context/ServletTilesRequestContext.java (original)
+++ tiles/framework/trunk/tiles-servlet/src/main/java/org/apache/tiles/servlet/context/ServletTilesRequestContext.java Mon Nov  3 04:43:44 2008
@@ -33,7 +33,6 @@
 import org.apache.tiles.TilesApplicationContext;
 import org.apache.tiles.context.TilesApplicationContextWrapper;
 import org.apache.tiles.context.TilesRequestContext;
-import org.apache.tiles.util.TilesIOException;
 
 /**
  * Servlet-based implementation of the TilesApplicationContext interface.
@@ -223,7 +222,7 @@
         try {
             rd.forward(request, response);
         } catch (ServletException ex) {
-            throw wrapServletException(ex, "ServletException including path '"
+            throw ServletUtil.wrapServletException(ex, "ServletException including path '"
                     + path + "'.");
         }
     }
@@ -242,7 +241,7 @@
         try {
             rd.include(request, response);
         } catch (ServletException ex) {
-            throw wrapServletException(ex, "ServletException including path '"
+            throw ServletUtil.wrapServletException(ex, "ServletException including path '"
                     + path + "'.");
         }
     }
@@ -306,24 +305,20 @@
     }
 
     /**
-     * Wraps a ServletException to create an IOException with the root cause if present.
+     * Wraps a ServletException to create an IOException with the root cause if
+     * present.
      *
      * @param ex The exception to wrap.
      * @param message The message of the exception.
      * @return The wrapped exception.
      * @since 2.0.6
+     * @deprecated Use
+     * {@link ServletUtil#wrapServletException(ServletException,String)}
+     * instead.
      */
-    protected IOException wrapServletException(ServletException ex, String message) {
-        IOException retValue;
-        Throwable rootCause = ex.getRootCause();
-        if (rootCause != null) {
-            // Replace the ServletException with an IOException, with the root
-            // cause of the first as the cause of the latter.
-            retValue = new TilesIOException(message, rootCause);
-        } else {
-            retValue = new TilesIOException(message, ex);
-        }
-
-        return retValue;
+    @Deprecated
+    protected IOException wrapServletException(ServletException ex,
+            String message) {
+        return ServletUtil.wrapServletException(ex, message);
     }
 }

Modified: tiles/framework/trunk/tiles-servlet/src/main/java/org/apache/tiles/servlet/context/ServletUtil.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-servlet/src/main/java/org/apache/tiles/servlet/context/ServletUtil.java?rev=710046&r1=710045&r2=710046&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-servlet/src/main/java/org/apache/tiles/servlet/context/ServletUtil.java (original)
+++ tiles/framework/trunk/tiles-servlet/src/main/java/org/apache/tiles/servlet/context/ServletUtil.java Mon Nov  3 04:43:44 2008
@@ -21,13 +21,17 @@
 
 package org.apache.tiles.servlet.context;
 
+import java.io.IOException;
+
 import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.tiles.TilesContainer;
 import org.apache.tiles.access.TilesAccess;
 import org.apache.tiles.impl.NoSuchContainerException;
+import org.apache.tiles.util.TilesIOException;
 
 
 /**
@@ -141,4 +145,27 @@
 
         return container;
     }
+
+    /**
+     * Wraps a ServletException to create an IOException with the root cause if present.
+     *
+     * @param ex The exception to wrap.
+     * @param message The message of the exception.
+     * @return The wrapped exception.
+     * @since 2.1.1
+     */
+    public static IOException wrapServletException(ServletException ex,
+            String message) {
+        IOException retValue;
+        Throwable rootCause = ex.getRootCause();
+        if (rootCause != null) {
+            // Replace the ServletException with an IOException, with the root
+            // cause of the first as the cause of the latter.
+            retValue = new TilesIOException(message, rootCause);
+        } else {
+            retValue = new TilesIOException(message, ex);
+        }
+
+        return retValue;
+    }
 }