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.aggregator.Worker;
32  import org.apache.jetspeed.userinfo.UserInfoManager;
33  
34  /***
35   * JetspeedRequestContextComponent
36   *
37   * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
38   * @version $Id: JetspeedRequestContextComponent.java 554827 2007-07-10 05:12:23Z taylor $
39   */
40  public class JetspeedRequestContextComponent implements RequestContextComponent
41  {
42      private String contextClassName = null;
43      private Class contextClass = null;
44      /*** The user info manager. */
45      private UserInfoManager userInfoMgr;
46      private ThreadLocal tlRequestContext = new ThreadLocal();
47      private Map requestContextObjects;
48      
49      private final static Log log = LogFactory.getLog(JetspeedRequestContextComponent.class);
50  
51      public JetspeedRequestContextComponent(String contextClassName)
52      {
53          this.contextClassName = contextClassName;
54          this.requestContextObjects = new HashMap();
55      }
56  
57      public JetspeedRequestContextComponent(String contextClassName, 
58                                             UserInfoManager userInfoMgr)
59      {
60          this.contextClassName = contextClassName;
61          this.userInfoMgr = userInfoMgr;
62          this.requestContextObjects = new HashMap();        
63      }
64  
65      public JetspeedRequestContextComponent(String contextClassName, 
66              UserInfoManager userInfoMgr,
67              Map requestContextObjects)
68      {
69          this.contextClassName = contextClassName;
70          this.userInfoMgr = userInfoMgr;
71          this.requestContextObjects = requestContextObjects;        
72      }
73      
74      public RequestContext create(HttpServletRequest req, HttpServletResponse resp, ServletConfig config)
75      {
76          RequestContext context = null;
77  
78          try
79          {
80              if (null == contextClass)
81              {
82                  contextClass = Class.forName(contextClassName);
83              }
84  
85              Constructor constructor =
86                  contextClass.getConstructor(
87                      new Class[] {
88                          HttpServletRequest.class,
89                          HttpServletResponse.class,
90                          ServletConfig.class,
91                          UserInfoManager.class,
92                          Map.class});
93              context = (RequestContext) constructor.newInstance(new Object[] { req, resp, config, userInfoMgr, requestContextObjects});
94                      
95          }
96          catch (Exception e)
97          {
98              String msg = "JetspeedRequestContextComponent: Failed to create a Class object for RequestContext: " + e.toString();
99              log.error(msg);
100         }
101         tlRequestContext.set(context);        
102         return context;
103     }
104 
105     public void release(RequestContext context)
106     {
107         tlRequestContext.set(null);
108     }
109 
110     /***
111      * The servlet request can always get you back to the Request Context if you need it
112      * This static accessor provides this capability
113      *
114      * @param request
115      * @return RequestContext
116      */
117     public RequestContext getRequestContext(HttpServletRequest request)
118     {
119         RequestContext rc = (RequestContext) request.getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
120         if(rc != null)
121         {
122             return rc;
123         }
124         else
125         {
126             log.error("Cannot call getRequestContext(HttpServletRequest request) before it has been created and set for this thread.");
127             throw new IllegalStateException("Cannot call getRequestContext(HttpServletRequest request) before it has been created and set for this thread.");
128         }
129     }
130     
131     public RequestContext getRequestContext()
132     {
133         RequestContext rc = null;
134 
135         Thread ct = Thread.currentThread();
136         if (ct instanceof Worker || CurrentWorkerContext.getCurrentWorkerContextUsed())
137         {
138             rc = (RequestContext) CurrentWorkerContext.getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
139         }
140         else
141         {
142             rc = (RequestContext) tlRequestContext.get();        
143         }
144 
145         if(rc != null)
146         {
147             return rc;
148         }
149         else
150         {
151             log.error("Cannot call getRequestContext() before it has been created and set for this thread.");
152             throw new IllegalStateException("Cannot call getRequestContext() before it has been created and set for this thread.");
153         }
154     }
155 
156 }