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