1 /*
2 * $Id$
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 package org.apache.struts.chain.contexts;
22
23 import java.util.Map;
24
25 import org.apache.commons.chain.web.jakarta.WebContext;
26 import org.apache.struts.Globals;
27 import org.apache.struts.config.ModuleConfig;
28
29 /**
30 * Provide a Subclass of ActionContextBase which is understood to be wrapping
31 * an instance of {@link WebContext}.
32 */
33 public class WebActionContext extends ActionContextBase {
34
35 /**
36 * Instantiate this composite by wrapping an instance of WebContext.
37 *
38 * @param context The WebContext to wrap
39 */
40 public WebActionContext(WebContext context) {
41 super(context);
42 }
43
44 /**
45 * Provide the wrapped WebContext for this composite.
46 *
47 * @return The wrapped WebContext
48 */
49 protected WebContext webContext() {
50 return (WebContext) this.getBaseContext();
51 }
52
53 public void release() {
54 super.release();
55 }
56
57 // -------------------------------
58 // WebContext property wrappers
59 // -------------------------------
60
61 /**
62 * Return an immutable Map that maps header names to the first (or only)
63 * header value (as a String).
64 *
65 * @return A immutable Map of web request header names
66 */
67 public Map<String, String> getHeader() {
68 return webContext().getHeader();
69 }
70
71 /**
72 * Return an immutable Map that maps header names to the set of all values
73 * specified in the request (as a String array). Header names must be
74 * matched in a case-insensitive manner.
75 *
76 * @return An immutable Map of web request header values
77 */
78 public Map<String, String[]> getHeaderValues() {
79 return webContext().getHeaderValues();
80 }
81
82 /**
83 * Return an immutable Map that maps context application initialization
84 * parameters to their values.
85 *
86 * @return An immutable Map of web context initialization parameters
87 */
88 public Map<String, String> getInitParam() {
89 return webContext().getInitParam();
90 }
91
92 /**
93 * Return a map whose keys are {@code String} request parameter names and
94 * whose values are {@code String} values.
95 *
96 * <p>For parameters which were submitted with more than one value, only
97 * one value will be returned, as if one called
98 * {@code ServletRequest.getParameter(String)}.</p>
99 *
100 * @return A map of web request parameters
101 */
102 public Map<String, String> getParam() {
103 return webContext().getParam();
104 }
105
106 /**
107 * Return a map whose keys are {@code String} request parameter names and
108 * whose values are {@code String[]} values.
109 *
110 * @return A map of web request parameter values (as an array)
111 */
112 public Map<String, String[]> getParamValues() {
113 return webContext().getParamValues();
114 }
115
116 public Map<String, Object> getApplicationScope() {
117 return webContext().getApplicationScope();
118 }
119
120 public Map<String, Object> getRequestScope() {
121 return webContext().getRequestScope();
122 }
123
124 public Map<String, String[]> getParameterMap() {
125 return getParamValues();
126 }
127
128 public Map<String, Object> getSessionScope() {
129 return webContext().getSessionScope();
130 }
131
132 // ISSUE: AbstractSelectModule set the precedent of doing this at the
133 // "web context" level instead of the ServletWebContext level.
134 // Consider whether that's how we want to do it universally for other
135 // manipulations of the RequestScope or not...
136 public void setModuleConfig(ModuleConfig moduleConfig) {
137 super.setModuleConfig(moduleConfig);
138 this.getRequestScope().put(Globals.MODULE_KEY, moduleConfig);
139 }
140
141 /**
142 * @see org.apache.struts.chain.contexts.ActionContext#getModuleConfig()
143 */
144 public ModuleConfig getModuleConfig() {
145 ModuleConfig mc = super.getModuleConfig();
146
147 if (mc == null) {
148 mc = (ModuleConfig) this.getRequestScope().get(Globals.MODULE_KEY);
149 }
150
151 return mc;
152 }
153
154 // ISSUE: AbstractSelectModule set the precedent of doing this at the
155 // "web context" level instead of the ServletWebContext level. Consider
156 // whether that's how we want to do it universally for other manipulations
157 // of the RequestScope or not...
158 public void setCancelled(Boolean cancelled) {
159 super.setCancelled(cancelled);
160
161 // historic semantics of "isCancelled" are to consider any non-null
162 // value in the request under Globals.CANCEL_KEY as "yes, this was
163 // cancelled."
164 if ((cancelled != null) && cancelled.booleanValue()) {
165 this.getRequestScope().put(Globals.CANCEL_KEY, cancelled);
166 } else {
167 this.getRequestScope().remove(Globals.CANCEL_KEY);
168 }
169 }
170
171 public Boolean getCancelled() {
172 Boolean cancelled = super.getCancelled();
173
174 if (cancelled == null) {
175 cancelled =
176 (Boolean) this.getRequestScope().get(Globals.CANCEL_KEY);
177 }
178
179 return cancelled;
180 }
181 }