[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. |