View Javadoc
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  
22  package org.apache.struts.tiles;
23  
24  import java.io.IOException;
25  
26  import jakarta.servlet.ServletContext;
27  import jakarta.servlet.ServletException;
28  import jakarta.servlet.ServletRequest;
29  import jakarta.servlet.http.HttpServletRequest;
30  import jakarta.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      private static final long serialVersionUID = 2840296621378046205L;
51  
52      /**
53       * Do a forward using request dispatcher.
54       *
55       * This method is used by the Tiles package anytime a forward is required.
56       * @param uri Uri or Definition name to forward.
57       * @param request Current page request.
58       * @param response Current page response.
59       * @param servletContext Current servlet context.
60       */
61      public void doForward(
62          String uri,
63          HttpServletRequest request,
64          HttpServletResponse response,
65          ServletContext servletContext)
66          throws IOException, ServletException {
67  
68          request.getRequestDispatcher(uri).forward(request, response);
69      }
70  
71      /**
72       * Do an include using request dispatcher.
73       *
74       * This method is used by the Tiles package anytime an include is required.
75       * @param uri Uri or Definition name to forward.
76       * @param request Current page request.
77       * @param response Current page response.
78       * @param servletContext Current servlet context.
79       */
80      public void doInclude(
81          String uri,
82          HttpServletRequest request,
83          HttpServletResponse response,
84          ServletContext servletContext)
85          throws IOException, ServletException {
86  
87          request.getRequestDispatcher(uri).include(request, response);
88      }
89  
90      /**
91       * Get the definition factory from appropriate servlet context.
92       * @param request Current request.
93       * @param servletContext Current servlet context.
94       * @return Definitions factory or null if not found.
95       */
96      public DefinitionsFactory getDefinitionsFactory(
97          ServletRequest request,
98          ServletContext servletContext) {
99  
100         return getDefinitionsFactory(
101             servletContext,
102             getModuleConfig((HttpServletRequest) request, servletContext));
103     }
104 
105     /**
106      * Get definition factory for the module attached to specified moduleConfig.
107      * @param servletContext Current servlet context.
108      * @param moduleConfig Module config of the module for which the factory is requested.
109      * @return Definitions factory or null if not found.
110      */
111     public DefinitionsFactory getDefinitionsFactory(
112         ServletContext servletContext,
113         ModuleConfig moduleConfig) {
114 
115         return (DefinitionsFactory) servletContext.getAttribute(
116             DEFINITIONS_FACTORY + moduleConfig.getPrefix());
117     }
118 
119     /**
120      * Make definition factory accessible to tags.
121      * Factory is stored in servlet context.
122      * @param factory Factory to be made accessible.
123      * @param servletContext Current servlet context.
124      */
125     protected void makeDefinitionsFactoryAccessible(
126         DefinitionsFactory factory,
127         ServletContext servletContext) {
128 
129         String prefix = factory.getConfig().getFactoryName();
130         servletContext.setAttribute(DEFINITIONS_FACTORY + prefix, factory);
131     }
132 
133     /**
134      * Get Tiles RequestProcessor associated to the current module.
135      * @param request Current request.
136      * @param servletContext Current servlet context.
137      * @return The {@link TilesRequestProcessor} for the current request.
138      */
139     protected TilesRequestProcessor getRequestProcessor(
140         HttpServletRequest request,
141         ServletContext servletContext) {
142 
143         ModuleConfig moduleConfig = getModuleConfig(request, servletContext);
144 
145         return (TilesRequestProcessor) servletContext.getAttribute(
146             Globals.REQUEST_PROCESSOR_KEY + moduleConfig.getPrefix());
147     }
148 
149     /**
150      * Get the current ModuleConfig.
151      * <br>
152      * Lookup in the request and do selectModule if not found. The side effect
153      * is, that the ModuleConfig object is set in the request if it was not present.
154      * @param request Current request.
155      * @param servletContext Current servlet context*.
156      * @return The ModuleConfig for current request.
157      */
158     protected ModuleConfig getModuleConfig(
159         HttpServletRequest request,
160         ServletContext servletContext) {
161 
162         ModuleConfig moduleConfig =
163             ModuleUtils.getInstance().getModuleConfig(request);
164 
165         if (moduleConfig == null) {
166             // ModuleConfig not found in current request. Select it.
167             ModuleUtils.getInstance().selectModule(request, servletContext);
168             moduleConfig = ModuleUtils.getInstance().getModuleConfig(request);
169         }
170 
171         return moduleConfig;
172     }
173 
174 }