You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2010/02/03 15:24:10 UTC
svn commit: r906062 -
/sling/whiteboard/portal/container/src/main/java/org/apache/sling/portal/container/internal/PortletMimeResponseContextImpl.java
Author: cziegeler
Date: Wed Feb 3 14:24:09 2010
New Revision: 906062
URL: http://svn.apache.org/viewvc?rev=906062&view=rev
Log:
Wrap output stream and print writer to catch close() calls
Modified:
sling/whiteboard/portal/container/src/main/java/org/apache/sling/portal/container/internal/PortletMimeResponseContextImpl.java
Modified: sling/whiteboard/portal/container/src/main/java/org/apache/sling/portal/container/internal/PortletMimeResponseContextImpl.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/portal/container/src/main/java/org/apache/sling/portal/container/internal/PortletMimeResponseContextImpl.java?rev=906062&r1=906061&r2=906062&view=diff
==============================================================================
--- sling/whiteboard/portal/container/src/main/java/org/apache/sling/portal/container/internal/PortletMimeResponseContextImpl.java (original)
+++ sling/whiteboard/portal/container/src/main/java/org/apache/sling/portal/container/internal/PortletMimeResponseContextImpl.java Wed Feb 3 14:24:09 2010
@@ -31,6 +31,8 @@
import org.apache.pluto.container.PortletURLProvider.TYPE;
import org.apache.pluto.container.util.PrintWriterServletOutputStream;
import org.apache.sling.portal.container.SlingPortletContainer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* @version $Id$
@@ -40,54 +42,45 @@
extends PortletResponseContextImpl
implements PortletMimeResponseContext {
- private static class CacheControlImpl implements CacheControl
- {
+ /** The logger. */
+ private final static Logger LOGGER = LoggerFactory.getLogger(PortletMimeResponseContextImpl.class);
+
+ private static class CacheControlImpl implements CacheControl {
+
private String eTag;
private int expirationTime;
private boolean publicScope;
private boolean cachedContent;
- public CacheControlImpl()
- {
- }
-
- public boolean useCachedContent()
- {
+ public boolean useCachedContent() {
return cachedContent;
}
- public String getETag()
- {
+ public String getETag() {
return this.eTag;
}
- public int getExpirationTime()
- {
+ public int getExpirationTime() {
return expirationTime;
}
- public boolean isPublicScope()
- {
+ public boolean isPublicScope() {
return publicScope;
}
- public void setETag(String eTag)
- {
+ public void setETag(String eTag) {
this.eTag = eTag;
}
- public void setExpirationTime(int expirationTime)
- {
+ public void setExpirationTime(int expirationTime) {
this.expirationTime = expirationTime;
}
- public void setPublicScope(boolean publicScope)
- {
+ public void setPublicScope(boolean publicScope) {
this.publicScope = publicScope;
}
- public void setUseCachedContent(boolean cachedContent)
- {
+ public void setUseCachedContent(boolean cachedContent) {
this.cachedContent = cachedContent;
}
}
@@ -96,123 +89,152 @@
private OutputStream outputStream;
public PortletMimeResponseContextImpl(SlingPortletContainer container, HttpServletRequest containerRequest,
- HttpServletResponse containerResponse, PortletWindow window)
- {
+ HttpServletResponse containerResponse, PortletWindow window) {
super(container, containerRequest, containerResponse, window);
}
- public void close()
- {
+ public void close() {
cacheControl = null;
outputStream = null;
super.close();
}
- public void flushBuffer() throws IOException
- {
- if (!isClosed())
- {
+ public void flushBuffer() throws IOException {
+ if (!isClosed()) {
getServletResponse().flushBuffer();
}
}
- public int getBufferSize()
- {
+ public int getBufferSize() {
return getServletResponse().getBufferSize();
}
- public CacheControl getCacheControl()
- {
- if (isClosed())
- {
+ public CacheControl getCacheControl() {
+ if (isClosed()) {
return null;
}
- if (cacheControl == null)
- {
+ if (cacheControl == null) {
cacheControl = new CacheControlImpl();
}
return cacheControl;
}
- public String getCharacterEncoding()
- {
+ public String getCharacterEncoding() {
return isClosed() ? null : getServletResponse().getCharacterEncoding();
}
- public String getContentType()
- {
+ public String getContentType() {
return isClosed() ? null : getServletResponse().getContentType();
}
- public Locale getLocale()
- {
+ public Locale getLocale() {
return isClosed() ? null : getServletResponse().getLocale();
}
- public OutputStream getOutputStream() throws IOException, IllegalStateException
- {
- if (isClosed())
- {
+ public OutputStream getOutputStream() throws IOException, IllegalStateException {
+ if (isClosed()) {
return null;
}
- if (outputStream == null)
- {
- try
- {
+ if (outputStream == null) {
+ try {
outputStream = getServletResponse().getOutputStream();
- }
- catch (IllegalStateException e)
- {
+ } catch (IllegalStateException e) {
// handle situation where underlying ServletResponse its getWriter()
// has been called already anyway: return a wrapped PrintWriter in that case
outputStream = new PrintWriterServletOutputStream(getServletResponse().getWriter(),
getServletResponse().getCharacterEncoding());
}
}
- return outputStream;
+ return new SecureOutputStream(outputStream);
}
- public PrintWriter getWriter() throws IOException, IllegalStateException
- {
- return isClosed() ? null : getServletResponse().getWriter();
+ public PrintWriter getWriter() throws IOException, IllegalStateException {
+ return isClosed() ? null : new SecurePrinterWriter(getServletResponse().getWriter());
}
- public boolean isCommitted()
- {
+ public boolean isCommitted() {
return getServletResponse().isCommitted();
}
- public void reset()
- {
+ public void reset() {
getServletResponse().reset();
}
- public void resetBuffer()
- {
- if (!isClosed())
- {
+ public void resetBuffer() {
+ if (!isClosed()) {
getServletResponse().resetBuffer();
}
}
- public void setBufferSize(int size)
- {
- if (!isClosed())
- {
+ public void setBufferSize(int size) {
+ if (!isClosed()) {
getServletResponse().setBufferSize(size);
}
}
- public void setContentType(String contentType)
- {
- if (!isClosed())
- {
+ public void setContentType(String contentType) {
+ if (!isClosed()) {
getServletResponse().setContentType(contentType);
}
}
- public PortletURLProvider getPortletURLProvider(TYPE type)
- {
+ public PortletURLProvider getPortletURLProvider(TYPE type) {
return isClosed() ? null : new PortletURLProviderImpl(getPortalURL(), type, getPortletWindow());
}
+
+
+ public final static class SecurePrinterWriter extends PrintWriter {
+
+ public SecurePrinterWriter(final PrintWriter delegatee) {
+ super(delegatee);
+ }
+
+ @Override
+ public void close() {
+ this.flush();
+ // log a warning
+ final Exception e = new IllegalStateException();
+ LOGGER.warn("Portlet should not call PrintWriter.close()!", e);
+ }
+ }
+
+ public final static class SecureOutputStream extends OutputStream {
+
+ private final OutputStream delegatee;
+
+ public SecureOutputStream(final OutputStream delegatee) {
+ this.delegatee = delegatee;
+ }
+
+ @Override
+ public void flush() throws IOException {
+ this.delegatee.flush();
+ }
+
+ @Override
+ public void write(byte[] b, int off, int len) throws IOException {
+ // TODO Auto-generated method stub
+ this.delegatee.write(b, off, len);
+ }
+
+ @Override
+ public void write(byte[] b) throws IOException {
+ // TODO Auto-generated method stub
+ this.delegatee.write(b);
+ }
+
+ @Override
+ public void write(int b) throws IOException {
+ this.delegatee.write(b);
+ }
+
+ @Override
+ public void close() throws IOException {
+ this.delegatee.flush();
+ // log a warning
+ final Exception e = new IllegalStateException();
+ LOGGER.warn("Portlet should not call OutputStream.close()!", e);
+ }
+
+ }
}