[Statelessfilter-commits] SF.net SVN: statelessfilter:[110] trunk/stateless-core/src/main/java/net/
Status: Beta
Brought to you by:
nricheton
|
From: <nri...@us...> - 2012-09-21 15:59:03
|
Revision: 110
http://statelessfilter.svn.sourceforge.net/statelessfilter/?rev=110&view=rev
Author: nricheton
Date: 2012-09-21 15:58:53 +0000 (Fri, 21 Sep 2012)
Log Message:
-----------
Javadoc
Modified Paths:
--------------
trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/BufferedServletOutputStream.java
trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/StatelessRequestWrapper.java
trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/headers/HeaderBufferedHttpResponseWrapper.java
Modified: trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/BufferedServletOutputStream.java
===================================================================
--- trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/BufferedServletOutputStream.java 2012-08-30 21:55:28 UTC (rev 109)
+++ trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/BufferedServletOutputStream.java 2012-09-21 15:58:53 UTC (rev 110)
@@ -1,5 +1,5 @@
/*
- * Copyright 2009-2012 Capgemini
+ * Copyright 2009-2012 Capgemini and others
*
* Licensed under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with the
@@ -19,11 +19,18 @@
import javax.servlet.ServletOutputStream;
+import net.sourceforge.statelessfilter.wrappers.headers.HeaderBufferedHttpResponseWrapper;
+
/**
* A custom servlet output stream that stores its data in a buffer, rather than
* sending it directly to the client.
*
+ * <p>
+ * In most cases, it is better to use {@link HeaderBufferedHttpResponseWrapper} instead.
+ *
+ *
* @author Eric M. Burke
+ * @author Nicolas Richeton
*/
public class BufferedServletOutputStream extends ServletOutputStream {
// the actual buffer
Modified: trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/StatelessRequestWrapper.java
===================================================================
--- trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/StatelessRequestWrapper.java 2012-08-30 21:55:28 UTC (rev 109)
+++ trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/StatelessRequestWrapper.java 2012-09-21 15:58:53 UTC (rev 110)
@@ -1,5 +1,5 @@
/*
- * Copyright 2009-2012 Capgemini
+ * Copyright 2009-2012 Capgemini and others
*
* Licensed under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with the
@@ -40,7 +40,7 @@
/**
* Stateless request wrapper
*
- * @author Nicolas Richeton - Capgemini
+ * @author Nicolas Richeton
*
*/
public class StatelessRequestWrapper extends HttpServletRequestWrapper {
@@ -52,6 +52,7 @@
HttpServletRequest originalRequest = null;
StatelessSession session = null;
+
private boolean sessionWritten;
public boolean isSessionWritten() {
@@ -64,7 +65,8 @@
* @param request
* @param backends
*/
- public StatelessRequestWrapper(HttpServletRequest request, Configuration backends) {
+ public StatelessRequestWrapper(HttpServletRequest request,
+ Configuration backends) {
super(request);
originalRequest = request;
this.backends = backends;
@@ -72,6 +74,11 @@
/**
* Returns real server session.
+ * <p>
+ * This method should only be used for pass-through implementations or to
+ * get Servlet context. Implementation should not store data in this session
+ * as Statelessfilter is intended to make application independant of the
+ * container session.
*
* @return
*/
@@ -80,9 +87,11 @@
}
/**
- * (non-Javadoc)
*
- * @see javax.servlet.http.HttpServletRequestWrapper#getSession()
+ *
+ * {@inheritDoc} javax.servlet.http.HttpServletRequestWrapper#getSession()
+ *
+ * Returns a custom session object.
*/
@Override
public HttpSession getSession() {
@@ -125,7 +134,8 @@
* @param myresponse
* @throws IOException
*/
- public void writeSession(HttpServletRequest myrequest, HttpServletResponse myresponse) throws IOException {
+ public void writeSession(HttpServletRequest myrequest,
+ HttpServletResponse myresponse) throws IOException {
// If there is a session (session requested by the application)
if (session != null) {
@@ -152,26 +162,32 @@
List<String> modifiedBackends = new ArrayList<String>();
// Remaining modified attributes to process
- List<String> remainingModifiedAttributes = new ArrayList<String>(modifiedAttributes);
+ List<String> remainingModifiedAttributes = new ArrayList<String>(
+ modifiedAttributes);
// Attributes for each backend
Map<String, ISessionData> attributesDispatched = new HashMap<String, ISessionData>();
Map<String, List<String>> modifiedAttributesDispatched = new HashMap<String, List<String>>();
for (String name : sessionAttributes.keySet()) {
if (isAttributeMapped(name)) {
- getBackendSessionData(attributesDispatched, backends.backendsAttributeMapping.get(name), requestId)
- .getContent().put(name, sessionAttributes.get(name));
+ getBackendSessionData(attributesDispatched,
+ backends.backendsAttributeMapping.get(name),
+ requestId).getContent().put(name,
+ sessionAttributes.get(name));
setModified(modifiedBackends, modifiedAttributes, name);
- logger.info(INFO_USES, name, backends.backendsAttributeMapping.get(name));
+ logger.info(INFO_USES, name,
+ backends.backendsAttributeMapping.get(name));
} else {
- getBackendSessionData(attributesDispatched, backends.defaultBackend, requestId).getContent().put(
- name, sessionAttributes.get(name));
+ getBackendSessionData(attributesDispatched,
+ backends.defaultBackend, requestId).getContent()
+ .put(name, sessionAttributes.get(name));
setModified(modifiedBackends, modifiedAttributes, name);
- logger.info(INFO_USES_DEFAULT, name, backends.defaultBackend);
+ logger.info(INFO_USES_DEFAULT, name,
+ backends.defaultBackend);
}
@@ -183,10 +199,12 @@
for (String name : remainingModifiedAttributes) {
if (isAttributeMapped(name)) {
setModified(modifiedBackends, modifiedAttributes, name);
- logger.info(INFO_USES, name, backends.backendsAttributeMapping.get(name));
+ logger.info(INFO_USES, name,
+ backends.backendsAttributeMapping.get(name));
} else {
setModified(modifiedBackends, modifiedAttributes, name);
- logger.info(INFO_USES_DEFAULT, name, backends.defaultBackend);
+ logger.info(INFO_USES_DEFAULT, name,
+ backends.defaultBackend);
}
}
@@ -196,15 +214,19 @@
for (String back : backends.backends.keySet()) {
ISessionBackend backend = backends.backends.get(back);
- backend.save(getBackendSessionData(attributesDispatched, back, requestId),
- modifiedAttributesDispatched.get(back), originalRequest, myresponse);
+ backend.save(
+ getBackendSessionData(attributesDispatched, back,
+ requestId), modifiedAttributesDispatched
+ .get(back), originalRequest, myresponse);
}
} else {
// Update only modified backends.
for (String back : modifiedBackends) {
ISessionBackend backend = backends.backends.get(back);
- backend.save(getBackendSessionData(attributesDispatched, back, requestId),
- modifiedAttributesDispatched.get(back), originalRequest, myresponse);
+ backend.save(
+ getBackendSessionData(attributesDispatched, back,
+ requestId), modifiedAttributesDispatched
+ .get(back), originalRequest, myresponse);
}
}
}
@@ -239,7 +261,8 @@
* @param requestId
* @return
*/
- private ISessionData getBackendSessionData(Map<String, ISessionData> dispatched, String name, long requestId) {
+ private ISessionData getBackendSessionData(
+ Map<String, ISessionData> dispatched, String name, long requestId) {
if (dispatched.containsKey(name)) {
return dispatched.get(name);
@@ -303,14 +326,16 @@
* @param modifiedAttributes
* @param attributeName
*/
- private void setModified(List<String> modifiedBackends, List<String> modifiedAttributes, String attributeName) {
+ private void setModified(List<String> modifiedBackends,
+ List<String> modifiedAttributes, String attributeName) {
String backend = backends.backendsAttributeMapping.get(attributeName);
if (StringUtils.isEmpty(backend)) {
backend = backends.defaultBackend;
}
- if (modifiedAttributes.contains(attributeName) && !modifiedBackends.contains(backend)) {
+ if (modifiedAttributes.contains(attributeName)
+ && !modifiedBackends.contains(backend)) {
modifiedBackends.add(backend);
Modified: trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/headers/HeaderBufferedHttpResponseWrapper.java
===================================================================
--- trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/headers/HeaderBufferedHttpResponseWrapper.java 2012-08-30 21:55:28 UTC (rev 109)
+++ trunk/stateless-core/src/main/java/net/sourceforge/statelessfilter/wrappers/headers/HeaderBufferedHttpResponseWrapper.java 2012-09-21 15:58:53 UTC (rev 110)
@@ -1,5 +1,6 @@
/*
- * Copyright 2009-2010 Capgemini
+ * Copyright 2009-2012 Capgemini and others
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
@@ -25,78 +26,129 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import net.sourceforge.statelessfilter.wrappers.BufferedHttpResponseWrapper;
import net.sourceforge.statelessfilter.wrappers.StatelessRequestWrapper;
/**
- * A custom response wrapper that captures all output in a buffer.
+ * A custom response wrapper that inject session data before sending content
+ * output.
+ * <p>
+ * Session data can no longer be modified after the application has started to
+ * write to output stream.
+ * <p>
+ * This changes slightly the behavior of the container since it would usually
+ * prevent session creation in this case, but not session data modifications.
+ * However, most frameworks ensure to have updated session and application data
+ * BEFORE doing any output. As a result, this wrapper is safe for most uses.
*
- * @author Nicolas Richeton - Capgemini
+ * <p>
+ * This wrappers uses much less memory than {@link BufferedHttpResponseWrapper}
+ * since it does not cache the whole response data.
+ *
+ * @author Nicolas Richeton
*/
-public class HeaderBufferedHttpResponseWrapper extends HttpServletResponseWrapper {
- Logger logger = LoggerFactory.getLogger(HeaderBufferedHttpResponseWrapper.class);
+public class HeaderBufferedHttpResponseWrapper extends
+ HttpServletResponseWrapper {
+ Logger logger = LoggerFactory
+ .getLogger(HeaderBufferedHttpResponseWrapper.class);
- private StatelessRequestWrapper statelessRequest = null;
- HttpServletResponse origResponse = null;
+ private StatelessRequestWrapper statelessRequest = null;
+ HttpServletResponse origResponse = null;
- public HeaderBufferedHttpResponseWrapper(StatelessRequestWrapper request, HttpServletResponse origResponse) {
- super(origResponse);
- this.origResponse = origResponse;
- this.statelessRequest = request;
- logger.debug("Init HeaderBufferedHttpResponseWrapper");
- }
+ public HeaderBufferedHttpResponseWrapper(StatelessRequestWrapper request,
+ HttpServletResponse origResponse) {
+ super(origResponse);
+ this.origResponse = origResponse;
+ this.statelessRequest = request;
+ logger.debug("Init HeaderBufferedHttpResponseWrapper");
+ }
- private void writeSession() throws IOException {
- if (!statelessRequest.isSessionWritten()) {
- logger.debug("writting session");
+ /**
+ * Write session data if necessary (session not already written).
+ *
+ * @throws IOException
+ */
+ private void writeSession() throws IOException {
+ if (!statelessRequest.isSessionWritten()) {
+ logger.debug("writting session");
- statelessRequest.writeSession(statelessRequest, origResponse);
- } else {
- logger.debug("session already written");
+ statelessRequest.writeSession(statelessRequest, origResponse);
+ } else {
+ logger.debug("session already written");
- }
- }
+ }
+ }
- @Override
- public void flushBuffer() throws IOException {
- logger.debug("flushBuffer()");
- writeSession();
- super.flushBuffer();
- }
+ /**
+ * {@inheritDoc} javax.servlet.ServletResponseWrapper#flushBuffer()
+ */
+ @Override
+ public void flushBuffer() throws IOException {
+ logger.debug("flushBuffer()");
+ // Write session before invoking the standard behavior
+ writeSession();
+ super.flushBuffer();
+ }
- @Override
- public ServletOutputStream getOutputStream() throws IOException {
- logger.debug("getOutputStream()");
- writeSession();
- return super.getOutputStream();
- }
+ /**
+ * {@inheritDoc} javax.servlet.ServletResponseWrapper#getOutputStream()
+ */
+ @Override
+ public ServletOutputStream getOutputStream() throws IOException {
+ logger.debug("getOutputStream() has been called");
+ // Write session before invoking the standard behavior
+ writeSession();
+ return super.getOutputStream();
+ }
- @Override
- public PrintWriter getWriter() throws IOException {
- logger.debug("getWriter()");
- writeSession();
+ /**
+ * {@inheritDoc} javax.servlet.ServletResponseWrapper#getWriter()
+ */
+ @Override
+ public PrintWriter getWriter() throws IOException {
+ logger.debug("getWriter() has been called");
+ // Write session before invoking the standard behavior
+ writeSession();
- return super.getWriter();
- }
+ return super.getWriter();
+ }
- @Override
- public void sendError(int sc) throws IOException {
- logger.debug("sendError()");
- writeSession();
- super.sendError(sc);
- }
+ /**
+ * {@inheritDoc}
+ * javax.servlet.http.HttpServletResponseWrapper#sendError(int)
+ */
+ @Override
+ public void sendError(int sc) throws IOException {
+ logger.debug("sendError() has been called");
+ // Write session before invoking the standard behavior
+ writeSession();
+ super.sendError(sc);
+ }
- @Override
- public void sendError(int sc, String msg) throws IOException {
- logger.debug("sendError()");
- writeSession();
- super.sendError(sc, msg);
- }
+ /**
+ * {@inheritDoc}
+ * javax.servlet.http.HttpServletResponseWrapper#sendError(int,
+ * java.lang.String)
+ */
+ @Override
+ public void sendError(int sc, String msg) throws IOException {
+ logger.debug("sendError() has been called");
+ // Write session before invoking the standard behavior
+ writeSession();
+ super.sendError(sc, msg);
+ }
- @Override
- public void sendRedirect(String location) throws IOException {
- logger.debug("sendRedirect()");
- writeSession();
- super.sendRedirect(location);
- }
+ /**
+ * {@inheritDoc}
+ * javax.servlet.http.HttpServletResponseWrapper#sendRedirect(java.lang.
+ * String)
+ */
+ @Override
+ public void sendRedirect(String location) throws IOException {
+ logger.debug("sendRedirect() has been called");
+ // Write session before invoking the standard behavior
+ writeSession();
+ super.sendRedirect(location);
+ }
}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|