/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jetspeed.container.impl; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Collection; import java.util.Locale; import javax.portlet.PortletMode; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.pluto.container.PortletContainer; import org.apache.pluto.container.PortletRenderResponseContext; import org.apache.pluto.container.PortletResourceResponseContext; import org.apache.pluto.container.util.PrintWriterServletOutputStream; import org.apache.jetspeed.container.PortletWindow; /** * PortletResourceResponseContextImpl implements both PortletResourceResponseContext * and PortletRenderResponseContext to support Portlet 1.0 based Portlets using the * Portals Bridges pre Portlet 2.0 PortletResourceURLFactory to serve resources on top of * a RenderURL. * * Jetspeed still provides backwards compatibility by forwarding to the portlet and plugging * in this PortletResourceResponseContextImpl instead of PortletRenderResponseContextImpl, * which is why it needs to implement both interfaces. * * The PortletRenderResponseContext specific methods however simply ignore any invocation. * * @version $Id$ * */ public class PortletResourceResponseContextImpl extends PortletMimeResponseContextImpl implements PortletResourceResponseContext, PortletRenderResponseContext { private static final String DEFAULT_CONTAINER_CHARSET = "UTF-8"; private OutputStream outputStream; private boolean charsetSet; public PortletResourceResponseContextImpl(PortletContainer container, HttpServletRequest containerRequest, HttpServletResponse containerResponse, PortletWindow window) { super(container, containerRequest, containerResponse, window); } /** * PortletRenderResponseContext method provided to support PortletResourceURLFactory usage * which is served over a RenderURL. Any invocation is ignored. */ public void setTitle(String title) { // ignore } /** * PortletRenderResponseContext method provided to support PortletResourceURLFactory usage * which is served over a RenderURL. Any invocation is ignored. */ public void setNextPossiblePortletModes(Collection portletModes) { //ignore } public void flushBuffer() throws IOException { if (!isClosed()) { getServletResponse().flushBuffer(); } } public int getBufferSize() { return getServletResponse().getBufferSize(); } @Override public void close() { outputStream = null; super.close(); } public boolean isCommitted() { return getServletResponse().isCommitted(); } public OutputStream getOutputStream() throws IOException, IllegalStateException { if (isClosed()) { return null; } if (outputStream == null) { try { outputStream = getServletResponse().getOutputStream(); } catch (IllegalStateException e) { // handle situation where underlying ServletResponse its getWriter() // has been called already anyway: return a wrapped PrintWriter in that case if (!charsetSet) { setCharacterEncoding(DEFAULT_CONTAINER_CHARSET); } outputStream = new PrintWriterServletOutputStream(getServletResponse().getWriter(), getServletResponse().getCharacterEncoding()); } } return outputStream; } public PrintWriter getWriter() throws IOException, IllegalStateException { return isClosed() ? null : getServletResponse().getWriter(); } public void reset() { if (!isClosed()) { getServletResponse().reset(); } } public void resetBuffer() { if (!isClosed()) { getServletResponse().reset(); } } public void setBufferSize(int size) { if (!isClosed()) { getServletResponse().setBufferSize(size); } } public void setContentType(String contentType) { if (!isClosed()) { getServletResponse().setContentType(contentType); } } public void setCharacterEncoding(String charset) { if (!isClosed()) { charsetSet = true; getContainerResponse().setCharacterEncoding(charset); } } public void setContentLength(int len) { if (!isClosed()) { getContainerResponse().setContentLength(len); } } public void setLocale(Locale locale) { if (!isClosed()) { getContainerResponse().setLocale(locale); } } }