[picocontainer-dev] RE: [picocontainer-scm] [5426] java/2.x/trunk/web/web-core/src/java/org/picocontainer/web: make stateless not hit session.setAttribute()
"Michael Rimov" <[email protected]> Tue, 9 Jun 2009 15:19:23 -0700
| Newsgroups | gmane.comp.java.picocontainer.devel |
|---|---|
| Organization | Centerline Computers, Inc |
| Message-ID | <008901c9e950$58829c60$0987d520$@com> |
Woo hoo! :)
Very cool Paul!
-Mike
From: paul-yCVjj/[email protected] [mailto:paul-yCVjj/[email protected]]
Sent: Monday, June 08, 2009 10:46 PM
To: scm-qxt/[email protected]
Subject: [picocontainer-scm] [5426] java/2.x/trunk/web/web-core/src/java/org/picocontainer/web: make stateless not hit session.setAttribute()
Revision
5426 <http://fisheye.codehaus.org/changelog/picocontainer/?cs=5426>
Author
paul
Date
2009-06-09 00:46:01 -0500 (Tue, 09 Jun 2009)
Log Message
make stateless not hit session.setAttribute()
Modified Paths
* java/2.x/trunk/web/examples/ajax-email/src/main/webapp/WEB-INF/appengine-web.xml <>
* java/2.x/trunk/web/examples/ajax-email/src/main/webapp/WEB-INF/web.xml <>
* java/2.x/trunk/web/web-core/src/java/org/picocontainer/web/PicoServletContainerFilter.java <>
* java/2.x/trunk/web/web-core/src/java/org/picocontainer/web/PicoServletContainerListener.java <>
* java/2.x/trunk/web/web-remoting/src/java/org/picocontainer/web/remoting/AbstractPicoWebRemotingServlet.java <>
Diff
Modified: java/2.x/trunk/web/examples/ajax-email/src/main/webapp/WEB-INF/appengine-web.xml (5425 => 5426)
--- java/2.x/trunk/web/examples/ajax-email/src/main/webapp/WEB-INF/appengine-web.xml 2009-06-08 17:48:15 UTC (rev 5425)
+++ java/2.x/trunk/web/examples/ajax-email/src/main/webapp/WEB-INF/appengine-web.xml 2009-06-09 05:46:01 UTC (rev 5426)
@@ -1,7 +1,7 @@
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>ham-scratch</application>
- <sessions-enabled>true</sessions-enabled>
- <version>101</version>
+ <!--sessions-enabled>true</sessions-enabled-->
+ <version>103</version>
<static-files>
<include path="images/*" />
<include path="js/*" />
Modified: java/2.x/trunk/web/examples/ajax-email/src/main/webapp/WEB-INF/web.xml (5425 => 5426)
--- java/2.x/trunk/web/examples/ajax-email/src/main/webapp/WEB-INF/web.xml 2009-06-08 17:48:15 UTC (rev 5425)
+++ java/2.x/trunk/web/examples/ajax-email/src/main/webapp/WEB-INF/web.xml 2009-06-09 05:46:01 UTC (rev 5426)
@@ -11,6 +11,11 @@
<param-value>org.picocontainer.web.sample.ajaxemail.AjaxEmailWebappComposer</param-value>
</context-param>
+ <context-param>
+ <param-name>stateless-webapp</param-name>
+ <param-value>true</param-`value>
+ </context-param>
+
<filter>
<filter-name>picoFilter</filter-name>
<filter-class>org.picocontainer.web.remoting.AbstractPicoWebRemotingServlet$ServletFilter</filter-class>
Modified: java/2.x/trunk/web/web-core/src/java/org/picocontainer/web/PicoServletContainerFilter.java (5425 => 5426)
--- java/2.x/trunk/web/web-core/src/java/org/picocontainer/web/PicoServletContainerFilter.java 2009-06-08 17:48:15 UTC (rev 5425)
+++ java/2.x/trunk/web/web-core/src/java/org/picocontainer/web/PicoServletContainerFilter.java 2009-06-09 05:46:01 UTC (rev 5426)
@@ -34,12 +34,15 @@
public abstract class PicoServletContainerFilter implements Filter, Serializable {
private boolean exposeServletInfrastructure;
+ private boolean isStateless;
public void init(FilterConfig filterConfig) throws ServletException {
ServletContext context = filterConfig.getServletContext();
ScopedContainers scopedContainers = getScopedContainers(context);
setAppContainer(scopedContainers.getApplicationContainer());
+ isStateless = Boolean.parseBoolean(context.getInitParameter(PicoServletContainerListener.STATELESS_WEBAPP));
+
String exposeServletInfrastructureString = filterConfig.getInitParameter("exposeServletInfrastructure");
if (exposeServletInfrastructureString == null || Boolean.parseBoolean(exposeServletInfrastructureString)) {
exposeServletInfrastructure = true;
@@ -72,7 +75,8 @@
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
- HttpSession sess = ((HttpServletRequest) req).getSession();
+ HttpServletRequest servletRequest = (HttpServletRequest) req;
+ HttpSession sess = servletRequest.getSession();
if (exposeServletInfrastructure) {
currentSession.set(sess);
currentRequest.set(req);
@@ -81,25 +85,31 @@
ScopedContainers scopedContainers = getScopedContainers(sess.getServletContext());
- SessionStoreHolder ssh = (SessionStoreHolder) getSessionAttribute(sess, SessionStoreHolder.class.getName());
- if (ssh == null) {
- if (scopedContainers.getSessionContainer().getComponentAdapters().size() > 0) {
- throw new PicoContainerWebException("Session not setup correctly. There are components registered " +
- "at the session level, but no working container to host them");
+ SessionStoreHolder ssh = null;
+ if (!isStateless) {
+
+ ssh = (SessionStoreHolder) sess.getAttribute(SessionStoreHolder.class.getName());
+ if (ssh == null) {
+ if (scopedContainers.getSessionContainer().getComponentAdapters().size() > 0) {
+ throw new PicoContainerWebException("Session not setup correctly. There are components registered " +
+ "at the session level, but no working container to host them");
+ }
+ ssh = new SessionStoreHolder(scopedContainers.getSessionStoring().getCacheForThread(), new DefaultLifecycleState());
}
- ssh = new SessionStoreHolder(scopedContainers.getSessionStoring().getCacheForThread(), new DefaultLifecycleState());
- }
- scopedContainers.getSessionStoring().putCacheForThread(ssh.getStoreWrapper());
- scopedContainers.getSessionState().putLifecycleStateModelForThread(ssh.getLifecycleState());
+ scopedContainers.getSessionStoring().putCacheForThread(ssh.getStoreWrapper());
+ scopedContainers.getSessionState().putLifecycleStateModelForThread(ssh.getLifecycleState());
+ }
scopedContainers.getRequestStoring().resetCacheForThread();
scopedContainers.getRequestState().resetStateModelForThread();
scopedContainers.getRequestContainer().start();
setAppContainer(scopedContainers.getApplicationContainer());
- setSessionContainer(scopedContainers.getSessionContainer());
+ if (!isStateless) {
+ setSessionContainer(scopedContainers.getSessionContainer());
+ }
setRequestContainer(scopedContainers.getRequestContainer());
containersSetupForRequest(scopedContainers.getApplicationContainer(), scopedContainers.getSessionContainer(), scopedContainers.getRequestContainer(), req, resp);
@@ -107,19 +117,25 @@
filterChain.doFilter(req, resp);
setAppContainer(null);
- setSessionContainer(null);
+ if (!isStateless) {
+ setSessionContainer(null);
+ }
setRequestContainer(null);
scopedContainers.getRequestContainer().stop();
scopedContainers.getRequestContainer().dispose();
- sess.setAttribute(SessionStoreHolder.class.getName(), ssh);
-
+ if (!isStateless) {
+ System.out.println("********** Write to Session *******");
+ sess.setAttribute(SessionStoreHolder.class.getName(), ssh);
+ }
scopedContainers.getRequestStoring().invalidateCacheForThread();
scopedContainers.getRequestState().invalidateStateModelForThread();
- scopedContainers.getSessionStoring().invalidateCacheForThread();
- scopedContainers.getSessionState().invalidateStateModelForThread();
+ if (!isStateless) {
+ scopedContainers.getSessionStoring().invalidateCacheForThread();
+ scopedContainers.getSessionState().invalidateStateModelForThread();
+ }
if (exposeServletInfrastructure) {
currentSession.set(null);
@@ -129,10 +145,6 @@
}
- private Object getSessionAttribute(HttpSession sess, String name) {
- return sess.getAttribute(name);
- }
-
protected void containersSetupForRequest(MutablePicoContainer appcontainer, MutablePicoContainer sessionContainer,
MutablePicoContainer requestContainer, ServletRequest req, ServletResponse resp) {
}
Modified: java/2.x/trunk/web/web-core/src/java/org/picocontainer/web/PicoServletContainerListener.java (5425 => 5426)
--- java/2.x/trunk/web/web-core/src/java/org/picocontainer/web/PicoServletContainerListener.java 2009-06-08 17:48:15 UTC (rev 5425)
+++ java/2.x/trunk/web/web-core/src/java/org/picocontainer/web/PicoServletContainerListener.java 2009-06-09 05:46:01 UTC (rev 5426)
@@ -8,10 +8,6 @@
package org.picocontainer.web;
import java.io.Serializable;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.Collection;
-import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
@@ -26,14 +22,10 @@
import org.picocontainer.BehaviorFactory;
import org.picocontainer.LifecycleStrategy;
import org.picocontainer.ComponentMonitor;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.NameBinding;
-import org.picocontainer.PicoException;
-import org.picocontainer.injectors.ConstructorInjection;
+import org.picocontainer.MutablePicoContainer;
import org.picocontainer.monitors.NullComponentMonitor;
import org.picocontainer.lifecycle.StartableLifecycleStrategy;
import org.picocontainer.containers.EmptyPicoContainer;
-import org.picocontainer.containers.AbstractDelegatingPicoContainer;
import org.picocontainer.behaviors.Storing;
import org.picocontainer.behaviors.Guarding;
import org.picocontainer.behaviors.Caching;
@@ -78,7 +70,10 @@
public class PicoServletContainerListener implements ServletContextListener, HttpSessionListener, Serializable {
public static final String WEBAPP_COMPOSER_CLASS = "webapp-composer-class";
-
+
+ public static final String STATELESS_WEBAPP = "stateless-webapp";
+
+ private boolean isStateless;
/**
* Default constructor used in webapp containers
*/
@@ -89,10 +84,14 @@
ServletContext context = event.getServletContext();
+ isStateless = Boolean.parseBoolean(context.getInitParameter(STATELESS_WEBAPP));
+
ScopedContainers scopedContainers = makeScopedContainers();
scopedContainers.getApplicationContainer().setName("application");
- scopedContainers.getSessionContainer().setName("session");
+ if (!isStateless) {
+ scopedContainers.getSessionContainer().setName("session");
+ }
scopedContainers.getRequestContainer().setName("request");
compose(loadComposer(context), context, scopedContainers);
@@ -118,16 +117,30 @@
* @return an instance of ScopedContainers
*/
protected ScopedContainers makeScopedContainers() {
+ return makeScopedContainers(false);
+ }
+ protected ScopedContainers makeScopedContainers(boolean stateless) {
DefaultPicoContainer appCtnr = new DefaultPicoContainer(new Guarding().wrap(new Caching()), makeLifecycleStrategy(), makeParentContainer(), makeAppComponentMonitor());
- Storing sessStoring = new Storing();
- DefaultPicoContainer sessCtnr = new DefaultPicoContainer(new Guarding().wrap(sessStoring), makeLifecycleStrategy(), appCtnr, makeSessionComponentMonitor());
+ DefaultPicoContainer sessCtnr;
+ PicoContainer parentOfRequestContainer;
+ ThreadLocalLifecycleState sessionState;
+ Storing sessStoring;
+ if (stateless) {
+ sessionState = null;
+ sessStoring = null;
+ sessCtnr = null;
+ parentOfRequestContainer = appCtnr;
+ } else {
+ sessionState = new ThreadLocalLifecycleState();
+ sessStoring = new Storing();
+ sessCtnr = new DefaultPicoContainer(new Guarding().wrap(sessStoring), makeLifecycleStrategy(), appCtnr, makeSessionComponentMonitor());
+ sessCtnr.setLifecycleState(sessionState);
+ parentOfRequestContainer = sessCtnr;
+ }
Storing reqStoring = new Storing();
DefaultPicoContainer reqCtnr = new DefaultPicoContainer(new Guarding().wrap(addRequestBehaviors(reqStoring)), makeLifecycleStrategy(), sessCtnr, makeRequestComponentMonitor());
- ThreadLocalLifecycleState sessionState = new ThreadLocalLifecycleState();
ThreadLocalLifecycleState requestState = new ThreadLocalLifecycleState();
- sessCtnr.setLifecycleState(sessionState);
reqCtnr.setLifecycleState(requestState);
-
return new ScopedContainers(appCtnr, sessCtnr, reqCtnr, sessStoring, reqStoring, sessionState, requestState);
}
@@ -180,7 +193,9 @@
protected void compose(WebappComposer composer, ServletContext context, ScopedContainers scopedContainers) {
composer.composeApplication(scopedContainers.getApplicationContainer(), context);
- composer.composeSession(scopedContainers.getSessionContainer());
+ if (!isStateless) {
+ composer.composeSession(scopedContainers.getSessionContainer());
+ }
composer.composeRequest(scopedContainers.getRequestContainer());
}
@@ -195,33 +210,29 @@
}
public void sessionCreated(HttpSessionEvent event) {
-
- HttpSession session = event.getSession();
- ScopedContainers scopedContainers = getScopedContainers(session.getServletContext());
-
- SessionStoreHolder ssh = new SessionStoreHolder(scopedContainers.getSessionStoring().resetCacheForThread(), scopedContainers.getSessionState().resetStateModelForThread());
-
- scopedContainers.getSessionContainer().start();
- session.setAttribute(SessionStoreHolder.class.getName(), ssh);
-
+ if (!isStateless) {
+ HttpSession session = event.getSession();
+ ScopedContainers scopedContainers = getScopedContainers(session.getServletContext());
+ SessionStoreHolder ssh = new SessionStoreHolder(scopedContainers.getSessionStoring().resetCacheForThread(), scopedContainers.getSessionState().resetStateModelForThread());
+ scopedContainers.getSessionContainer().start();
+ session.setAttribute(SessionStoreHolder.class.getName(), ssh);
+ }
}
public void sessionDestroyed(HttpSessionEvent event) {
- HttpSession session = event.getSession();
- ScopedContainers scopedContainers = getScopedContainers(session.getServletContext());
-
- SessionStoreHolder ssh = (SessionStoreHolder) session.getAttribute(SessionStoreHolder.class.getName());
-
- scopedContainers.getSessionStoring().putCacheForThread(ssh.getStoreWrapper());
- scopedContainers.getSessionState().putLifecycleStateModelForThread(ssh.getLifecycleState());
-
- scopedContainers.getSessionContainer().stop();
- scopedContainers.getSessionContainer().dispose();
-
- scopedContainers.getSessionStoring().invalidateCacheForThread();
- scopedContainers.getSessionState().invalidateStateModelForThread();
-
- session.setAttribute(SessionStoreHolder.class.getName(), null);
+ if (!isStateless) {
+ HttpSession session = event.getSession();
+ ScopedContainers scopedContainers = getScopedContainers(session.getServletContext());
+ MutablePicoContainer sessionCtr = scopedContainers.getSessionContainer();
+ SessionStoreHolder ssh = (SessionStoreHolder) session.getAttribute(SessionStoreHolder.class.getName());
+ scopedContainers.getSessionStoring().putCacheForThread(ssh.getStoreWrapper());
+ scopedContainers.getSessionState().putLifecycleStateModelForThread(ssh.getLifecycleState());
+ sessionCtr.stop();
+ sessionCtr.dispose();
+ scopedContainers.getSessionStoring().invalidateCacheForThread();
+ scopedContainers.getSessionState().invalidateStateModelForThread();
+ session.setAttribute(SessionStoreHolder.class.getName(), null);
+ }
}
}
Modified: java/2.x/trunk/web/web-remoting/src/java/org/picocontainer/web/remoting/AbstractPicoWebRemotingServlet.java (5425 => 5426)
--- java/2.x/trunk/web/web-remoting/src/java/org/picocontainer/web/remoting/AbstractPicoWebRemotingServlet.java 2009-06-08 17:48:15 UTC (rev 5425)
+++ java/2.x/trunk/web/web-remoting/src/java/org/picocontainer/web/remoting/AbstractPicoWebRemotingServlet.java 2009-06-09 05:46:01 UTC (rev 5426)
@@ -270,7 +270,10 @@
private void publishAdapters() {
pwr.publishAdapters(currentRequestContainer.get().getComponentAdapters(), REQUEST_SCOPE);
- pwr.publishAdapters(currentSessionContainer.get().getComponentAdapters(), SESSION_SCOPE);
+ MutablePicoContainer sessionContainer = currentSessionContainer.get();
+ if (sessionContainer != null) {
+ pwr.publishAdapters(sessionContainer.getComponentAdapters(), SESSION_SCOPE);
+ }
pwr.publishAdapters(currentAppContainer.get().getComponentAdapters(), APPLICATION_SCOPE);
monitor = currentAppContainer.get().getComponent(PicoWebRemotingMonitor.class);
_____
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email