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 &lg;put&gt; tag.
+     * Method calls by nested &lg;put&gt; 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 &lg;putList&gt; tag.
+     * Method calls by nested &lg;putList&gt; 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 &lg;putList&gt; 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 &lg;putList&gt; tag.
+     * Method calls by nested &lg;putList&gt; 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 &lg;add&gt; tag.
+     * Method calls by nested &lg;add&gt; 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 : &lt;insert&gt; or &lt;definition&gt;.
+ * 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
+ * &lt;insert&gt;, role is checked immediately. If enclosing tag is
+ * &lt;definition&gt;, 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