You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by dg...@apache.org on 2005/06/14 23:59:17 UTC
svn commit: r190662 [2/6] - in /struts/sandbox/trunk/tiles: ./ core-library/
core-library/src/ core-library/src/conf/ core-library/src/java/
core-library/src/java/org/ core-library/src/java/org/apache/
core-library/src/java/org/apache/taglib/
core-library/src/java/org/apache/taglib/tiles/
core-library/src/java/org/apache/taglib/tiles/doc-files/
core-library/src/java/org/apache/taglib/tiles/util/
core-library/src/java/org/apache/tiles/
core-library/src/java/org/apache/tiles/beans/
core-library/src/java/org/apache/tiles/definition/
core-library/src/java/org/apache/tiles/doc-files/
core-library/src/java/org/apache/tiles/servlets/
core-library/src/java/org/apache/tiles/xmlDefinition/
core-library/src/java/org/apache/util/ core-library/src/test/ examples/
examples/simple/ examples/simple/WEB-INF/ examples/simple/WEB-INF/lib/
examples/simple/graphics/ examples/simple/graphics/flags/
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/InitDefinitionsTag.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/InitDefinitionsTag.java?rev=190662&view=auto
==============================================================================
--- struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/InitDefinitionsTag.java (added)
+++ struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/InitDefinitionsTag.java Tue Jun 14 14:59:13 2005
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * Licensed 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.taglib.tiles;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.TagSupport;
+
+import org.apache.tiles.DefinitionsFactory;
+import org.apache.tiles.DefinitionsFactoryConfig;
+import org.apache.tiles.DefinitionsFactoryException;
+import org.apache.tiles.TilesUtil;
+
+ /**
+ * Init definitions factory.
+ */
+public class InitDefinitionsTag extends TagSupport implements ComponentConstants {
+
+
+ private String filename = null;
+ private String classname = null;
+
+ /**
+ * Default constructor.
+ */
+ public InitDefinitionsTag() {
+ super();
+ }
+
+ /**
+ * Release all allocated resources.
+ */
+ public void release() {
+
+ super.release();
+ filename = null;
+ }
+
+ /**
+ * Set file.
+ */
+ public void setFile(String name){
+ this.filename = name;
+ }
+
+ /**
+ * Set classname.
+ */
+ public void setClassname(String classname){
+ this.classname = classname;
+ }
+
+ /**
+ * Do start tag.
+ */
+ public int doStartTag() throws JspException
+ {
+ DefinitionsFactory factory = TilesUtil.getDefinitionsFactory(pageContext.getRequest(),pageContext.getServletContext());
+ if(factory != null )
+ return SKIP_BODY;
+
+ DefinitionsFactoryConfig factoryConfig = new DefinitionsFactoryConfig();
+ factoryConfig.setFactoryClassname( classname );
+ factoryConfig.setDefinitionConfigFiles( filename );
+
+ try
+ {
+ factory = TilesUtil.createDefinitionsFactory(pageContext.getServletContext(), factoryConfig);
+ }
+ catch( DefinitionsFactoryException ex )
+ {
+ ex.printStackTrace();
+ throw new JspException( ex.getMessage() + " See console for details" );
+ }
+ return SKIP_BODY;
+ }
+
+ /**
+ * Do end tag.
+ */
+ public int doEndTag() throws JspException {
+ return EVAL_PAGE;
+ }
+
+}
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/InsertTag.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/InsertTag.java?rev=190662&view=auto
==============================================================================
--- struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/InsertTag.java (added)
+++ struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/InsertTag.java Tue Jun 14 14:59:13 2005
@@ -0,0 +1,1031 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * Licensed 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.taglib.tiles;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.PageContext;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.tiles.Globals;
+import org.apache.taglib.tiles.util.TagUtils;
+import org.apache.tiles.AttributeDefinition;
+import org.apache.tiles.ComponentContext;
+import org.apache.tiles.ComponentDefinition;
+import org.apache.tiles.Controller;
+import org.apache.tiles.DefinitionAttribute;
+import org.apache.tiles.DefinitionNameAttribute;
+import org.apache.tiles.DefinitionsFactoryException;
+import org.apache.tiles.DirectStringAttribute;
+import org.apache.tiles.FactoryNotFoundException;
+import org.apache.tiles.NoSuchDefinitionException;
+import org.apache.tiles.TilesUtil;
+
+/**
+ * This is the tag handler for <tiles:insert>, which includes
+ * a template. The tag's body content consists of <tiles:put>
+ * tags, which are accessed by <tiles:get> in the template.
+ *
+ * @author David Geary
+ * @author Cedric Dumoulin
+ * @version $Revision: 1.20 $ $Date: 2003/07/07 23:40:12 $
+ */
+public class InsertTag
+ extends DefinitionTagSupport
+ implements PutTagParent, ComponentConstants, PutListTagParent {
+
+ /**
+ * The role delimiter.
+ * @deprecated This will be removed in a release after Struts 1.2.
+ */
+ public static final String ROLE_DELIMITER = ",";
+
+ /**
+ * Commons Logging instance.
+ */
+ protected static Log log = LogFactory.getLog(InsertTag.class);
+
+ /* JSP Tag attributes */
+
+ /**
+ * Flush attribute value.
+ */
+ protected boolean flush = true;
+
+ /**
+ * Name to insert.
+ */
+ protected String name = null;
+
+ /**
+ * Name of attribute from which to read page name to include.
+ */
+ protected String attribute = null;
+
+ /**
+ * Name of bean used as entity to include.
+ */
+ protected String beanName = null;
+
+ /**
+ * Name of bean property, if any.
+ */
+ protected String beanProperty = null;
+
+ /**
+ * Scope of bean, if any.
+ */
+ protected String beanScope = null;
+
+ /**
+ * Are errors ignored. This is the property for attribute 'ignore'.
+ * Default value is false, which throw an exception.
+ * Only 'attribute not found' errors are ignored.
+ */
+ protected boolean isErrorIgnored = false;
+
+ /**
+ * Name of component instance to include.
+ */
+ protected String definitionName = null;
+
+ /* Internal properties */
+ /**
+ * Does the end tag need to be processed.
+ * Default value is true. Boolean set in case of ignored errors.
+ */
+ protected boolean processEndTag = true;
+
+ /**
+ * Current component context.
+ */
+ protected ComponentContext cachedCurrentContext;
+
+ /**
+ * Final handler of tag methods.
+ */
+ protected TagHandler tagHandler = null;
+
+ /**
+ * Trick to allows inner classes to access pageContext.
+ */
+ protected PageContext pageContext = null;
+
+ /**
+ * Reset member values for reuse. This method calls super.release(),
+ * which invokes TagSupport.release(), which typically does nothing.
+ */
+ public void release() {
+
+ super.release();
+ attribute = null;
+ beanName = null;
+ beanProperty = null;
+ beanScope = null;
+
+ definitionName = null;
+ flush = true;
+ name = null;
+ page = null;
+ role = null;
+ isErrorIgnored = false;
+
+ releaseInternal();
+ }
+
+ /**
+ * Reset internal member values for reuse.
+ */
+ protected void releaseInternal() {
+ cachedCurrentContext = null;
+ processEndTag = true;
+ // pageContext = null; // orion doesn't set it between two tags
+ tagHandler = null;
+ }
+
+ /**
+ * Set the current page context.
+ * Called by the page implementation prior to doStartTag().
+ * <p>
+ * Needed to allow inner classes to access pageContext.
+ */
+ public void setPageContext(PageContext pc) {
+ this.pageContext = pc;
+ super.setPageContext(pc);
+ }
+
+ /**
+ * Get the pageContext property.
+ */
+ public PageContext getPageContext() {
+ return pageContext;
+ }
+
+ /**
+ * Set name.
+ */
+ public void setName(String value) {
+ this.name = value;
+ }
+
+ /**
+ * Get name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set component.
+ */
+ public void setComponent(String name) {
+ this.page = name;
+ }
+
+ /**
+ * Set definition.
+ */
+ public void setDefinition(String name) {
+ this.definitionName = name;
+ }
+
+ /**
+ * Get definition name.
+ */
+ public String getDefinitionName() {
+ return definitionName;
+ }
+
+ /**
+ * Set attribute.
+ */
+ public void setAttribute(String value) {
+ this.attribute = value;
+ }
+
+ /**
+ * Set bean name.
+ */
+ public void setBeanName(String value) {
+ this.beanName = value;
+ }
+
+ /**
+ * Get bean name.
+ */
+ public String getBeanName() {
+ return beanName;
+ }
+
+ /**
+ * Set bean property.
+ */
+ public void setBeanProperty(String value) {
+ this.beanProperty = value;
+ }
+
+ /**
+ * Get bean property.
+ */
+ public String getBeanProperty() {
+ return beanProperty;
+ }
+
+ /**
+ * Set bean scope.
+ */
+ public void setBeanScope(String value) {
+ this.beanScope = value;
+ }
+
+ /**
+ * Get bean scope.
+ */
+ public String getBeanScope() {
+ return beanScope;
+ }
+
+ /**
+ * Set flush.
+ */
+ public void setFlush(boolean flush) {
+ this.flush = flush;
+ }
+
+ /**
+ * Get flush.
+ */
+ public boolean getFlush() {
+ return flush;
+ }
+
+ /**
+ * Set flush.
+ * Method added for compatibility with JSP1.1
+ */
+ public void setFlush(String flush) {
+ this.flush = (Boolean.valueOf(flush).booleanValue());
+ }
+
+ /**
+ * Set ignore.
+ */
+ public void setIgnore(boolean ignore) {
+ this.isErrorIgnored = ignore;
+ }
+
+ /**
+ * Get ignore.
+ */
+ public boolean getIgnore() {
+ return isErrorIgnored;
+ }
+
+ /////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Add a body attribute.
+ * Erase any attribute with same name previously set.
+ */
+ public void putAttribute(String name, Object value) {
+ tagHandler.putAttribute(name, value);
+ }
+
+ /**
+ * Process nested ≶put> tag.
+ * Method calls by nested ≶put> tags.
+ * Nested list is added to current list.
+ * If role is defined, it is checked immediately.
+ */
+ public void processNestedTag(PutTag nestedTag) throws JspException {
+ // Check role
+ HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
+ String role = nestedTag.getRole();
+ if (role != null && !request.isUserInRole(role)) {
+ // not allowed : skip attribute
+ return;
+ }
+
+ putAttribute(nestedTag.getName(), nestedTag.getRealValue());
+ }
+
+ /**
+ * Process nested ≶putList> tag.
+ * Method calls by nested ≶putList> tags.
+ * Nested list is added to sub-component attributes
+ * If role is defined, it is checked immediately.
+ */
+ public void processNestedTag(PutListTag nestedTag) throws JspException {
+ // Check role
+ HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
+ String role = nestedTag.getRole();
+ if (role != null && !request.isUserInRole(role)) {
+ // not allowed : skip attribute
+ return;
+ }
+
+ // Check if a name is defined
+ if (nestedTag.getName() == null) {
+ throw new JspException("Error - PutList : attribute name is not defined. It is mandatory as the list is added as attribute of 'insert'.");
+ }
+
+ // now add attribute to enclosing parent (i.e. : this object).
+ putAttribute(nestedTag.getName(), nestedTag.getList());
+ }
+
+ /**
+ * Method calls by nested ≶putList> tags.
+ * A new list is added to current insert object.
+ */
+ public void putAttribute(PutListTag nestedTag) throws JspException {
+ // Check role
+ HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
+ String role = nestedTag.getRole();
+ if (role != null && !request.isUserInRole(role)) {
+ // not allowed : skip attribute
+ return;
+ }
+
+ putAttribute(nestedTag.getName(), nestedTag.getList());
+ }
+
+ /**
+ * Get current component context.
+ */
+ private ComponentContext getCurrentContext() {
+ if (cachedCurrentContext == null) {
+ cachedCurrentContext =
+ (ComponentContext) pageContext.getAttribute(
+ ComponentConstants.COMPONENT_CONTEXT,
+ PageContext.REQUEST_SCOPE);
+ }
+
+ return cachedCurrentContext;
+ }
+
+ /**
+ * Get instantiated Controller.
+ * Return controller denoted by controllerType, or <code>null</code> if controllerType
+ * is null.
+ * @throws JspException If controller can't be created.
+ */
+ private Controller getController() throws JspException {
+ if (controllerType == null) {
+ return null;
+ }
+
+ try {
+ return ComponentDefinition.createController(
+ controllerName,
+ controllerType);
+
+ } catch (InstantiationException ex) {
+ throw new JspException(ex.getMessage());
+ }
+ }
+
+ /**
+ * Process the start tag by checking tag's attributes and creating appropriate handler.
+ * Possible handlers :
+ * <ul>
+ * <li> URL
+ * <li> definition
+ * <li> direct String
+ * </ul>
+ * Handlers also contain sub-component context.
+ */
+ public int doStartTag() throws JspException {
+ // Check role immediatly to avoid useless stuff.
+ // In case of insertion of a "definition", definition's role still checked later.
+ // This lead to a double check of "role" ;-(
+ HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
+ if (role != null && !request.isUserInRole(role)) {
+ processEndTag = false;
+ return SKIP_BODY;
+ }
+
+ try {
+ tagHandler = createTagHandler();
+
+ } catch (JspException e) {
+ if (isErrorIgnored) {
+ processEndTag = false;
+ return SKIP_BODY;
+ } else {
+ throw e;
+ }
+ }
+
+ return tagHandler.doStartTag();
+ }
+
+ /**
+ * Process the end tag by including the template.
+ * Simply call the handler doEndTag
+ */
+ public int doEndTag() throws JspException {
+ if (!processEndTag) {
+ releaseInternal();
+ return EVAL_PAGE;
+ }
+
+ int res = tagHandler.doEndTag();
+ // Reset properties used by object, in order to be able to reuse object.
+ releaseInternal();
+ return res;
+ }
+
+ /**
+ * Process tag attribute and create corresponding tag handler.
+ */
+ public TagHandler createTagHandler() throws JspException {
+ // Check each tag attribute.
+ // page Url attribute must be the last checked because it can appears concurrently
+ // with others attributes.
+ if (definitionName != null) {
+ return processDefinitionName(definitionName);
+ } else if (attribute != null) {
+ return processAttribute(attribute);
+ } else if (beanName != null) {
+ return processBean(beanName, beanProperty, beanScope);
+ } else if (name != null) {
+ return processName(name);
+ } else if (page != null) {
+ return processUrl(page);
+ } else {
+ throw new JspException("Error - Tag Insert : At least one of the following attribute must be defined : template|page|attribute|definition|name|beanName. Check tag syntax");
+ }
+ }
+
+ /**
+ * Process an object retrieved as a bean or attribute.
+ * Object can be a typed attribute, a String, or anything else.
+ * If typed attribute, use associated type.
+ * Otherwise, apply toString() on object, and use returned string as a name.
+ * @throws JspException - Throws by underlying nested call to
+ * processDefinitionName()
+ */
+ public TagHandler processObjectValue(Object value) throws JspException {
+ // First, check if value is one of the Typed Attribute
+ if (value instanceof AttributeDefinition) {
+ // We have a type => return appropriate IncludeType
+ return processTypedAttribute((AttributeDefinition) value);
+
+ } else if (value instanceof ComponentDefinition) {
+ return processDefinition((ComponentDefinition) value);
+ }
+
+ // Value must denote a valid String
+ return processAsDefinitionOrURL(value.toString());
+ }
+
+ /**
+ * Process name.
+ * Search in following order :
+ * <ul>
+ * <li>Component context - if found, process it as value.</li>
+ * <li>definitions factory</li>
+ * <li>URL</li>
+ * <li></li>
+ * </ul>
+ *
+ * @return appropriate tag handler.
+ * @throws JspException - Throws by underlying nested call to
+ * processDefinitionName()
+ */
+ public TagHandler processName(String name) throws JspException {
+ Object attrValue = getCurrentContext().getAttribute(name);
+
+ if (attrValue != null) {
+ return processObjectValue(attrValue);
+ }
+
+ return processAsDefinitionOrURL(name);
+ }
+
+ /**
+ * Process the url.
+ * @throws JspException If failed to create controller
+ */
+ public TagHandler processUrl(String url) throws JspException {
+ return new InsertHandler(url, role, getController());
+ }
+
+ /**
+ * Process tag attribute "definition".
+ * First, search definition in the factory, then create handler from this definition.
+ * @param name Name of the definition.
+ * @return Appropriate TagHandler.
+ * @throws JspException- NoSuchDefinitionException No Definition found for name.
+ * @throws JspException- FactoryNotFoundException Can't find Definitions factory.
+ * @throws JspException- DefinedComponentFactoryException General error in factory.
+ * @throws JspException InstantiationException Can't create requested controller
+ */
+ protected TagHandler processDefinitionName(String name) throws JspException {
+
+ try {
+ ComponentDefinition definition =
+ TilesUtil.getDefinition(
+ name,
+ (HttpServletRequest) pageContext.getRequest(),
+ pageContext.getServletContext());
+
+ if (definition == null) { // is it possible ?
+ throw new NoSuchDefinitionException();
+ }
+
+ return processDefinition(definition);
+
+ } catch (NoSuchDefinitionException ex) {
+ throw new JspException(
+ "Error - Tag Insert : Can't get definition '"
+ + definitionName
+ + "'. Check if this name exist in definitions factory.");
+
+ } catch (FactoryNotFoundException ex) {
+ log.info("FACTORY NOT FOUND");
+ String msg = (String)pageContext.getServletContext()
+ .getAttribute(Globals.TILES_INIT_EXCEPTION);
+ throw new JspException(msg);
+
+ } catch (DefinitionsFactoryException ex) {
+ log.info("DEFINITIONS FACTORY EXCEPTION");
+ if (log.isDebugEnabled()) {
+ ex.printStackTrace();
+ }
+
+ // Save exception to be able to show it later
+ pageContext.setAttribute(
+ Globals.EXCEPTION_KEY,
+ ex,
+ PageContext.REQUEST_SCOPE);
+ throw new JspException(ex.getMessage());
+ }
+ }
+
+ /**
+ * End of Process tag attribute "definition".
+ * Overload definition with tag attributes "template" and "role".
+ * Then, create appropriate tag handler.
+ * @param definition Definition to process.
+ * @return Appropriate TagHandler.
+ * @throws JspException InstantiationException Can't create requested controller
+ */
+ protected TagHandler processDefinition(ComponentDefinition definition)
+ throws JspException {
+ // Declare local variable in order to not change Tag attribute values.
+ String role = this.role;
+ String page = this.page;
+ Controller controller = null;
+
+ try {
+ controller = definition.getOrCreateController();
+
+ // Overload definition with tag's template and role.
+ if (role == null) {
+ role = definition.getRole();
+ }
+
+ if (page == null) {
+ page = definition.getTemplate();
+ }
+
+ if (controllerName != null) {
+ controller =
+ ComponentDefinition.createController(
+ controllerName,
+ controllerType);
+ }
+
+ // Can check if page is set
+ return new InsertHandler(
+ definition.getAttributes(),
+ page,
+ role,
+ controller);
+
+ } catch (InstantiationException ex) {
+ throw new JspException(ex.getMessage());
+ }
+ }
+
+ /**
+ * Process a bean.
+ * Get bean value, eventually using property and scope. Found value is process by processObjectValue().
+ * @param beanName Name of the bean
+ * @param beanProperty Property in the bean, or null.
+ * @param beanScope bean scope, or null.
+ * @return Appropriate TagHandler.
+ * @throws JspException - NoSuchDefinitionException No value associated to bean.
+ * @throws JspException an error occur while reading bean, or no definition found.
+ * @throws JspException - Throws by underlying nested call to processDefinitionName()
+ */
+ protected TagHandler processBean(
+ String beanName,
+ String beanProperty,
+ String beanScope)
+ throws JspException {
+
+ Object beanValue =
+ TagUtils.getRealValueFromBean(
+ beanName,
+ beanProperty,
+ beanScope,
+ pageContext);
+
+ if (beanValue == null) {
+ throw new JspException(
+ "Error - Tag Insert : No value defined for bean '"
+ + beanName
+ + "' with property '"
+ + beanProperty
+ + "' in scope '"
+ + beanScope
+ + "'.");
+ }
+
+ return processObjectValue(beanValue);
+ }
+
+ /**
+ * Process tag attribute "attribute".
+ * Get value from component attribute.
+ * Found value is process by processObjectValue().
+ * @param name Name of the attribute.
+ * @return Appropriate TagHandler.
+ * @throws JspException - NoSuchDefinitionException No Definition found for name.
+ * @throws JspException - Throws by underlying nested call to processDefinitionName()
+ */
+ public TagHandler processAttribute(String name) throws JspException {
+ Object attrValue = getCurrentContext().getAttribute(name);
+
+ if (attrValue == null) {
+ throw new JspException(
+ "Error - Tag Insert : No value found for attribute '" + name + "'.");
+ }
+
+ return processObjectValue(attrValue);
+ }
+
+ /**
+ * Try to process name as a definition, or as an URL if not found.
+ * @param name Name to process.
+ * @return appropriate TagHandler
+ * @throws JspException InstantiationException Can't create requested controller
+ */
+ public TagHandler processAsDefinitionOrURL(String name) throws JspException {
+ try {
+ ComponentDefinition definition =
+ TilesUtil.getDefinition(
+ name,
+ pageContext.getRequest(),
+ pageContext.getServletContext());
+
+ if (definition != null) {
+ return processDefinition(definition);
+ }
+
+ } catch (DefinitionsFactoryException ex) {
+ // silently failed, because we can choose to not define a factory.
+ }
+
+ // no definition found, try as url
+ return processUrl(name);
+ }
+
+ /**
+ * Process typed attribute according to its type.
+ * @param value Typed attribute to process.
+ * @return appropriate TagHandler.
+ * @throws JspException - Throws by underlying nested call to processDefinitionName()
+ */
+ public TagHandler processTypedAttribute(AttributeDefinition value)
+ throws JspException {
+ if (value instanceof DirectStringAttribute) {
+ return new DirectStringHandler((String) value.getValue());
+
+ } else if (value instanceof DefinitionAttribute) {
+ return processDefinition((ComponentDefinition) value.getValue());
+
+ } else if (value instanceof DefinitionNameAttribute) {
+ return processDefinitionName((String) value.getValue());
+ }
+
+ return new InsertHandler((String) value.getValue(), role, getController());
+ }
+
+ /**
+ * Do an include of specified page.
+ * This method is used internally to do all includes from this class. It delegates
+ * the include call to the TilesUtil.doInclude().
+ * @param page The page that will be included
+ * @throws ServletException - Thrown by call to pageContext.include()
+ * @throws IOException - Thrown by call to pageContext.include()
+ */
+ protected void doInclude(String page) throws ServletException, IOException {
+ TilesUtil.doInclude(page, pageContext);
+ }
+
+ /////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Inner Interface.
+ * Sub handler for tag.
+ */
+ protected interface TagHandler {
+ /**
+ * Create ComponentContext for type depicted by implementation class.
+ */
+ public int doStartTag() throws JspException;
+ /**
+ * Do include for type depicted by implementation class.
+ */
+ public int doEndTag() throws JspException;
+ /**
+ * Add a component parameter (attribute) to subContext.
+ */
+ public void putAttribute(String name, Object value);
+ } // end inner interface
+
+ /////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Real handler, after attribute resolution.
+ * Handle include sub-component.
+ */
+ protected class InsertHandler implements TagHandler {
+ protected String page;
+ protected ComponentContext currentContext;
+ protected ComponentContext subCompContext;
+ protected String role;
+ protected Controller controller;
+
+ /**
+ * Constructor.
+ * Create insert handler using Component definition.
+ */
+ public InsertHandler(
+ Map attributes,
+ String page,
+ String role,
+ Controller controller) {
+
+ this.page = page;
+ this.role = role;
+ this.controller = controller;
+ subCompContext = new ComponentContext(attributes);
+ }
+
+ /**
+ * Constructor.
+ * Create insert handler to insert page at specified location.
+ */
+ public InsertHandler(String page, String role, Controller controller) {
+ this.page = page;
+ this.role = role;
+ this.controller = controller;
+ subCompContext = new ComponentContext();
+ }
+
+ /**
+ * Create a new empty context.
+ */
+ public int doStartTag() throws JspException {
+ // Check role
+ HttpServletRequest request =
+ (HttpServletRequest) pageContext.getRequest();
+
+ if (role != null && !request.isUserInRole(role)) {
+ return SKIP_BODY;
+ }
+
+ // save current context
+ this.currentContext = getCurrentContext();
+ return EVAL_BODY_INCLUDE;
+ }
+
+ /**
+ * Add attribute to sub context.
+ * Do nothing.
+ */
+ public void putAttribute(String name, Object value) {
+ subCompContext.putAttribute(name, value);
+ }
+
+ /**
+ * Include requested page.
+ */
+ public int doEndTag() throws JspException {
+ // Check role
+ HttpServletRequest request =
+ (HttpServletRequest) pageContext.getRequest();
+
+ if (role != null && !request.isUserInRole(role)) {
+ return EVAL_PAGE;
+ }
+
+ try {
+ if (log.isDebugEnabled()) {
+ log.debug("insert page='" + page + "'.");
+ }
+
+ // set new context for included component.
+ pageContext.setAttribute(
+ ComponentConstants.COMPONENT_CONTEXT,
+ subCompContext,
+ PageContext.REQUEST_SCOPE);
+
+ // Call controller if any
+ if (controller != null) {
+ controller.perform(
+ subCompContext,
+ (HttpServletRequest) pageContext.getRequest(),
+ (HttpServletResponse) pageContext.getResponse(),
+ pageContext.getServletContext());
+ }
+
+ // include requested component.
+ //if (flush) {
+ // pageContext.getOut().flush();
+ //}
+
+ System.out.println("INCLUDING " + page);
+ doInclude(page);
+
+ } catch (IOException e) {
+ String msg = "Can't insert page '" + page + "' : " + e.getMessage();
+ log.error(msg, e);
+ throw new JspException(msg);
+
+ } catch (IllegalArgumentException e) {
+ // Can't resolve page uri, should we ignore it?
+ if (!(page == null && isErrorIgnored)) {
+ String msg =
+ "Can't insert page '"
+ + page
+ + "'. Check if it exists.\n"
+ + e.getMessage();
+
+ log.error(msg, e);
+ throw new JspException(msg);
+ }
+
+ } catch (ServletException e) {
+ Throwable cause = e;
+ if (e.getRootCause() != null) {
+ cause = e.getRootCause();
+ }
+
+ String msg =
+ "ServletException in '" + page + "': " + cause.getMessage();
+
+ log.error(msg, e);
+ throw new JspException(msg);
+
+
+ } finally {
+ // restore old context only if currentContext not null
+ // (bug with Silverstream ?; related by Arvindra Sehmi 20010712)
+ if (currentContext != null) {
+ pageContext.setAttribute(
+ ComponentConstants.COMPONENT_CONTEXT,
+ currentContext,
+ PageContext.REQUEST_SCOPE);
+ }
+ }
+
+ return EVAL_PAGE;
+ }
+
+ /**
+ * Process an exception.
+ * Depending of debug attribute, print full exception trace or only
+ * its message in output page.
+ * @param ex Exception
+ * @param msg An additional message to show in console and to propagate if we can't output exception.
+ * @deprecated This method will be removed in a release after Struts 1.2.
+ */
+ protected void processException(Throwable ex, String msg)
+ throws JspException {
+
+ try {
+ if (msg == null) {
+ msg = ex.getMessage();
+ }
+
+ if (log.isDebugEnabled()) { // show full trace
+ log.debug(msg, ex);
+ pageContext.getOut().println(msg);
+ ex.printStackTrace(new PrintWriter(pageContext.getOut(), true));
+ } else { // show only message
+ pageContext.getOut().println(msg);
+ }
+
+ } catch (IOException ioex) { // problems. Propagate original exception
+ pageContext.setAttribute(
+ ComponentConstants.EXCEPTION_KEY,
+ ex,
+ PageContext.REQUEST_SCOPE);
+ throw new JspException(msg);
+ }
+ }
+ }
+
+ /**
+ * Parse the list of roles and return <code>true</code> or <code>false</code> based on whether
+ * the user has that role or not.
+ * @param role Comma-delimited list of roles.
+ * @param request The request.
+ */
+ static public boolean userHasRole(HttpServletRequest request, String role) {
+ StringTokenizer st = new StringTokenizer(role, ",");
+ while (st.hasMoreTokens()) {
+ if (request.isUserInRole(st.nextToken())) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Handle insert direct string.
+ */
+ protected class DirectStringHandler implements TagHandler {
+ /** Object to print as a direct string */
+ private Object value;
+
+ /**
+ * Constructor.
+ */
+ public DirectStringHandler(Object value) {
+ this.value = value;
+ }
+
+ /**
+ * Do nothing, there is no context for a direct string.
+ */
+ public int doStartTag() throws JspException {
+ return SKIP_BODY;
+ }
+
+ /**
+ * Add attribute to sub context.
+ * Do nothing.
+ */
+ public void putAttribute(String name, Object value) {
+ }
+
+ /**
+ * Print String in page output stream.
+ */
+ public int doEndTag() throws JspException {
+ try {
+ if (flush) {
+ pageContext.getOut().flush();
+ }
+
+ pageContext.getOut().print(value);
+
+ } catch (IOException ex) {
+ if (log.isDebugEnabled()) {
+ log.debug("Can't write string '" + value + "' : ", ex);
+ }
+
+ pageContext.setAttribute(
+ ComponentConstants.EXCEPTION_KEY,
+ ex,
+ PageContext.REQUEST_SCOPE);
+
+ throw new JspException(
+ "Can't write string '" + value + "' : " + ex.getMessage());
+ }
+
+ return EVAL_PAGE;
+ }
+ }
+}
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutListTag.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutListTag.java?rev=190662&view=auto
==============================================================================
--- struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutListTag.java (added)
+++ struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutListTag.java Tue Jun 14 14:59:13 2005
@@ -0,0 +1,210 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * Licensed 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.taglib.tiles;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.TagSupport;
+
+import org.apache.tiles.AttributeDefinition;
+import org.apache.tiles.UntypedAttribute;
+
+/**
+ * PutList tag implementation.
+ */
+public class PutListTag
+ extends TagSupport
+ implements ComponentConstants, AddTagParent, PutListTagParent {
+
+ /**
+ * Name of this attribute.
+ */
+ private String attributeName = null;
+
+ /**
+ * The list itself.
+ */
+ private List list = null;
+
+ /**
+ * Role attribute.
+ */
+ private String role = null;
+
+ /**
+ * Default constructor.
+ */
+ public PutListTag() {
+ super();
+ }
+
+ /**
+ * Release all allocated resources.
+ */
+ public void release() {
+ super.release();
+ attributeName = null;
+ role = null;
+ }
+
+ /**
+ * Release all internal resources.
+ */
+ protected void releaseInternal() {
+ list = null;
+ }
+
+ /**
+ * Set property.
+ */
+ public void setName(String name) {
+ this.attributeName = name;
+ }
+
+ /**
+ * Get property.
+ */
+ public String getName() {
+ return attributeName;
+ }
+
+ /**
+ * Set role attribute.
+ * @param role The role the user must be in to store content.
+ */
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+ /**
+ * Get role attribute.
+ */
+ public String getRole() {
+ return role;
+ }
+
+ /**
+ * Get list defined in tag.
+ */
+ public List getList() {
+ return list;
+ }
+
+ /**
+ * Set property.
+ */
+ public void addElement(Object value) {
+ if (list == null) {
+ list = new ArrayList();
+ }
+
+ list.add(value);
+ }
+
+ /**
+ * Process nested ≶putList> tag.
+ * Method calls by nested ≶putList> tags.
+ * Nested list is added to current list.
+ * If role is defined, nested attribute is wrapped into an untypped definition
+ * containing attribute value and role.
+ */
+ public void processNestedTag(PutListTag nestedTag) throws JspException {
+ // Get real value and check role
+ // If role is set, add it in attribute definition if any.
+ // If no attribute definition, create untyped one, and set role.
+ Object attributeValue = nestedTag.getList();
+
+ if (nestedTag.getRole() != null) {
+ AttributeDefinition def = new UntypedAttribute(attributeValue);
+ def.setRole(nestedTag.getRole());
+ attributeValue = def;
+ }
+
+ // now add attribute to enclosing parent (i.e. : this object)
+ addElement(attributeValue);
+ }
+
+ /**
+ * Process nested ≶add> tag.
+ * Method calls by nested ≶add> tags.
+ * Nested attribute is added to current list.
+ * If role is defined, nested attribute is wrapped into an untypped definition
+ * containing attribute value and role.
+ */
+ public void processNestedTag(AddTag nestedTag) throws JspException {
+ // Get real value and check role
+ // If role is set, add it in attribute definition if any.
+ // If no attribute definition, create untyped one, and set role.
+ Object attributeValue = nestedTag.getRealValue();
+ AttributeDefinition def;
+
+ if (nestedTag.getRole() != null) {
+ try {
+ def = ((AttributeDefinition) attributeValue);
+ } catch (ClassCastException ex) {
+ def = new UntypedAttribute(attributeValue);
+ }
+ def.setRole(nestedTag.getRole());
+ attributeValue = def;
+ }
+
+ // now add attribute to enclosing parent (i.e. : this object)
+ addElement(attributeValue);
+ }
+
+ /**
+ * Do start tag.
+ */
+ public int doStartTag() throws JspException {
+ return EVAL_BODY_INCLUDE;
+ }
+
+ /**
+ * Do end tag.
+ */
+ public int doEndTag() throws JspException {
+ PutListTagParent enclosingParent = findEnclosingParent();
+ enclosingParent.processNestedTag(this);
+ // Clear list to avoid reuse
+ releaseInternal();
+ return EVAL_PAGE;
+ }
+
+ /**
+ * Find enclosing parent tag accepting this tag.
+ * @throws JspException If we can't find an appropriate enclosing tag.
+ */
+ protected PutListTagParent findEnclosingParent() throws JspException {
+ try {
+ PutListTagParent parent =
+ (PutListTagParent) findAncestorWithClass(this,
+ PutListTagParent.class);
+
+ if (parent == null) {
+ throw new JspException("Error - tag putList : enclosing tag doesn't accept 'putList' tag.");
+ }
+
+ return parent;
+
+ } catch (ClassCastException ex) {
+ throw new JspException("Error - tag putList : enclosing tag doesn't accept 'putList' tag.");
+ }
+ }
+
+}
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutListTagParent.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutListTagParent.java?rev=190662&view=auto
==============================================================================
--- struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutListTagParent.java (added)
+++ struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutListTagParent.java Tue Jun 14 14:59:13 2005
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * Licensed 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.taglib.tiles;
+
+import javax.servlet.jsp.JspException;
+
+/**
+ * Tag classes implementing this interface can contains nested PutTag.
+ * This interface defines a method called by nested tags.
+ */
+public interface PutListTagParent {
+ /**
+ * Add an attribute to container.
+ * @param nestedTag Nested PutTag defining the attribute.
+ */
+ void processNestedTag(PutListTag nestedTag) throws JspException;
+
+}
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutTag.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutTag.java?rev=190662&view=auto
==============================================================================
--- struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutTag.java (added)
+++ struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutTag.java Tue Jun 14 14:59:13 2005
@@ -0,0 +1,476 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * Licensed 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.taglib.tiles;
+
+import java.lang.reflect.InvocationTargetException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.BodyTagSupport;
+
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.taglib.tiles.util.TagUtils;
+import org.apache.tiles.AttributeDefinition;
+import org.apache.tiles.DefinitionNameAttribute;
+import org.apache.tiles.DirectStringAttribute;
+import org.apache.tiles.PathAttribute;
+
+/**
+ * Put an attribute in enclosing attribute container tag.
+ * Enclosing attribute container tag can be : <insert> or <definition>.
+ * Exception is thrown if no appropriate tag can be found.
+ * Put tag can have following atributes :
+ * <li>
+ * <ul>name : Name of the attribute</ul>
+ * <ul>value | content : value to put as attribute</ul>
+ * <ul>type : value type. Only valid if value is a String and is set by
+ * value="something" or by a bean.
+ * Possible type are : string (value is used as direct string),
+ * page | template (value is used as a page url to insert),
+ * definition (value is used as a definition name to insert)</ul>
+ * <ul>direct : Specify if value is to be used as a direct string or as a
+ * page url to insert. This is another way to specify the type. It only apply
+ * if value is set as a string, and type is not present.</ul>
+ * <ul>beanName : Name of a bean used for setting value. Only valid if value is not set.
+ * If property is specified, value come from bean's property. Otherwise, bean
+ * itself is used for value.</ul>
+ * <ul>beanProperty : Name of the property used for retrieving value.</ul>
+ * <ul>beanScope : Scope containing bean. </ul>
+ * <ul>role : Role to check when 'insert' will be called. If enclosing tag is
+ * <insert>, role is checked immediately. If enclosing tag is
+ * <definition>, role will be checked when this definition will be
+ * inserted.</ul>
+ * </li>
+ * Value can also come from tag body. Tag body is taken into account only if
+ * value is not set by one of the tag attributes. In this case Attribute type is
+ * "string", unless tag body define another type.
+ *
+ * @author Cedric Dumoulin
+ * @author David Geary
+ */
+public class PutTag extends BodyTagSupport implements ComponentConstants {
+
+ /* JSP Tag attributes */
+
+ /**
+ * Name of attribute to put in component context.
+ */
+ protected String attributeName = null;
+
+ /**
+ * Associated attribute value.
+ */
+ private Object value = null;
+
+ /**
+ * JSP Template compatibility.
+ */
+ private String direct = null;
+
+ /**
+ * Requested type for the value.
+ */
+ private String valueType = null;
+
+ /**
+ * Bean name attribute.
+ */
+ private String beanName = null;
+
+ /**
+ * Bean property attribute.
+ */
+ private String beanProperty = null;
+
+ /**
+ * Bean scope attribute.
+ */
+ private String beanScope = null;
+
+ /**
+ * Role attribute.
+ */
+ private String role = null;
+
+ /* Internal properties */
+
+ /**
+ * Cached real value computed from tag attributes.
+ */
+ protected Object realValue = null;
+
+ /**
+ * Default constructor.
+ */
+ public PutTag() {
+ super();
+ }
+
+ /**
+ * Release all allocated resources.
+ */
+ public void release() {
+
+ super.release();
+
+ attributeName = null;
+ valueType = null;
+ direct = null;
+ value = null;
+ beanName = null;
+ beanProperty = null;
+ beanScope = null;
+ role = null;
+ }
+
+ /**
+ * Release internal properties.
+ */
+ protected void releaseInternal() {
+ realValue = null;
+ }
+
+ /**
+ * Set name.
+ */
+ public void setName(String value) {
+ this.attributeName = value;
+ }
+
+ /**
+ * Get name.
+ */
+ public String getName() {
+ return attributeName;
+ }
+
+ /**
+ * Set value.
+ * Method added to satisfy Tomcat (bug ?).
+ */
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ /**
+ * Get value.
+ * Method added to satisfy Tomcat (bug ?).
+ */
+ public String getValue() {
+ return (String) this.value;
+ }
+
+ /**
+ * Set value.
+ */
+ public void setValue(Object value) {
+ this.value = value;
+ }
+
+ /**
+ * Set property value as an object.
+ * Added because some web containers react badly to value as <code>Object</code>.
+ */
+ public void setObjectValue(Object value) {
+ this.value = value;
+ }
+
+ /**
+ * Set content.
+ * Method added to satisfy Tomcat (bug ?).
+ */
+ public void setContent(String value) {
+ this.value = value;
+ }
+
+ /**
+ * Get content.
+ * Method added to satisfy Tomcat (bug ?).
+ */
+ public String getContent() {
+ return (String) value;
+ }
+
+ /**
+ * Set content.
+ */
+ public void setContent(Object value) {
+ this.value = value;
+ }
+
+ /**
+ * Set direct.
+ * Method added for compatibility with JSP1.1.
+ */
+ public void setDirect(String isDirect) {
+ this.direct = isDirect;
+ }
+
+ /**
+ * Set type.
+ */
+ public void setType(String value) {
+ this.valueType = value;
+ }
+
+ /**
+ * Get type.
+ */
+ public String getType() {
+ return this.valueType;
+ }
+
+ /**
+ * Set bean name.
+ */
+ public void setBeanName(String value) {
+ this.beanName = value;
+ }
+
+ /**
+ * Get bean name.
+ */
+ public String getBeanName() {
+ return beanName;
+ }
+
+ /**
+ * Set bean property.
+ */
+ public void setBeanProperty(String value) {
+ this.beanProperty = value;
+ }
+
+ /**
+ * Get bean property.
+ */
+ public String getBeanProperty() {
+ return beanProperty;
+ }
+
+ /**
+ * Set bean scope.
+ */
+ public void setBeanScope(String value) {
+ this.beanScope = value;
+ }
+
+ /**
+ * Get bean scope.
+ */
+ public String getBeanScope() {
+ return beanScope;
+ }
+
+ /**
+ * Set role attribute.
+ * @param role The role the user must be in to store content.
+ */
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+ /**
+ * Get role attribute
+ * @return The role defined in the tag or <code>null</code>.
+ */
+ public String getRole() {
+ return role;
+ }
+
+ /**
+ * Get real value according to tag attribute.
+ * Real value is the value computed after attribute processing.
+ * @return Real value.
+ * @throws JspException If something goes wrong while getting value from bean.
+ */
+ public Object getRealValue() throws JspException {
+ if (realValue == null) {
+ computeRealValue();
+ }
+
+ return realValue;
+ }
+
+ /**
+ * Compute real value according to tag attributes.
+ * @throws JspException If something goes wrong while getting value from bean.
+ */
+ protected void computeRealValue() throws JspException {
+ // Compute real value from attributes set.
+ realValue = value;
+
+ // If realValue is not set, value must come from body
+ if (value == null && beanName == null) {
+ // Test body content in case of empty body.
+ if (bodyContent != null) {
+ realValue = bodyContent.getString();
+ } else {
+ realValue = "";
+ }
+ }
+
+ // Does value comes from a bean ?
+ if (realValue == null && beanName != null) {
+ getRealValueFromBean();
+ return;
+ }
+
+ // Is there a type set ?
+ // First check direct attribute, and translate it to a valueType.
+ // Then, evaluate valueType, and create requested typed attribute.
+ // If valueType is not set, use the value "as is".
+ if (valueType == null && direct != null) {
+ if (Boolean.valueOf(direct).booleanValue() == true) {
+ valueType = "string";
+ } else {
+ valueType = "path";
+ }
+ }
+
+ if (realValue != null
+ && valueType != null
+ && !(value instanceof AttributeDefinition)) {
+
+ String strValue = realValue.toString();
+ if (valueType.equalsIgnoreCase("string")) {
+ realValue = new DirectStringAttribute(strValue);
+
+ } else if (valueType.equalsIgnoreCase("page")) {
+ realValue = new PathAttribute(strValue);
+
+ } else if (valueType.equalsIgnoreCase("template")) {
+ realValue = new PathAttribute(strValue);
+
+ } else if (valueType.equalsIgnoreCase("instance")) {
+ realValue = new DefinitionNameAttribute(strValue);
+
+ } else if (valueType.equalsIgnoreCase("definition")) {
+ realValue = new DefinitionNameAttribute(strValue);
+
+ } else { // bad type
+ throw new JspException(
+ "Warning - Tag put : Bad type '" + valueType + "'.");
+ }
+ }
+
+ }
+
+ /**
+ * Extract real value from specified bean.
+ * @throws JspException If something goes wrong while getting value from bean.
+ */
+ protected void getRealValueFromBean() throws JspException {
+ try {
+ Object bean = TagUtils.retrieveBean(beanName, beanScope, pageContext);
+ if (bean != null && beanProperty != null) {
+ realValue = PropertyUtils.getProperty(bean, beanProperty);
+ } else {
+ realValue = bean; // value can be null
+ }
+
+ } catch (NoSuchMethodException ex) {
+ throw new JspException(
+ "Error - component.PutAttributeTag : Error while retrieving value from bean '"
+ + beanName
+ + "' with property '"
+ + beanProperty
+ + "' in scope '"
+ + beanScope
+ + "'. (exception : "
+ + ex.getMessage());
+
+ } catch (InvocationTargetException ex) {
+ throw new JspException(
+ "Error - component.PutAttributeTag : Error while retrieving value from bean '"
+ + beanName
+ + "' with property '"
+ + beanProperty
+ + "' in scope '"
+ + beanScope
+ + "'. (exception : "
+ + ex.getMessage());
+
+ } catch (IllegalAccessException ex) {
+ throw new JspException(
+ "Error - component.PutAttributeTag : Error while retrieving value from bean '"
+ + beanName
+ + "' with property '"
+ + beanProperty
+ + "' in scope '"
+ + beanScope
+ + "'. (exception : "
+ + ex.getMessage());
+ }
+ }
+
+ /**
+ * Do start tag.
+ */
+ public int doStartTag() throws JspException {
+ // Do we need to evaluate body ?
+ if (value == null && beanName == null) {
+ return EVAL_BODY_TAG;
+ }
+
+ // Value is set, don't evaluate body.
+ return SKIP_BODY;
+ }
+
+ /**
+ * Do end tag.
+ */
+ public int doEndTag() throws JspException {
+ // Call parent tag which in turn does what it want
+ callParent();
+
+ // clean up tag handler for reuse.
+ releaseInternal();
+
+ return EVAL_PAGE;
+ }
+
+ /**
+ * Find parent tag which must implement AttributeContainer.
+ * @throws JspException If we can't find an appropriate enclosing tag.
+ */
+ protected void callParent() throws JspException {
+ // Get enclosing parent
+ PutTagParent enclosingParent = findEnclosingPutTagParent();
+ enclosingParent.processNestedTag(this);
+ }
+
+ /**
+ * Find parent tag which must implement AttributeContainer.
+ * @throws JspException If we can't find an appropriate enclosing tag.
+ */
+ protected PutTagParent findEnclosingPutTagParent() throws JspException {
+ try {
+ PutTagParent parent =
+ (PutTagParent) findAncestorWithClass(this, PutTagParent.class);
+
+ if (parent == null) {
+ throw new JspException("Error - tag put : enclosing tag doesn't accept 'put' tag.");
+ }
+
+ return parent;
+
+ } catch (ClassCastException ex) {
+ throw new JspException("Error - tag put : enclosing tag doesn't accept 'put' tag.");
+ }
+ }
+
+}
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutTagParent.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutTagParent.java?rev=190662&view=auto
==============================================================================
--- struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutTagParent.java (added)
+++ struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/PutTagParent.java Tue Jun 14 14:59:13 2005
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * Licensed 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.taglib.tiles;
+
+import javax.servlet.jsp.JspException;
+
+/**
+ * Tag classes implementing this interface can contain nested PutTag.
+ * This interface defines a method called by nested tags.
+ */
+public interface PutTagParent {
+ /**
+ * Process the nested tag.
+ * @param nestedTag Nested tag to process.
+ */
+ void processNestedTag(PutTag nestedTag ) throws JspException;
+
+}
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/UseAttributeTag.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/UseAttributeTag.java?rev=190662&view=auto
==============================================================================
--- struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/UseAttributeTag.java (added)
+++ struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/UseAttributeTag.java Tue Jun 14 14:59:13 2005
@@ -0,0 +1,209 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * Licensed 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.taglib.tiles;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.tagext.TagSupport;
+
+import org.apache.taglib.tiles.util.TagUtils;
+import org.apache.tiles.ComponentContext;
+
+
+/**
+ * Custom tag exposing a component attribute to page.
+ *
+ */
+public final class UseAttributeTag extends TagSupport {
+
+
+ // ----------------------------------------------------- Instance Variables
+
+
+ /**
+ * Class name of object.
+ */
+ private String classname = null;
+
+
+ /**
+ * The scope name.
+ */
+ private String scopeName = null;
+
+ /**
+ * The scope value.
+ */
+ private int scope = PageContext.PAGE_SCOPE;
+
+
+
+ /**
+ * The attribute name to be exposed.
+ */
+ private String attributeName = null;
+
+ /**
+ * Are errors ignored. This is the property for attribute 'ignore'.
+ * Default value is <code>false</code>, which throws an exception.
+ * Only "attribute not found" - errors are ignored.
+ */
+ protected boolean isErrorIgnored = false;
+
+
+ // ------------------------------------------------------------- Properties
+
+
+ /**
+ * Release all allocated resources.
+ */
+ public void release() {
+
+ super.release();
+ attributeName = null;
+ classname = null;
+ scope = PageContext.PAGE_SCOPE;
+ scopeName = null;
+ isErrorIgnored = false;
+ // Parent doesn't clear id, so we do it
+ // bug reported by Heath Chiavettone on 18 Mar 2002
+ id = null;
+ }
+
+ /**
+ * Get class name.
+ */
+ public String getClassname() {
+
+ return (this.classname);
+
+ }
+
+
+ /**
+ * Set the class name.
+ *
+ * @param name The new class name.
+ */
+ public void setClassname(String name) {
+
+ this.classname = name;
+
+ }
+
+ /**
+ * Set name.
+ */
+ public void setName(String value){
+ this.attributeName = value;
+ }
+
+ /**
+ * Get name.
+ */
+ public String getName()
+ {
+ return attributeName;
+ }
+
+ /**
+ * Set the scope.
+ *
+ * @param scope The new scope.
+ */
+ public void setScope(String scope) {
+ this.scopeName = scope;
+ }
+
+ /**
+ * Get scope.
+ */
+ public String getScope()
+ {
+ return scopeName;
+ }
+
+ /**
+ * Set ignore.
+ */
+ public void setIgnore(boolean ignore)
+ {
+ this.isErrorIgnored = ignore;
+ }
+
+ /**
+ * Get ignore.
+ */
+ public boolean getIgnore()
+ {
+ return isErrorIgnored;
+ }
+
+ // --------------------------------------------------------- Public Methods
+
+
+ /**
+ * Expose the requested attribute from component context.
+ *
+ * @exception JspException if a JSP exception has occurred
+ */
+ public int doStartTag() throws JspException
+ {
+ // Do a local copy of id
+ String localId=this.id;
+ if( localId==null )
+ localId=attributeName;
+
+ ComponentContext compContext = (ComponentContext)pageContext.getAttribute( ComponentConstants.COMPONENT_CONTEXT, PageContext.REQUEST_SCOPE);
+ if( compContext == null )
+ throw new JspException ( "Error - tag useAttribute : no tiles context found." );
+
+ Object value = compContext.getAttribute(attributeName);
+ // Check if value exists and if we must send a runtime exception
+ if( value == null )
+ if(!isErrorIgnored)
+ throw new JspException ( "Error - tag useAttribute : attribute '"+ attributeName + "' not found in context. Check tag syntax" );
+ else
+ return SKIP_BODY;
+
+ if( scopeName != null )
+ {
+ scope = TagUtils.getScope( scopeName, PageContext.PAGE_SCOPE );
+ if(scope!=ComponentConstants.COMPONENT_SCOPE)
+ pageContext.setAttribute(localId, value, scope);
+ }
+ else
+ pageContext.setAttribute(localId, value);
+
+ // Continue processing this page
+ return SKIP_BODY;
+ }
+
+
+
+
+ /**
+ * Clean up after processing this enumeration.
+ *
+ * @exception JspException if a JSP exception has occurred
+ */
+ public int doEndTag() throws JspException
+ {
+ return (EVAL_PAGE);
+ }
+
+}
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/UseAttributeTei.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/UseAttributeTei.java?rev=190662&view=auto
==============================================================================
--- struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/UseAttributeTei.java (added)
+++ struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/UseAttributeTei.java Tue Jun 14 14:59:13 2005
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * Licensed 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.taglib.tiles;
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.ServletContext;
+
+import javax.servlet.jsp.tagext.TagData;
+import javax.servlet.jsp.tagext.TagExtraInfo;
+import javax.servlet.jsp.tagext.VariableInfo;
+
+/**
+ * Implementation of <code>TagExtraInfo</code> for the <b>UseAttribute</b>
+ * tag, identifying the scripting object(s) to be made visible.
+ *
+ */
+public final class UseAttributeTei extends TagExtraInfo {
+
+ /**
+ * Return information about the scripting variables to be created.
+ */
+ public VariableInfo[] getVariableInfo(TagData data) {
+
+ String classname = data.getAttributeString("classname");
+ if( classname == null )
+ classname = "java.lang.Object";
+ String id = data.getAttributeString("id");
+ if( id == null )
+ id = data.getAttributeString("name");
+
+ return new VariableInfo[] {
+ new VariableInfo(id,
+ classname,
+ true,
+ VariableInfo.AT_END)
+ };
+ }
+}
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/doc-files/tilesUML.gif
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/doc-files/tilesUML.gif?rev=190662&view=auto
==============================================================================
Binary file - no diff available.
Propchange: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/doc-files/tilesUML.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/package.html
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/package.html?rev=190662&view=auto
==============================================================================
--- struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/package.html (added)
+++ struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/package.html Tue Jun 14 14:59:13 2005
@@ -0,0 +1,13 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+ <title>Package Documentation for org.apache.struts.taglib.tiles Package</title>
+</head>
+ <body bgcolor="white">
+
+
+<p>The "tiles" tag library contains tags that are useful in
+creating dynamic reusable components. </p>
+<img src="doc-files/tilesUML.gif" alt="TagLib Tiles UML">
+ </body>
+</html>
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/util/TagUtils.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/util/TagUtils.java?rev=190662&view=auto
==============================================================================
--- struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/util/TagUtils.java (added)
+++ struts/sandbox/trunk/tiles/core-library/src/java/org/apache/taglib/tiles/util/TagUtils.java Tue Jun 14 14:59:13 2005
@@ -0,0 +1,367 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * Licensed 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.taglib.tiles.util;
+
+import java.util.Map;
+import java.util.HashMap;
+
+import java.lang.reflect.InvocationTargetException;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.PageContext;
+
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.util.MessageResources;
+import org.apache.tiles.Globals;
+import org.apache.taglib.tiles.ComponentConstants;
+import org.apache.tiles.ComponentContext;
+import org.apache.tiles.ComponentDefinition;
+import org.apache.tiles.DefinitionsFactoryException;
+import org.apache.tiles.FactoryNotFoundException;
+import org.apache.tiles.NoSuchDefinitionException;
+import org.apache.tiles.TilesUtil;
+
+/**
+ * Collection of utilities.
+ * This class also serves as an interface between Components and Struts. If
+ * you want to rip away Struts, simply reimplement some methods in this class.
+ * You can copy them from Struts.
+ * <p\>
+ * <i>Thanks for the tip. That's exactly what I did! (David Geary)</i>
+ *
+ * @author Cedric Dumoulin
+ * @author David Graham
+ * @author David Geary
+ */
+public class TagUtils {
+ /**
+ * The message resources for this package.
+ * TODO We need to move the relevant messages out of this properties file.
+ */
+ private static final MessageResources messages =
+ MessageResources.getMessageResources("org.apache.tiles.taglib.LocalStrings");
+
+ /**
+ * Maps lowercase JSP scope names to their PageContext integer constant
+ * values.
+ */
+ private static final Map scopes = new HashMap();
+
+ /**
+ * Initialize the scope names map and the encode variable with the
+ * Java 1.4 method if available.
+ */
+ static {
+ scopes.put("page", new Integer(PageContext.PAGE_SCOPE));
+ scopes.put("request", new Integer(PageContext.REQUEST_SCOPE));
+ scopes.put("session", new Integer(PageContext.SESSION_SCOPE));
+ scopes.put("application", new Integer(PageContext.APPLICATION_SCOPE));
+ }
+
+ /** Debug flag */
+ public static final boolean debug = true;
+
+ /**
+ * Get scope value from string value
+ * @param scopeName Scope as a String.
+ * @param defaultValue Returned default value, if not found.
+ * @return Scope as an <code>int</code>, or <code>defaultValue</code> if scope is <code>null</code>.
+ * @throws JspException Scope name is not recognized as a valid scope.
+ */
+ public static int getScope(String scopeName, int defaultValue) throws JspException {
+ if (scopeName == null) {
+ return defaultValue;
+ }
+
+ if (scopeName.equalsIgnoreCase("component")) {
+ return ComponentConstants.COMPONENT_SCOPE;
+
+ } else if (scopeName.equalsIgnoreCase("template")) {
+ return ComponentConstants.COMPONENT_SCOPE;
+
+ } else if (scopeName.equalsIgnoreCase("tile")) {
+ return ComponentConstants.COMPONENT_SCOPE;
+
+ } else {
+ return getScope(scopeName);
+ }
+ }
+
+ /**
+ * Return the value of the specified property of the specified bean,
+ * no matter which property reference format is used, with no
+ * type conversions.
+ *
+ * @param bean Bean whose property is to be extracted.
+ * @param name Possibly indexed and/or nested name of the property
+ * to be extracted.
+ *
+ * @exception IllegalAccessException if the caller does not have
+ * access to the property accessor method
+ * @exception InvocationTargetException if the property accessor method
+ * throws an exception
+ * @exception NoSuchMethodException if an accessor method for this
+ * propety cannot be found.
+ * @deprecated Use PropertyUtils.getProperty() directly. This will be removed
+ * after Struts 1.2.
+ */
+ public static Object getProperty(Object bean, String name)
+ throws
+ IllegalAccessException,
+ InvocationTargetException,
+ NoSuchMethodException {
+
+ return PropertyUtils.getProperty(bean, name);
+ }
+
+ /**
+ * Retrieve bean from page context, using specified scope.
+ * If scope is not set, use <code>findAttribute()</code>.
+ *
+ * @param beanName Name of bean to retrieve.
+ * @param scopeName Scope or <code>null</code>. If <code>null</code>, bean is searched using
+ * findAttribute().
+ * @param pageContext Current pageContext.
+ * @return Requested bean or <code>null</code> if not found.
+ * @throws JspException Scope name is not recognized as a valid scope.
+ */
+ public static Object retrieveBean(String beanName, String scopeName, PageContext pageContext)
+ throws JspException {
+
+ if (scopeName == null) {
+ return findAttribute(beanName, pageContext);
+ }
+
+ // Default value doesn't matter because we have already check it
+ int scope = getScope(scopeName, PageContext.PAGE_SCOPE);
+
+ //return pageContext.getAttribute( beanName, scope );
+ return getAttribute(beanName, scope, pageContext);
+ }
+
+ /**
+ * Search attribute in different contexts.
+ * First, check in component context, then use pageContext.findAttribute().
+ * @param beanName Name of bean to retrieve.
+ * @param pageContext Current pageContext.
+ * @return Requested bean or <code>null</code> if not found.
+ */
+ public static Object findAttribute(String beanName, PageContext pageContext) {
+ ComponentContext compContext = ComponentContext.getContext(pageContext.getRequest());
+
+ if (compContext != null) {
+ Object attribute = compContext.findAttribute(beanName, pageContext);
+ if (attribute != null) {
+ return attribute;
+ }
+ }
+
+ // Search in pageContext scopes
+ return pageContext.findAttribute(beanName);
+ }
+
+ /**
+ * Get object from requested context. Return <code>null</code> if not found.
+ * Context can be "component" or normal JSP contexts.
+ * @param beanName Name of bean to retrieve.
+ * @param scope Scope from which bean must be retrieved.
+ * @param pageContext Current pageContext.
+ * @return Requested bean or <code>null</code> if not found.
+ */
+ public static Object getAttribute(String beanName, int scope, PageContext pageContext) {
+ if (scope == ComponentConstants.COMPONENT_SCOPE) {
+ ComponentContext compContext = ComponentContext.getContext(pageContext.getRequest());
+ return compContext.getAttribute(beanName);
+ }
+ return pageContext.getAttribute(beanName, scope);
+ }
+
+ /**
+ * Locate and return the specified property of the specified bean, from
+ * an optionally specified scope, in the specified page context.
+ *
+ * @param pageContext Page context to be searched.
+ * @param beanName Name of the bean to be retrieved.
+ * @param beanProperty Name of the property to be retrieved, or
+ * <code>null</code> to retrieve the bean itself.
+ * @param beanScope Scope to be searched (page, request, session, application)
+ * or <code>null</code> to use <code>findAttribute()</code> instead.
+ *
+ * @exception JspException Scope name is not recognized as a valid scope
+ * @exception JspException if the specified bean is not found
+ * @exception JspException if accessing this property causes an
+ * IllegalAccessException, IllegalArgumentException,
+ * InvocationTargetException, or NoSuchMethodException
+ */
+ public static Object getRealValueFromBean(
+ String beanName,
+ String beanProperty,
+ String beanScope,
+ PageContext pageContext)
+ throws JspException {
+
+ try {
+ Object realValue;
+ Object bean = retrieveBean(beanName, beanScope, pageContext);
+ if (bean != null && beanProperty != null) {
+ realValue = PropertyUtils.getProperty(bean, beanProperty);
+ } else {
+ realValue = bean; // value can be null
+ }
+ return realValue;
+
+ } catch (NoSuchMethodException ex) {
+ throw new JspException(
+ "Error - component.PutAttributeTag : Error while retrieving value from bean '"
+ + beanName
+ + "' with property '"
+ + beanProperty
+ + "' in scope '"
+ + beanScope
+ + "'. (exception : "
+ + ex.getMessage());
+
+ } catch (InvocationTargetException ex) {
+ throw new JspException(
+ "Error - component.PutAttributeTag : Error while retrieving value from bean '"
+ + beanName
+ + "' with property '"
+ + beanProperty
+ + "' in scope '"
+ + beanScope
+ + "'. (exception : "
+ + ex.getMessage());
+
+ } catch (IllegalAccessException ex) {
+ throw new JspException(
+ "Error - component.PutAttributeTag : Error while retrieving value from bean '"
+ + beanName
+ + "' with property '"
+ + beanProperty
+ + "' in scope '"
+ + beanScope
+ + "'. (exception : "
+ + ex.getMessage());
+ }
+ }
+
+ /**
+ * Store bean in requested context.
+ * If scope is <code>null</code>, save it in REQUEST_SCOPE context.
+ *
+ * @param pageContext Current pageContext.
+ * @param name Name of the bean.
+ * @param scope Scope under which bean is saved (page, request, session, application)
+ * or <code>null</code> to store in <code>request()</code> instead.
+ * @param value Bean value to store.
+ *
+ * @exception JspException Scope name is not recognized as a valid scope
+ */
+ public static void setAttribute(
+ PageContext pageContext,
+ String name,
+ Object value,
+ String scope)
+ throws JspException {
+
+ if (scope == null)
+ pageContext.setAttribute(name, value, PageContext.REQUEST_SCOPE);
+ else if (scope.equalsIgnoreCase("page"))
+ pageContext.setAttribute(name, value, PageContext.PAGE_SCOPE);
+ else if (scope.equalsIgnoreCase("request"))
+ pageContext.setAttribute(name, value, PageContext.REQUEST_SCOPE);
+ else if (scope.equalsIgnoreCase("session"))
+ pageContext.setAttribute(name, value, PageContext.SESSION_SCOPE);
+ else if (scope.equalsIgnoreCase("application"))
+ pageContext.setAttribute(name, value, PageContext.APPLICATION_SCOPE);
+ else {
+ throw new JspException("Error - bad scope name '" + scope + "'");
+ }
+ }
+
+ /**
+ * Store bean in REQUEST_SCOPE context.
+ *
+ * @param pageContext Current pageContext.
+ * @param name Name of the bean.
+ * @param beanValue Bean value to store.
+ *
+ * @exception JspException Scope name is not recognized as a valid scope
+ */
+ public static void setAttribute(PageContext pageContext, String name, Object beanValue)
+ throws JspException {
+ pageContext.setAttribute(name, beanValue, PageContext.REQUEST_SCOPE);
+ }
+
+ /**
+ * Save the specified exception as a request attribute for later use.
+ *
+ * @param pageContext The PageContext for the current page.
+ * @param exception The exception to be saved.
+ */
+ public static void saveException(PageContext pageContext, Throwable exception) {
+ pageContext.setAttribute(Globals.EXCEPTION_KEY, exception, PageContext.REQUEST_SCOPE);
+ }
+
+ /**
+ * Get component definition by its name.
+ * @param name Definition name.
+ * @param pageContext The PageContext for the current page.
+ * @throws JspException -
+ */
+ public static ComponentDefinition getComponentDefinition(String name, PageContext pageContext)
+ throws JspException {
+
+ try {
+ return TilesUtil.getDefinition(
+ name,
+ pageContext.getRequest(),
+ pageContext.getServletContext());
+
+ } catch (NoSuchDefinitionException ex) {
+ throw new JspException(
+ "Error : Can't get component definition for '"
+ + name
+ + "'. Check if this name exist in component definitions.");
+ } catch (FactoryNotFoundException ex) { // factory not found.
+ throw new JspException(ex.getMessage());
+
+ } catch (DefinitionsFactoryException ex) {
+ if (debug)
+ ex.printStackTrace();
+ // Save exception to be able to show it later
+ saveException(pageContext, ex);
+ throw new JspException(ex.getMessage());
+ }
+ }
+ /**
+ * Converts the scope name into its corresponding PageContext constant value.
+ * @param scopeName Can be "page", "request", "session", or "application" in any
+ * case.
+ * @return The constant representing the scope (ie. PageContext.REQUEST_SCOPE).
+ * @throws JspException if the scopeName is not a valid name.
+ */
+ public static int getScope(String scopeName) throws JspException {
+ Integer scope = (Integer) scopes.get(scopeName.toLowerCase());
+
+ if (scope == null) {
+ throw new JspException(messages.getMessage("lookup.scope", scope));
+ }
+
+ return scope.intValue();
+ }
+}
Added: struts/sandbox/trunk/tiles/core-library/src/java/org/apache/tiles/AttributeDefinition.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/tiles/core-library/src/java/org/apache/tiles/AttributeDefinition.java?rev=190662&view=auto
==============================================================================
--- struts/sandbox/trunk/tiles/core-library/src/java/org/apache/tiles/AttributeDefinition.java (added)
+++ struts/sandbox/trunk/tiles/core-library/src/java/org/apache/tiles/AttributeDefinition.java Tue Jun 14 14:59:13 2005
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * Licensed 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;
+
+import java.io.Serializable;
+
+ /**
+ * Attribute definition used in a component definition.
+ *
+ */
+public interface AttributeDefinition extends Serializable
+{
+
+ /**
+ * Return value hold by this typed attribute.
+ */
+ public Object getValue();
+
+ /**
+ * Set role attribute.
+ */
+ public void setRole(String role);
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org