1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 }