View Javadoc

    1   /*
    2    * $Id: ImportAttributeTag.java 504721 2007-02-07 22:22:21Z bayard $
    3    *
    4    * Licensed to the Apache Software Foundation (ASF) under one
    5    * or more contributor license agreements.  See the NOTICE file
    6    * distributed with this work for additional information
    7    * regarding copyright ownership.  The ASF licenses this file
    8    * to you under the Apache License, Version 2.0 (the
    9    * "License"); you may not use this file except in compliance
    10   * with the License.  You may obtain a copy of the License at
    11   *
    12   *  http://www.apache.org/licenses/LICENSE-2.0
    13   *
    14   * Unless required by applicable law or agreed to in writing,
    15   * software distributed under the License is distributed on an
    16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    17   * KIND, either express or implied.  See the License for the
    18   * specific language governing permissions and limitations
    19   * under the License.
    20   */
    21
    22
    23  package org.apache.struts.tiles.taglib;
    24
    25  import java.util.Iterator;
    26
    27  import javax.servlet.jsp.JspException;
    28  import javax.servlet.jsp.PageContext;
    29  import javax.servlet.jsp.tagext.TagSupport;
    30
    31  import org.apache.struts.tiles.taglib.util.TagUtils;
    32  import org.apache.struts.tiles.ComponentContext;
    33
    34
    35  /**
    36    *  Import attribute from component to requested scope.
    37    *  Attribute name and scope are optional. If not specified, all component
    38    *  attributes are imported in page scope.
    39   */
    40
    41  public class ImportAttributeTag extends TagSupport {
    42
    43      /**
    44       * Class name of object.
    45       */
    46      private String  name = null;
    47
    48
    49      /**
    50       * The scope name.
    51       */
    52      private String scopeName = null;
    53
    54      /**
    55       * The scope value.
    56       */
    57      private int scope = PageContext.PAGE_SCOPE;
    58      /**
    59       * Are errors ignored. This is the property for attribute
    60       * <code>ignore</code>.
    61       * Default value is <code>false</code>, which throws an exception.
    62       * Only "attribute not found" - errors are ignored.
    63       */
    64    protected boolean isErrorIgnored = false;
    65
    66
    67      /**
    68       * Release all allocated resources.
    69       */
    70      public void release() {
    71
    72          super.release();
    73          name = null;
    74          scopeName = null;
    75          scope = PageContext.PAGE_SCOPE;
    76          isErrorIgnored = false;
    77      }
    78
    79      /**
    80       * Get the name.
    81       * @return Name.
    82       */
    83      public String getName()
    84       {
    85       return (this.name);
    86       }
    87
    88
    89      /**
    90       * Set the name.
    91       * @param name The new name
    92       */
    93      public void setName(String name)
    94       {
    95       this.name = name;
    96       }
    97
    98      /**
    99       * Set the scope.
    100      * @param scope Scope.
    101      */
    102     public void setScope(String scope)
    103       {
    104       this.scopeName = scope;
    105       }
    106
    107     /**
    108      * Get scope.
    109      * @return Scope.
    110      */
    111   public String getScope()
    112   {
    113   return scopeName;
    114   }
    115
    116     /**
    117      * Set ignore flag.
    118      * @param ignore default: <code>false</code>: Exception is thrown when
    119      * attribute is not found, set to <code>
    120      * true</code> to ignore missing attributes silently
    121      */
    122   public void setIgnore(boolean ignore)
    123     {
    124     this.isErrorIgnored = ignore;
    125     }
    126
    127     /**
    128      * Get ignore flag.
    129      * @return default: <code>false</code>: Exception is thrown when attribute
    130      * is not found, set to <code>
    131      * true</code> to ignore missing attributes silently
    132      */
    133   public boolean getIgnore()
    134   {
    135   return isErrorIgnored;
    136   }
    137
    138     // --------------------------------------------------------- Public Methods
    139
    140
    141     /**
    142      * Expose the requested property from component context.
    143      *
    144      * @exception JspException On errors processing tag.
    145      */
    146 public int doStartTag() throws JspException
    147     {
    148       // retrieve component context
    149     ComponentContext compContext =
    150         (ComponentContext)pageContext.getAttribute(
    151             ComponentConstants.COMPONENT_CONTEXT, PageContext.REQUEST_SCOPE);
    152     if( compContext == null )
    153         throw new JspException ( "Error - tag importAttribute : "
    154             + "no tiles context found." );
    155
    156       // set scope
    157     scope = TagUtils.getScope( scopeName, PageContext.PAGE_SCOPE );
    158
    159       // push attribute in requested context.
    160     if( name != null )
    161       {
    162       Object value = compContext.getAttribute(name);
    163         // Check if value exist and if we must send a runtime exception
    164       if( value == null )
    165         {
    166         if(!isErrorIgnored)
    167           {
    168           throw new JspException ( "Error - tag importAttribute : property '"+
    169               name + "' not found in context. Check tag syntax" );
    170           }
    171         }
    172        else
    173         {
    174         pageContext.setAttribute(name, value, scope);
    175         }
    176       }
    177      else
    178       { // set all attributes
    179       Iterator names = compContext.getAttributeNames();
    180       while(names.hasNext())
    181         {
    182         String name = (String)names.next();
    183         if(name == null ) {
    184           if(!isErrorIgnored)
    185             throw new JspException ( "Error - tag importAttribute : "
    186                 + "encountered an attribute with key 'null'" );
    187           else
    188             return SKIP_BODY;
    189         }
    190
    191         Object value = compContext.getAttribute(name);
    192         // Check if value exist and if we must send a runtime exception
    193         if( value == null ) {
    194           if(!isErrorIgnored) {
    195             throw new JspException ( "Error - tag importAttribute : property '"
    196                 + name + "' has a value of 'null'" );
    197           }
    198         }
    199         pageContext.setAttribute(name, value, scope);
    200         } // end loop
    201       } // end else
    202
    203       // Continue processing this page
    204     return SKIP_BODY;
    205     }
    206
    207     /**
    208      * Clean up after processing this enumeration.
    209      *
    210      * @exception JspException On errors processing tag.
    211      */
    212   public int doEndTag() throws JspException
    213     {
    214     return (EVAL_PAGE);
    215     }
    216
    217 }