View Javadoc

    1   /*
    2    * $Id: ComponentContext.java 471754 2006-11-06 14:55:09Z husted $
    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  package org.apache.struts.tiles;
    23
    24  import java.io.Serializable;
    25  import java.util.Collections;
    26  import java.util.HashMap;
    27  import java.util.Iterator;
    28  import java.util.Map;
    29  import java.util.Set;
    30
    31  import javax.servlet.ServletRequest;
    32  import javax.servlet.jsp.PageContext;
    33
    34  import org.apache.struts.tiles.taglib.ComponentConstants;
    35
    36  /**
    37   * Component context.
    38   */
    39  public class ComponentContext implements Serializable {
    40
    41      /**
    42       * Component attributes.
    43       */
    44      private Map attributes=null;
    45
    46      /**
    47       * Constructor.
    48       */
    49      public ComponentContext() {
    50          super();
    51      }
    52
    53      /**
    54       * Constructor.
    55       * Create a context and set specified attributes.
    56       * @param attributes Attributes to initialize context.
    57       */
    58      public ComponentContext(Map attributes) {
    59          if (attributes != null) {
    60              this.attributes = new HashMap(attributes);
    61          }
    62      }
    63
    64      /**
    65       * Add all attributes to this context.
    66       * Copies all of the mappings from the specified attribute map to this context.
    67       * New attribute mappings will replace any mappings that this context had for any of the keys
    68       * currently in the specified attribute map.
    69       * @param newAttributes Attributes to add.
    70       */
    71      public void addAll(Map newAttributes) {
    72          if (attributes == null) {
    73              attributes = new HashMap(newAttributes);
    74              return;
    75          }
    76
    77          attributes.putAll(newAttributes);
    78      }
    79
    80      /**
    81       * Add all missing attributes to this context.
    82       * Copies all of the mappings from the specified attributes map to this context.
    83       * New attribute mappings will be added only if they don't already exist in
    84       * this context.
    85       * @param defaultAttributes Attributes to add.
    86       */
    87      public void addMissing(Map defaultAttributes) {
    88          if (defaultAttributes == null) {
    89              return;
    90          }
    91
    92          if (attributes == null) {
    93              attributes = new HashMap(defaultAttributes);
    94              return;
    95          }
    96
    97          Set entries = defaultAttributes.entrySet();
    98          Iterator iterator = entries.iterator();
    99          while (iterator.hasNext()) {
    100             Map.Entry entry = (Map.Entry) iterator.next();
    101             if (!attributes.containsKey(entry.getKey())) {
    102                 attributes.put(entry.getKey(), entry.getValue());
    103             }
    104         }
    105     }
    106
    107     /**
    108      * Get an attribute from context.
    109      * @param name Name of the attribute.
    110      * @return <{Object}>
    111      */
    112     public Object getAttribute(String name) {
    113         if (attributes == null){
    114             return null;
    115         }
    116
    117         return attributes.get(name);
    118     }
    119
    120     /**
    121      * Get names of all attributes.
    122      * @return <{Object}>
    123      */
    124     public Iterator getAttributeNames() {
    125         if (attributes == null) {
    126             return Collections.EMPTY_LIST.iterator();
    127         }
    128
    129         return attributes.keySet().iterator();
    130     }
    131
    132     /**
    133      * Put a new attribute to context.
    134      * @param name Name of the attribute.
    135      * @param value Value of the attribute.
    136      */
    137     public void putAttribute(String name, Object value) {
    138         if (attributes == null) {
    139             attributes = new HashMap();
    140         }
    141
    142         attributes.put(name, value);
    143     }
    144
    145     /**
    146      * Find object in one of the contexts.
    147      * Order : component then pageContext.findAttribute()
    148      * @param beanName Name of the bean to find.
    149      * @param pageContext Page context.
    150      * @return Requested bean or <code>null</code> if not found.
    151      */
    152     public Object findAttribute(String beanName, PageContext pageContext) {
    153         Object attribute = getAttribute(beanName);
    154         if (attribute == null) {
    155             attribute = pageContext.findAttribute(beanName);
    156         }
    157
    158         return attribute;
    159     }
    160
    161     /**
    162      * Get object from requested context.
    163      * Context can be 'component'.
    164      * @param beanName Name of the bean to find.
    165      * @param scope Search scope (see {@link PageContext}).
    166      * @param pageContext Page context.
    167      * @return requested bean or <code>null</code> if not found.
    168      */
    169     public Object getAttribute(
    170         String beanName,
    171         int scope,
    172         PageContext pageContext) {
    173
    174         if (scope == ComponentConstants.COMPONENT_SCOPE){
    175             return getAttribute(beanName);
    176         }
    177
    178         return pageContext.getAttribute(beanName, scope);
    179     }
    180
    181     /**
    182      * Get component context from request.
    183      * @param request ServletRequest.
    184      * @return ComponentContext or null if context is not found or an
    185      * jspException is present in the request.
    186      */
    187     static public ComponentContext getContext(ServletRequest request) {
    188        if (request.getAttribute("javax.servlet.jsp.jspException") != null) {
    189            return null;
    190         }        return (ComponentContext) request.getAttribute(
    191             ComponentConstants.COMPONENT_CONTEXT);
    192     }
    193
    194     /**
    195      * Store component context into request.
    196      * @param context ComponentContext to store.
    197      * @param request Request to store ComponentContext.
    198      */
    199     static public void setContext(
    200         ComponentContext context,
    201         ServletRequest request) {
    202
    203         request.setAttribute(ComponentConstants.COMPONENT_CONTEXT, context);
    204     }
    205 }