1 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 ; 33 import java.util.ArrayList ; 34 import java.util.HashMap ; 35 import java.util.Map ; 36 37 import javax.servlet.ServletException ; 38 import javax.servlet.http.HttpSessionAttributeListener ; 39 import javax.servlet.http.HttpSessionListener ; 40 41 public class SessionValve55 extends ValveBase { 42 43 private final Map mgrs = new HashMap (); 44 45 public void invoke(Request valveReq, Response valveRes) throws IOException , ServletException { 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 , ServletException { 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 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 contextPath) { 79 final ConfigProperties cp = new ConfigProperties(makeWebAppConfig(valveReq.getContext())); 80 81 String 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 sessionListeners = new ArrayList (); 97 final ArrayList attributeListeners = new ArrayList (); 98 sortByType(context.getApplicationEventListeners(), sessionListeners, attributeListeners); 99 sortByType(context.getApplicationLifecycleListeners(), sessionListeners, attributeListeners); 100 HttpSessionAttributeListener [] attrList = (HttpSessionAttributeListener []) attributeListeners 101 .toArray(new HttpSessionAttributeListener [attributeListeners.size()]); 102 HttpSessionListener [] sessList = (HttpSessionListener []) sessionListeners 103 .toArray(new HttpSessionListener [sessionListeners.size()]); 104 return new DefaultWebAppConfig(context.getManager().getMaxInactiveInterval(), attrList, sessList); 105 } 106 107 private static void sortByType(Object [] listeners, ArrayList sessionListeners, ArrayList attributeListeners) { 108 if (listeners == null) return; 109 for (int i = 0; i < listeners.length; i++) { 110 Object o = listeners[i]; 111 if (o instanceof HttpSessionListener ) sessionListeners.add(o); 112 if (o instanceof HttpSessionAttributeListener ) attributeListeners.add(o); 113 } 114 } 115 116 public String getClassName() { 117 return getClass().getName(); 118 } 119 } 120 | Popular Tags |