1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts.util;
22
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25 import org.apache.struts.Globals;
26 import org.apache.struts.action.RequestProcessor;
27 import org.apache.struts.config.MessageResourcesConfig;
28 import org.apache.struts.config.ModuleConfig;
29
30 import javax.servlet.ServletContext;
31 import javax.servlet.http.HttpServletRequest;
32
33 /**
34 * General purpose utility methods related to module processing.
35 *
36 * @version $Rev: 471754 $
37 * @since Struts 1.2
38 */
39 public class ModuleUtils {
40 /**
41 * The Singleton instance.
42 */
43 private static final ModuleUtils instance = new ModuleUtils();
44
45 /**
46 * Commons logging instance.
47 */
48 private static final Log log = LogFactory.getLog(ModuleUtils.class);
49
50 /**
51 * Constructor for ModuleUtils.
52 */
53 protected ModuleUtils() {
54 super();
55 }
56
57 /**
58 * Returns the Singleton instance of TagUtils.
59 */
60 public static ModuleUtils getInstance() {
61 return instance;
62 }
63
64 /**
65 * Return the current ModuleConfig object stored in request, if it exists,
66 * null otherwise. This method can be used by plugin to retrieve the
67 * current module config object. If no moduleConfig is found, this means
68 * that the request haven't hit the server throught the struts servlet.
69 * The appropriate module config can be set and found with <code>{@link
70 * ModuleUtils#selectModule(HttpServletRequest, ServletContext)} </code>.
71 *
72 * @param request The servlet request we are processing
73 * @return the ModuleConfig object from request, or null if none is set in
74 * the request.
75 */
76 public ModuleConfig getModuleConfig(HttpServletRequest request) {
77 return (ModuleConfig) request.getAttribute(Globals.MODULE_KEY);
78 }
79
80 /**
81 * Return the desired ModuleConfig object stored in context, if it exists,
82 * null otherwise.
83 *
84 * @param prefix The module prefix of the desired module
85 * @param context The ServletContext for this web application
86 * @return the ModuleConfig object specified, or null if not found in the
87 * context.
88 */
89 public ModuleConfig getModuleConfig(String prefix, ServletContext context) {
90 if ((prefix == null) || "/".equals(prefix)) {
91 return (ModuleConfig) context.getAttribute(Globals.MODULE_KEY);
92 } else {
93 return (ModuleConfig) context.getAttribute(Globals.MODULE_KEY
94 + prefix);
95 }
96 }
97
98 /**
99 * Return the desired ModuleConfig object stored in context, if it exists,
100 * otherwise return the current ModuleConfig
101 *
102 * @param prefix The module prefix of the desired module
103 * @param request The servlet request we are processing
104 * @param context The ServletContext for this web application
105 * @return the ModuleConfig object specified, or null if not found in the
106 * context.
107 */
108 public ModuleConfig getModuleConfig(String prefix,
109 HttpServletRequest request, ServletContext context) {
110 ModuleConfig moduleConfig = null;
111
112 if (prefix != null) {
113
114 moduleConfig = this.getModuleConfig(prefix, context);
115 } else {
116
117 moduleConfig = this.getModuleConfig(request, context);
118 }
119
120 return moduleConfig;
121 }
122
123 /**
124 * Return the ModuleConfig object is it exists, null otherwise.
125 *
126 * @param request The servlet request we are processing
127 * @param context The ServletContext for this web application
128 * @return the ModuleConfig object
129 */
130 public ModuleConfig getModuleConfig(HttpServletRequest request,
131 ServletContext context) {
132 ModuleConfig moduleConfig = this.getModuleConfig(request);
133
134 if (moduleConfig == null) {
135 moduleConfig = this.getModuleConfig("", context);
136 request.setAttribute(Globals.MODULE_KEY, moduleConfig);
137 }
138
139 return moduleConfig;
140 }
141
142 /**
143 * Get the module name to which the specified request belong.
144 *
145 * @param request The servlet request we are processing
146 * @param context The ServletContext for this web application
147 * @return The module prefix or ""
148 */
149 public String getModuleName(HttpServletRequest request,
150 ServletContext context) {
151
152 String matchPath =
153 (String) request.getAttribute(RequestProcessor.INCLUDE_SERVLET_PATH);
154
155 if (matchPath == null) {
156 matchPath = request.getServletPath();
157 }
158
159 return this.getModuleName(matchPath, context);
160 }
161
162 /**
163 * Get the module name to which the specified uri belong.
164 *
165 * @param matchPath The uri from which we want the module name.
166 * @param context The ServletContext for this web application
167 * @return The module prefix or ""
168 */
169 public String getModuleName(String matchPath, ServletContext context) {
170 if (log.isDebugEnabled()) {
171 log.debug("Get module name for path " + matchPath);
172 }
173
174 String prefix = "";
175 String[] prefixes = getModulePrefixes(context);
176
177
178 int lastSlash = 0;
179
180 while (prefix.equals("")
181 && ((lastSlash = matchPath.lastIndexOf("/")) > 0)) {
182
183 matchPath = matchPath.substring(0, lastSlash);
184
185
186 for (int i = 0; i < prefixes.length; i++) {
187 if (matchPath.equals(prefixes[i])) {
188 prefix = prefixes[i];
189
190 break;
191 }
192 }
193 }
194
195 if (log.isDebugEnabled()) {
196 log.debug("Module name found: "
197 + (prefix.equals("") ? "default" : prefix));
198 }
199
200 return prefix;
201 }
202
203 /**
204 * Return the list of module prefixes that are defined for this web
205 * application. <strong>NOTE</strong> - the "" prefix for the default
206 * module is not included in this list.
207 *
208 * @param context The ServletContext for this web application.
209 * @return An array of module prefixes.
210 */
211 public String[] getModulePrefixes(ServletContext context) {
212 return (String[]) context.getAttribute(Globals.MODULE_PREFIXES_KEY);
213 }
214
215 /**
216 * Select the module to which the specified request belongs, and add
217 * corresponding request attributes to this request.
218 *
219 * @param request The servlet request we are processing
220 * @param context The ServletContext for this web application
221 */
222 public void selectModule(HttpServletRequest request, ServletContext context) {
223
224 String prefix = getModuleName(request, context);
225
226
227 this.selectModule(prefix, request, context);
228 }
229
230 /**
231 * Select the module to which the specified request belongs, and add
232 * corresponding request attributes to this request.
233 *
234 * @param prefix The module prefix of the desired module
235 * @param request The servlet request we are processing
236 * @param context The ServletContext for this web application
237 */
238 public void selectModule(String prefix, HttpServletRequest request,
239 ServletContext context) {
240
241 ModuleConfig config = getModuleConfig(prefix, context);
242
243 if (config != null) {
244 request.setAttribute(Globals.MODULE_KEY, config);
245
246 MessageResourcesConfig[] mrConfig =
247 config.findMessageResourcesConfigs();
248
249 for (int i = 0; i < mrConfig.length; i++) {
250 String key = mrConfig[i].getKey();
251 MessageResources resources =
252 (MessageResources) context.getAttribute(key + prefix);
253
254 if (resources != null) {
255 request.setAttribute(key, resources);
256 } else {
257 request.removeAttribute(key);
258 }
259 }
260 } else {
261 request.removeAttribute(Globals.MODULE_KEY);
262 }
263 }
264 }