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 }