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.IOException;
25
26 import javax.servlet.ServletContext;
27 import javax.servlet.ServletException;
28 import javax.servlet.ServletRequest;
29 import javax.servlet.http.HttpServletRequest;
30 import javax.servlet.http.HttpServletResponse;
31
32 import org.apache.struts.Globals;
33 import org.apache.struts.config.ModuleConfig;
34 import org.apache.struts.util.ModuleUtils;
35
36 /**
37 * Implementation of TilesUtil for Struts multi modules.
38 * Methods in this implementation are aware of the Struts module context.
39 * <br>
40 * <ul>
41 * <li>The method getFactory(...) returns the factory for the current Struts
42 * module.</li>
43 * <li>Methods doForward() and doInclude() use their counterparts in the
44 * current RequestProcessor (todo).</li>
45 * <li>The method createFactory(...) creates a factory for the current module and
46 * stores it under the appropriate property name.</li>
47 * </ul>
48 */
49 public class TilesUtilStrutsModulesImpl extends TilesUtilStrutsImpl {
50
51 /**
52 * Do a forward using request dispatcher.
53 *
54 * This method is used by the Tiles package anytime a forward is required.
55 * @param uri Uri or Definition name to forward.
56 * @param request Current page request.
57 * @param response Current page response.
58 * @param servletContext Current servlet context.
59 */
60 public void doForward(
61 String uri,
62 HttpServletRequest request,
63 HttpServletResponse response,
64 ServletContext servletContext)
65 throws IOException, ServletException {
66
67 request.getRequestDispatcher(uri).forward(request, response);
68 }
69
70 /**
71 * Do an include using request dispatcher.
72 *
73 * This method is used by the Tiles package anytime an include is required.
74 * @param uri Uri or Definition name to forward.
75 * @param request Current page request.
76 * @param response Current page response.
77 * @param servletContext Current servlet context.
78 */
79 public void doInclude(
80 String uri,
81 HttpServletRequest request,
82 HttpServletResponse response,
83 ServletContext servletContext)
84 throws IOException, ServletException {
85
86 request.getRequestDispatcher(uri).include(request, response);
87 }
88
89 /**
90 * Get the definition factory from appropriate servlet context.
91 * @param request Current request.
92 * @param servletContext Current servlet context.
93 * @return Definitions factory or null if not found.
94 */
95 public DefinitionsFactory getDefinitionsFactory(
96 ServletRequest request,
97 ServletContext servletContext) {
98
99 return getDefinitionsFactory(
100 servletContext,
101 getModuleConfig((HttpServletRequest) request, servletContext));
102 }
103
104 /**
105 * Get definition factory for the module attached to specified moduleConfig.
106 * @param servletContext Current servlet context.
107 * @param moduleConfig Module config of the module for which the factory is requested.
108 * @return Definitions factory or null if not found.
109 */
110 public DefinitionsFactory getDefinitionsFactory(
111 ServletContext servletContext,
112 ModuleConfig moduleConfig) {
113
114 return (DefinitionsFactory) servletContext.getAttribute(
115 DEFINITIONS_FACTORY + moduleConfig.getPrefix());
116 }
117
118 /**
119 * Make definition factory accessible to tags.
120 * Factory is stored in servlet context.
121 * @param factory Factory to be made accessible.
122 * @param servletContext Current servlet context.
123 */
124 protected void makeDefinitionsFactoryAccessible(
125 DefinitionsFactory factory,
126 ServletContext servletContext) {
127
128 String prefix = factory.getConfig().getFactoryName();
129 servletContext.setAttribute(DEFINITIONS_FACTORY + prefix, factory);
130 }
131
132 /**
133 * Get Tiles RequestProcessor associated to the current module.
134 * @param request Current request.
135 * @param servletContext Current servlet context.
136 * @return The {@link TilesRequestProcessor} for the current request.
137 */
138 protected TilesRequestProcessor getRequestProcessor(
139 HttpServletRequest request,
140 ServletContext servletContext) {
141
142 ModuleConfig moduleConfig = getModuleConfig(request, servletContext);
143
144 return (TilesRequestProcessor) servletContext.getAttribute(
145 Globals.REQUEST_PROCESSOR_KEY + moduleConfig.getPrefix());
146 }
147
148 /**
149 * Get the current ModuleConfig.
150 * <br>
151 * Lookup in the request and do selectModule if not found. The side effect
152 * is, that the ModuleConfig object is set in the request if it was not present.
153 * @param request Current request.
154 * @param servletContext Current servlet context*.
155 * @return The ModuleConfig for current request.
156 */
157 protected ModuleConfig getModuleConfig(
158 HttpServletRequest request,
159 ServletContext servletContext) {
160
161 ModuleConfig moduleConfig =
162 ModuleUtils.getInstance().getModuleConfig(request);
163
164 if (moduleConfig == null) {
165
166 ModuleUtils.getInstance().selectModule(request, servletContext);
167 moduleConfig = ModuleUtils.getInstance().getModuleConfig(request);
168 }
169
170 return moduleConfig;
171 }
172
173 }