View Javadoc

1   /*
2    * $Id: TilesUtilStrutsModulesImpl.java 471754 2006-11-06 14:55:09Z husted $
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 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             // ModuleConfig not found in current request. Select it.
166             ModuleUtils.getInstance().selectModule(request, servletContext);
167             moduleConfig = ModuleUtils.getInstance().getModuleConfig(request);
168         }
169 
170         return moduleConfig;
171     }
172 
173 }