📄 portletresponseimpl.java.svn-base
字号:
/* * 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.pluto.internal.impl;import java.io.IOException;import java.io.PrintWriter;import javax.portlet.PortletResponse;import javax.portlet.PortletURL;import javax.portlet.ResourceURL;import javax.servlet.ServletOutputStream;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.pluto.NamespaceMapper;import org.apache.pluto.PortletContainer;import org.apache.pluto.PortletWindow;import org.apache.pluto.internal.InternalPortletResponse;import org.apache.pluto.spi.ResourceURLProvider;import org.apache.pluto.util.ArgumentUtility;import org.apache.pluto.util.DummyPrintWriter;import org.apache.pluto.util.PrintWriterServletOutputStream;import org.w3c.dom.DOMException;import org.w3c.dom.Document;import org.w3c.dom.Element;/** * Abstract <code>javax.portlet.PortletResponse</code> implementation. * This class also implements InternalPortletResponse. * */public abstract class PortletResponseImpl extends HttpServletResponseWrapperimplements PortletResponse, InternalPortletResponse { /** Logger. */ private static final Log LOG = LogFactory.getLog(PortletResponseImpl.class); // Private Member Variables ------------------------------------------------ /** The portlet container. */ private PortletContainer container; /** The portlet window. */ private PortletWindow portletWindow; /** The servlet request of the target/portlet's web module. */ private HttpServletRequest httpServletRequest; private boolean usingWriter; private boolean usingStream; private ServletOutputStream wrappedWriter; private NamespaceMapper mapper; /** True if we are in an include call. */ private boolean included = false; /** True if we are in an forwarded call. */ private boolean forwarded = false; private boolean requestForwarded = false; // Constructor ------------------------------------------------------------- public PortletResponseImpl(PortletContainer container, PortletWindow portletWindow, HttpServletRequest servletRequest, HttpServletResponse servletResponse) { super(servletResponse); this.container = container; this.httpServletRequest = servletRequest; this.portletWindow = portletWindow; this.mapper = container.getOptionalContainerServices().getNamespaceMapper(); } // PortletResponse Impl ---------------------------------------------------- public void addProperty(String name, String value) { ArgumentUtility.validateNotNull("propertyName", name); container.getRequiredContainerServices() .getPortalCallbackService().getRequestPropertyProvider() .addProperty( getHttpServletRequest(), portletWindow, name, value); } public void addProperty(String name, String value, int scope) { // FIXME: What should this do? (scope seems to be new) ArgumentUtility.validateNotNull("propertyName", name); container.getRequiredContainerServices() .getPortalCallbackService().getRequestPropertyProvider() .addProperty( getHttpServletRequest(), portletWindow, name, value); } public void addProperty(String key, Element element) { container.getRequiredContainerServices().getPortalCallbackService().getRequestPropertyProvider().addProperty(getHttpServletRequest(), portletWindow, key, element); } public void addProperty(Cookie cookie) { container.getRequiredContainerServices().getPortalCallbackService().getRequestPropertyProvider().addCookieProperty(getHttpServletRequest(), portletWindow, cookie); } public void setProperty(String name, String value) { ArgumentUtility.validateNotNull("propertyName", name); container.getRequiredContainerServices() .getPortalCallbackService().getRequestPropertyProvider() .setProperty( getHttpServletRequest(), portletWindow, name, value); } public String encodeURL(String path) { if (path.indexOf("://") == -1 && !path.startsWith("/")) { throw new IllegalArgumentException( "only absolute URLs or full path URIs are allowed"); } ResourceURLProvider provider = getContainer() .getRequiredContainerServices() .getPortalCallbackService() .getResourceURLProvider( httpServletRequest, portletWindow); if (path.indexOf("://") != -1) { provider.setAbsoluteURL(path); } else { provider.setFullPath(path); } return getHttpServletResponse().encodeURL(provider.toString()); } // InternalPortletResponse impl -------------------------------------------- public PortletWindow getPortletWindow() { return portletWindow; } // Internal Methods -------------------------------------------------------- /** * Returns the portlet container. * @return the portlet container. */ protected PortletContainer getContainer() { return container; } /** * Returns the nested HttpServletRequest instance. * @return the nested HttpServletRequest instance. */ protected HttpServletRequest getHttpServletRequest() { return httpServletRequest; } /** * Returns the nested HttpServletResponse instance. * @return the nested HttpServletResponse instance. */ public HttpServletResponse getHttpServletResponse() { return (HttpServletResponse) super.getResponse(); } // HttpServletResponse Methods --------------------------------------------- public String encodeUrl(String url) { return this.encodeURL(url); } /** * TODO: javadoc about why we are using a wrapped writer here. * @see org.apache.pluto.util.PrintWriterServletOutputStream */ public ServletOutputStream getOutputStream() throws IllegalStateException, IOException { if (usingWriter) { throw new IllegalStateException( "getPortletOutputStream can't be used " + "after getWriter was invoked."); } if (wrappedWriter == null) { wrappedWriter = new PrintWriterServletOutputStream( getHttpServletResponse().getWriter()); } usingStream = true; return wrappedWriter; } public PrintWriter getWriter() throws IllegalStateException, IOException { if (usingStream) { throw new IllegalStateException( "getWriter can't be used " + "after getOutputStream was invoked."); } usingWriter = true; if (isRequestForwarded()&& !isForwarded() && !isIncluded()){ return new DummyPrintWriter(super.getWriter()); } return getHttpServletResponse().getWriter(); } public PortletURL createRenderURL() { return createURL(false,false); } public PortletURL createActionURL() { return createURL(true,false); } public ResourceURL createResourceURL(){ return new ResourceURLImpl(getContainer(), getPortletWindow(), getHttpServletRequest(), getHttpServletResponse()); } public ResourceURL createResourceURL(boolean markupContainsPortletURLs){ throw new UnsupportedOperationException("This method needs to be implemented."); } /** * Creates a portlet URL. * TODO: make dynamic? as service? * @param isAction true for an action URL, false for a render URL. * @return the created portlet (action/render) URL. */ private PortletURL createURL(boolean isAction, boolean isResourceServing) { return new PortletURLImpl(getContainer(), getPortletWindow(), getHttpServletRequest(), getHttpServletResponse(), isAction); } public String getNamespace() { String namespace = mapper.encode(getPortletWindow().getId(), ""); StringBuffer validNamespace = new StringBuffer(); for (int i = 0; i < namespace.length(); i++) { char ch = namespace.charAt(i); if (Character.isJavaIdentifierPart(ch)) { validNamespace.append(ch); } else { validNamespace.append('_'); } } return validNamespace.toString(); } @Override public void addCookie(Cookie arg0) { if (isIncluded()){ //no operation } else if (isForwarded()){ addProperty(arg0); } else super.addCookie(arg0); } @Override public boolean containsHeader(String arg0) { if (isForwarded() || isIncluded()){ return false; } else return super.containsHeader(arg0); } @Override public String encodeRedirectUrl(String arg0) { if (isForwarded() || isIncluded()){ return null; } else return super.encodeRedirectUrl(arg0); } @Override public String encodeRedirectURL(String arg0) { if (isForwarded() || isIncluded()){ return null; } else return super.encodeRedirectURL(arg0); } @Override public void sendError(int arg0) throws IOException { if (isForwarded() || isIncluded()){ // no operation } else super.sendError(arg0); } @Override public void sendError(int arg0, String arg1) throws IOException { if (isForwarded() || isIncluded()){ // no operation } else super.sendError(arg0, arg1); } public Element createElement(String tagName) throws DOMException { DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder; try { docBuilder = dbfac.newDocumentBuilder(); Document doc = docBuilder.newDocument(); return doc.createElement(tagName); } catch (ParserConfigurationException e) { LOG.warn(e); } throw new DOMException((short) 0, "Initialization fail"); }// InternalRenderResponse Impl --------------------------------------------- public void setIncluded(boolean included) { this.included = included; } public boolean isIncluded() { return included; } public boolean isForwarded() { return forwarded; } public void setForwarded(boolean forwared) { this.forwarded = forwared; } public boolean isForwardedAllowed(){ if (usingWriter || usingStream) return false; else return true; } public boolean isRequestForwarded() { return requestForwarded; } public void setRequestForwarded() { requestForwarded = true; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -