KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > tomcat50 > session > SessionValve50


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright
3  * notice. All rights reserved.
4  */

5 package com.tc.tomcat50.session;
6
7 import org.apache.catalina.Context;
8 import org.apache.catalina.Request;
9 import org.apache.catalina.Response;
10 import org.apache.catalina.ValveContext;
11 import org.apache.catalina.valves.ValveBase;
12 import org.apache.coyote.tomcat5.CoyoteRequest;
13 import org.apache.coyote.tomcat5.CoyoteResponse;
14
15 import com.tc.object.bytecode.ManagerUtil;
16 import com.terracotta.session.TerracottaSessionManager;
17 import com.terracotta.session.WebAppConfig;
18 import com.terracotta.session.util.Assert;
19 import com.terracotta.session.util.ConfigProperties;
20 import com.terracotta.session.util.ContextMgr;
21 import com.terracotta.session.util.DefaultContextMgr;
22 import com.terracotta.session.util.DefaultCookieWriter;
23 import com.terracotta.session.util.DefaultIdGenerator;
24 import com.terracotta.session.util.DefaultLifecycleEventMgr;
25 import com.terracotta.session.util.DefaultWebAppConfig;
26 import com.terracotta.session.util.LifecycleEventMgr;
27 import com.terracotta.session.util.SessionCookieWriter;
28 import com.terracotta.session.util.SessionIdGenerator;
29
30 import java.io.IOException JavaDoc;
31 import java.util.ArrayList JavaDoc;
32 import java.util.HashMap JavaDoc;
33 import java.util.Map JavaDoc;
34
35 import javax.servlet.ServletException JavaDoc;
36 import javax.servlet.http.HttpServletRequest JavaDoc;
37 import javax.servlet.http.HttpSessionAttributeListener JavaDoc;
38 import javax.servlet.http.HttpSessionListener JavaDoc;
39
40 public class SessionValve50 extends ValveBase {
41
42   private final Map JavaDoc mgrs = new HashMap JavaDoc();
43
44   public void invoke(final Request valveReq, final Response valveRes, final ValveContext valveContext)
45       throws IOException JavaDoc, ServletException JavaDoc {
46     if (valveReq instanceof CoyoteRequest && valveRes instanceof CoyoteResponse
47         && TerracottaSessionManager.isDsoSessionApp((HttpServletRequest JavaDoc) valveReq)) {
48       tcInvoke((CoyoteRequest) valveReq, (CoyoteResponse) valveRes, valveContext);
49     } else {
50       valveContext.invokeNext(valveReq, valveRes);
51     }
52   }
53
54   private void tcInvoke(final CoyoteRequest valveReq, final CoyoteResponse valveRes, final ValveContext valveContext)
55       throws IOException JavaDoc, ServletException JavaDoc {
56     TerracottaSessionManager mgr = findOrCreateManager(valveReq, valveReq.getContextPath());
57     SessionRequest50 sReq50 = (SessionRequest50) mgr.preprocess(valveReq, valveRes);
58     SessionResponse50 sRes50 = new SessionResponse50(valveRes, sReq50);
59     sReq50.setSessionResposne50(sRes50);
60     try {
61       valveContext.invokeNext(sReq50, sRes50);
62     } finally {
63       mgr.postprocess(sReq50);
64     }
65   }
66
67   private TerracottaSessionManager findOrCreateManager(CoyoteRequest valveReq, String JavaDoc contextPath) {
68     TerracottaSessionManager rv = null;
69     synchronized (mgrs) {
70       rv = (TerracottaSessionManager) mgrs.get(contextPath);
71       if (rv == null) {
72         rv = createManager(valveReq, contextPath);
73         mgrs.put(contextPath, rv);
74       }
75     }
76     return rv;
77   }
78
79   private static TerracottaSessionManager createManager(CoyoteRequest valveReq, String JavaDoc contextPath) {
80     final WebAppConfig webAppConfig = makeWebAppConfig(valveReq.getContext());
81     final ConfigProperties cp = new ConfigProperties(webAppConfig);
82     
83     String JavaDoc appName = DefaultContextMgr.computeAppName(valveReq);
84     int lockType = ManagerUtil.getSessionLockType(appName);
85     final SessionIdGenerator sig = DefaultIdGenerator.makeInstance(cp, lockType);
86     
87     final SessionCookieWriter scw = DefaultCookieWriter.makeInstance(cp);
88     final LifecycleEventMgr eventMgr = DefaultLifecycleEventMgr.makeInstance(cp);
89     final ContextMgr contextMgr = DefaultContextMgr
90         .makeInstance(contextPath, valveReq.getContext().getServletContext());
91
92     final TerracottaSessionManager rv = new TerracottaSessionManager(sig, scw, eventMgr, contextMgr,
93                                                                      new Tomcat50RequestResponseFactory(), cp);
94     return rv;
95   }
96
97   private static WebAppConfig makeWebAppConfig(Context context) {
98     Assert.pre(context != null);
99     final ArrayList JavaDoc sessionListeners = new ArrayList JavaDoc();
100     final ArrayList JavaDoc attributeListeners = new ArrayList JavaDoc();
101     sortByType(context.getApplicationEventListeners(), sessionListeners, attributeListeners);
102     sortByType(context.getApplicationLifecycleListeners(), sessionListeners, attributeListeners);
103     HttpSessionAttributeListener JavaDoc[] attrList = (HttpSessionAttributeListener JavaDoc[]) attributeListeners
104         .toArray(new HttpSessionAttributeListener JavaDoc[attributeListeners.size()]);
105     HttpSessionListener JavaDoc[] sessList = (HttpSessionListener JavaDoc[]) sessionListeners
106         .toArray(new HttpSessionListener JavaDoc[sessionListeners.size()]);
107     return new DefaultWebAppConfig(context.getManager().getMaxInactiveInterval(), attrList, sessList);
108   }
109
110   private static void sortByType(Object JavaDoc[] listeners, ArrayList JavaDoc sessionListeners, ArrayList JavaDoc attributeListeners) {
111     if (listeners == null) return;
112     for (int i = 0; i < listeners.length; i++) {
113       final Object JavaDoc o = listeners[i];
114       if (o instanceof HttpSessionListener JavaDoc) sessionListeners.add(o);
115       if (o instanceof HttpSessionAttributeListener JavaDoc) attributeListeners.add(o);
116     }
117   }
118
119   public String JavaDoc getClassName() {
120     return getClass().getName();
121   }
122 }
123
Popular Tags