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 <tiles:insertTemplate>, 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();
}