Author: ddewolf Date: Fri Nov 10 11:14:35 2006 New Revision: 473432 URL: http://svn.apache.org/viewvc?view=rev&rev=473432 Log: Refactoring AttributeTag. Removing more logic from tags and putting it into the container
Added: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java (with props) Modified: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContext.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/jsp/JspTilesRequestContext.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/portlet/PortletTilesRequestContext.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/servlet/ServletTilesRequestContext.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/AttributeTag.java struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java Modified: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java?view=diff&rev=473432&r1=473431&r2=473432 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java (original) +++ struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java Fri Nov 10 11:14:35 2006 @@ -21,6 +21,7 @@ import javax.servlet.jsp.PageContext; import java.util.Map; +import java.io.IOException; /** * An encapsulation of the tiles framework. This interface is @@ -96,6 +97,15 @@ * @throws TilesException is processing fails. */ void render(PageContext pageContext, String definition) throws TilesException; + + /** + * Render the given ComponentAttribute. + * @param pageContext + * @param attribute + * @throws TilesException + */ + void render(PageContext pageContext, ComponentAttribute attribute) + throws TilesException, IOException; /** * Determine whether or not the definition exists. Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContext.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContext.java?view=diff&rev=473432&r1=473431&r2=473432 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContext.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContext.java Fri Nov 10 11:14:35 2006 @@ -59,12 +59,12 @@ /** * Dispatches the request to a specified path. */ - void dispatch(String path) throws IOException, Exception; + void dispatch(String path) throws IOException; /** * Includes the response from the specified URL in the current response output. */ - void include(String path) throws IOException, Exception; + void include(String path) throws IOException; /** * Return an immutable Map that maps request parameter names to the first @@ -89,4 +89,14 @@ * @return */ boolean isUserInRole(String role); + + /** + * Get the underlying request. + */ + Object getRequest(); + + /** + * Get the underlying response. + */ + Object getResponse(); } Added: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java?view=auto&rev=473432 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java (added) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java Fri Nov 10 11:14:35 2006 @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.tiles.context; + +import java.util.Map; +import java.util.Locale; +import java.io.IOException; + +/** + * Delegate for ease of customization. + * + * @since Tiles 2.0 + * @version $Rev$ + */ +public class TilesRequestContextWrapper implements TilesRequestContext { + + private TilesRequestContext context; + + + public TilesRequestContextWrapper(TilesRequestContext context) { + this.context = context; + } + + public Map getHeader() { + return context.getHeader(); + } + + public Map getHeaderValues() { + return context.getHeaderValues(); + } + + public Map getRequestScope() { + return context.getRequestScope(); + } + + public Map getSessionScope() { + return context.getSessionScope(); + } + + public void dispatch(String path) throws IOException { + context.dispatch(path); + } + + public void include(String path) throws IOException { + context.include(path); + } + + public Map getParam() { + return context.getParam(); + } + + public Map getParamValues() { + return context.getParamValues(); + } + + public Locale getRequestLocale() { + return context.getRequestLocale(); + } + + public boolean isUserInRole(String role) { + return context.isUserInRole(role); + } + + + public Object getResponse() { + return context.getResponse(); + } + + public Object getRequest() { + return context.getRequest(); + } +} Propchange: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextWrapper.java ------------------------------------------------------------------------------ svn:keywords = Id Author Date Rev Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/jsp/JspTilesRequestContext.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/jsp/JspTilesRequestContext.java?view=diff&rev=473432&r1=473431&r2=473432 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/jsp/JspTilesRequestContext.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/jsp/JspTilesRequestContext.java Fri Nov 10 11:14:35 2006 @@ -30,6 +30,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.JspException; +import java.io.IOException; /** * Context implementation used for executing tiles within a @@ -51,15 +52,16 @@ this.pageContext = pageContext; } - public void dispatch(String path) throws TilesException { + public void dispatch(String path) throws IOException { include(path); } - public void include(String path) throws TilesException { + public void include(String path) throws IOException { try { JspUtil.doInclude(pageContext, path, false); } catch (JspException e) { - throw new TilesException(e); + LOG.error("JSPException while including path '"+path+"'. ", e); + throw new IOException("JSPException while including path '"+path+"'. "+e.getMessage()); } } Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/portlet/PortletTilesRequestContext.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/portlet/PortletTilesRequestContext.java?view=diff&rev=473432&r1=473431&r2=473432 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/portlet/PortletTilesRequestContext.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/portlet/PortletTilesRequestContext.java Fri Nov 10 11:14:35 2006 @@ -203,14 +203,18 @@ return (sessionScope); } - public void dispatch(String path) throws IOException, Exception { + public void dispatch(String path) throws IOException { include(path); } - public void include(String path) throws IOException, Exception { + public void include(String path) throws IOException { if (isRenderRequest) { - context.getRequestDispatcher(path).include((RenderRequest) request, - (RenderResponse) response); + try { + context.getRequestDispatcher(path).include((RenderRequest) request, + (RenderResponse) response); + } catch (PortletException e) { + throw new IOException("PortletException while including path '"+path+"'."+e.getMessage()); + } } } Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/servlet/ServletTilesRequestContext.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/servlet/ServletTilesRequestContext.java?view=diff&rev=473432&r1=473431&r2=473432 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/servlet/ServletTilesRequestContext.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/context/servlet/ServletTilesRequestContext.java Fri Nov 10 11:14:35 2006 @@ -154,22 +154,17 @@ } - public void dispatch(String path) throws IOException, Exception { - RequestDispatcher rd = request.getRequestDispatcher(path); - try { - rd.include(request, response); - } catch (ServletException ex) { - LOG.error("Error including path '"+path+"'.", ex); - throw new Exception("Error including request.", ex); - } + public void dispatch(String path) throws IOException { + include(path); } - public void include(String path) throws IOException, Exception { + public void include(String path) throws IOException{ RequestDispatcher rd = request.getRequestDispatcher(path); try { rd.include(request, response); } catch (ServletException ex) { - throw new Exception("Error including path.", ex); + LOG.error("Servlet Exception while including path", ex); + throw new IOException("Error including path '"+path+"'. " + ex.getMessage()); } } @@ -177,11 +172,11 @@ return request.getLocale(); } - public ServletRequest getRequest() { + public HttpServletRequest getRequest() { return request; } - public ServletResponse getResponse() { + public HttpServletResponse getResponse() { return response; } Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java?view=diff&rev=473432&r1=473431&r2=473432 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java Fri Nov 10 11:14:35 2006 @@ -21,7 +21,11 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.tiles.*; +import org.apache.tiles.ComponentAttribute; +import org.apache.tiles.ComponentContext; +import org.apache.tiles.TilesApplicationContext; +import org.apache.tiles.TilesContainer; +import org.apache.tiles.TilesException; import org.apache.tiles.context.BasicComponentContext; import org.apache.tiles.context.TilesContextFactory; import org.apache.tiles.context.TilesRequestContext; @@ -93,7 +97,7 @@ if (LOG.isInfoEnabled()) { LOG.info("Initializing Tiles2 container. . ."); } - + contextFactory.init(initParameters); definitionsFactory.init(initParameters); @@ -105,13 +109,12 @@ for (String resource : resources) { URL resourceUrl = context.getResource(resource); if (resourceUrl != null) { - if(LOG.isDebugEnabled()) { - LOG.debug("Adding resource '"+resourceUrl+"' to definitions factory."); + if (LOG.isDebugEnabled()) { + LOG.debug("Adding resource '" + resourceUrl + "' to definitions factory."); } definitionsFactory.addSource(resourceUrl); - } - else { - LOG.warn("Unable to find configured definition '"+resource+"'"); + } else { + LOG.warn("Unable to find configured definition '" + resource + "'"); } } } catch (IOException e) { @@ -331,7 +334,7 @@ BasicComponentContext.setContext(subContext, request); try { - if(definition.getPreparer() != null) { + if (definition.getPreparer() != null) { prepare(request, definition.getPreparer(), true); } @@ -343,17 +346,71 @@ } request.dispatch(dispatchPath); + // tiles exception so that it doesn't need to be rethrown. } catch (TilesException e) { throw e; } catch (Exception e) { + LOG.error("Error rendering tile", e); // TODO it would be nice to make the preparerInstance throw a more specific - // tiles exception so that it doesn't need to be rethrown. throw new TilesException(e.getMessage(), e); } finally { BasicComponentContext.setContext(originalContext, request); } } + public void render(PageContext pageContext, ComponentAttribute attr) + throws TilesException, IOException { + ComponentContext context = getComponentContext(pageContext); + TilesRequestContext request = getRequestContext(pageContext); + + String type = calculateType(pageContext, attr); + if ("string".equalsIgnoreCase(type)) { + pageContext.getOut().print(attr.getValue()); + return; + + } + + Map<String, ComponentAttribute> attrs = attr.getAttributes(); + if (attrs != null) { + for (Map.Entry<String, ComponentAttribute> a : attrs.entrySet()) { + context.putAttribute(a.getKey(), a.getValue()); + } + } + + if (isDefinition(pageContext, attr)) { + render(request, attr.getValue().toString()); + } else { + request.include(attr.getValue().toString()); + } + } + + private boolean isDefinition(PageContext pageContext, ComponentAttribute attr) { + return ComponentAttribute.DEFINITION.equals(attr.getType()) || + isValidDefinition(pageContext, attr.getValue().toString()); + } + + private String calculateType(PageContext pageContext, ComponentAttribute attr) throws TilesException { + String type = attr.getType(); + if (type == null) { + Object valueContent = attr.getValue(); + if (valueContent instanceof String) { + String valueString = (String) valueContent; + if (isValidDefinition(pageContext, valueString)) { + type = ComponentAttribute.DEFINITION; + } else if (valueString.startsWith("/")) { + type = ComponentAttribute.TEMPLATE; + } else { + type = ComponentAttribute.STRING; + } + } + if (type == null) { + throw new TilesException("Unrecognized type for attribute value " + + attr.getValue()); + } + } + return type; + } + protected ComponentDefinition getDefinition(String definitionName, TilesRequestContext request) throws DefinitionsFactoryException { ComponentDefinition definition = definitionsFactory.getDefinition(definitionName, request); @@ -361,10 +418,10 @@ } private boolean isPermitted(TilesRequestContext request, String role) { - if(role == null) { + if (role == null) { return true; } - + StringTokenizer st = new StringTokenizer(role, ","); while (st.hasMoreTokens()) { if (request.isUserInRole(st.nextToken())) { Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/AttributeTag.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/AttributeTag.java?view=diff&rev=473432&r1=473431&r2=473432 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/AttributeTag.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/AttributeTag.java Fri Nov 10 11:14:35 2006 @@ -79,53 +79,6 @@ throw new TilesException("Attribute '" + name + "' not found."); } - String type = calculateType(attr); - if ("string".equalsIgnoreCase(type)) { - pageContext.getOut().print(attr.getValue()); - - } else if (isDefinition(attr)) { - if (template != null) { - attr.setValue(template); - } - - Map<String, ComponentAttribute> attrs = attr.getAttributes(); - if (attrs != null) { - for (Map.Entry<String, ComponentAttribute> a : attrs.entrySet()) { - context.putAttribute(a.getKey(), a.getValue()); - } - } - container.render(pageContext, attr.getValue().toString()); - - } else { - JspUtil.doInclude(pageContext, attr.getValue().toString(), flush); - } - } - - private boolean isDefinition(ComponentAttribute attr) { - return ComponentAttribute.DEFINITION.equals(attr.getType()) || - container.isValidDefinition(pageContext, - attr.getValue().toString()); - } - - private String calculateType(ComponentAttribute attr) throws JspException { - String type = attr.getType(); - if (type == null) { - Object valueContent = attr.getValue(); - if (valueContent instanceof String) { - String valueString = (String) valueContent; - if (container.isValidDefinition(pageContext, valueString)) { - type = ComponentAttribute.DEFINITION; - } else if (valueString.startsWith("/")) { - type = ComponentAttribute.TEMPLATE; - } else { - type = ComponentAttribute.STRING; - } - } - if (type == null) { - throw new JspException("Unrecognized type for attribute value " - + attr.getValue()); - } - } - return type; + container.render(pageContext, attr); } } Modified: struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java?view=diff&rev=473432&r1=473431&r2=473432 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java Fri Nov 10 11:14:35 2006 @@ -61,7 +61,7 @@ // nothing or returning null, because they are not needed at all in tests // that use this class. - public void dispatch(String path) throws IOException, Exception { + public void dispatch(String path) throws IOException { } @@ -105,10 +105,18 @@ return null; } - public void include(String path) throws IOException, Exception { + public void include(String path) throws IOException { } public boolean isUserInRole(String role) { return false; + } + + public Object getRequest() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + public Object getResponse() { + return null; //To change body of implemented methods use File | Settings | File Templates. } }