KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > tomcat55 > session > SessionValve55


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