View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.jetspeed.request;
18  
19  import java.lang.reflect.Constructor;
20  import java.util.HashMap;
21  import java.util.Map;
22  
23  import javax.servlet.ServletConfig;
24  import javax.servlet.http.HttpServletRequest;
25  import javax.servlet.http.HttpServletResponse;
26  
27  import org.apache.commons.logging.Log;
28  import org.apache.commons.logging.LogFactory;
29  import org.apache.jetspeed.PortalReservedParameters;
30  import org.apache.jetspeed.aggregator.CurrentWorkerContext;
31  import org.apache.jetspeed.userinfo.UserInfoManager;
32  
33  /***
34   * JetspeedRequestContextComponent
35   *
36   * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
37   * @version $Id: JetspeedRequestContextComponent.java 587064 2007-10-22 11:54:11Z woonsan $
38   */
39  public class JetspeedRequestContextComponent implements RequestContextComponent
40  {
41      private String contextClassName = null;
42      private Class contextClass = null;
43      /*** The user info manager. */
44      private UserInfoManager userInfoMgr;
45      private ThreadLocal tlRequestContext = new ThreadLocal();
46      private Map requestContextObjects;
47      
48      private final static Log log = LogFactory.getLog(JetspeedRequestContextComponent.class);
49  
50      public JetspeedRequestContextComponent(String contextClassName)
51      {
52          this.contextClassName = contextClassName;
53          this.requestContextObjects = new HashMap();
54      }
55  
56      public JetspeedRequestContextComponent(String contextClassName, 
57                                             UserInfoManager userInfoMgr)
58      {
59          this.contextClassName = contextClassName;
60          this.userInfoMgr = userInfoMgr;
61          this.requestContextObjects = new HashMap();        
62      }
63  
64      public JetspeedRequestContextComponent(String contextClassName, 
65              UserInfoManager userInfoMgr,
66              Map requestContextObjects)
67      {
68          this.contextClassName = contextClassName;
69          this.userInfoMgr = userInfoMgr;
70          this.requestContextObjects = requestContextObjects;        
71      }
72      
73      public RequestContext create(HttpServletRequest req, HttpServletResponse resp, ServletConfig config)
74      {
75          RequestContext context = null;
76  
77          try
78          {
79              if (null == contextClass)
80              {
81                  contextClass = Class.forName(contextClassName);
82              }
83  
84              Constructor constructor =
85                  contextClass.getConstructor(
86                      new Class[] {
87                          HttpServletRequest.class,
88                          HttpServletResponse.class,
89                          ServletConfig.class,
90                          UserInfoManager.class,
91                          Map.class});
92              context = (RequestContext) constructor.newInstance(new Object[] { req, resp, config, userInfoMgr, requestContextObjects});
93                      
94          }
95          catch (Exception e)
96          {
97              String msg = "JetspeedRequestContextComponent: Failed to create a Class object for RequestContext: " + e.toString();
98              log.error(msg);
99          }
100         tlRequestContext.set(context);        
101         return context;
102     }
103 
104     public void release(RequestContext context)
105     {
106         tlRequestContext.set(null);
107     }
108 
109     /***
110      * The servlet request can always get you back to the Request Context if you need it
111      * This static accessor provides this capability
112      *
113      * @param request
114      * @return RequestContext
115      */
116     public RequestContext getRequestContext(HttpServletRequest request)
117     {
118         RequestContext rc = (RequestContext) request.getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
119         if(rc != null)
120         {
121             return rc;
122         }
123         else
124         {
125             log.error("Cannot call getRequestContext(HttpServletRequest request) before it has been created and set for this thread.");
126             throw new IllegalStateException("Cannot call getRequestContext(HttpServletRequest request) before it has been created and set for this thread.");
127         }
128     }
129     
130     public RequestContext getRequestContext()
131     {
132         RequestContext rc = null;
133 
134         if (CurrentWorkerContext.getParallelRenderingMode())
135         {
136             rc = (RequestContext) CurrentWorkerContext.getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
137         }
138         else
139         {
140             rc = (RequestContext) tlRequestContext.get();        
141         }
142 
143         if(rc != null)
144         {
145             return rc;
146         }
147         else
148         {
149             log.error("Cannot call getRequestContext() before it has been created and set for this thread.");
150             throw new IllegalStateException("Cannot call getRequestContext() before it has been created and set for this thread.");
151         }
152     }
153 
154 }