1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 }