| /* |
| * 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."); |
| } |
| } |
| |
| } |