/* * JBoss, Home of Professional Open Source. * Copyright 2012, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.portletbridge.context; import java.io.IOException; import java.io.OutputStream; import java.io.Writer; import java.util.List; import java.util.Map; import javax.faces.context.FacesContext; import javax.portlet.BaseURL; import javax.portlet.MimeResponse; import javax.portlet.PortletContext; import javax.portlet.PortletMode; import javax.portlet.PortletModeException; import javax.portlet.PortletRequest; import javax.portlet.PortletSecurityException; import javax.portlet.PortletURL; import javax.portlet.ResourceURL; import javax.portlet.WindowState; import javax.portlet.WindowStateException; import javax.portlet.faces.Bridge; import org.jboss.portletbridge.PortletBridgeConstants; /** * @author asmirnov */ public abstract class MimeExternalContextImpl extends PortletExternalContextImpl { private static final String[] STRINGS = new String[] {}; /** * @param context * @param request * @param response */ public MimeExternalContextImpl(PortletContext context, PortletRequest request, MimeResponse response) { super(context, request, response); } // ============================================================ // public methods public PortletRequest getPortletRequest() { return (PortletRequest) super.getRequest(); } public MimeResponse getMimeResponse() { return (MimeResponse) super.getResponse(); } @Override protected String createActionUrl(PortalActionURL url, boolean escape) { MimeResponse renderResponse = getMimeResponse(); PortletURL portletURL = renderResponse.createActionURL(); setPortletUrlParameters(url, portletURL); for (String key : url.getParameters().keySet()) { String value = url.getParameter(key); portletURL.setParameter(key, value); } return encodePortletUrl(portletURL, escape); } @Override protected String createResourceUrl(PortalActionURL portalUrl, boolean escape) { MimeResponse renderResponse = getMimeResponse(); ResourceURL resourceURL = renderResponse.createResourceURL(); setBaseUrlParameters(portalUrl, resourceURL); String path = portalUrl.getPath(); if (null != path && path.length() > 0 && !portalUrl.hasParameter(Bridge.FACES_VIEW_ID_PARAMETER) && !portalUrl.hasParameter(Bridge.FACES_VIEW_PATH_PARAMETER) && !portalUrl .hasParameter(Bridge.NONFACES_TARGET_PATH_PARAMETER)) { resourceURL.setResourceID(path); } resourceURL.setParameters(portalUrl.getParameters()); return encodePortletUrl(resourceURL, escape); } @Override protected String createRenderUrl(PortalActionURL portalUrl, boolean escape, Map<String, List<String>> parameters) { MimeResponse renderResponse = getMimeResponse(); PortletURL renderURL = renderResponse.createRenderURL(); setPortletUrlParameters(portalUrl, renderURL); renderURL.setParameters(portalUrl.getParameters()); for (String paramName : parameters.keySet()) { renderURL.setParameter(paramName, parameters.get(paramName).toArray(STRINGS)); } String viewId = getViewIdFromUrl(portalUrl); if (null != viewId) { renderURL.setParameter(Bridge.FACES_VIEW_ID_PARAMETER, viewId); } return encodePortletUrl(renderURL, escape); } protected void setPortletUrlParameters(PortalActionURL portalUrl, PortletURL portletURL) { String modeParameter = portalUrl.removeParameter(Bridge.PORTLET_MODE_PARAMETER); if (null != modeParameter) { try { PortletMode mode = new PortletMode(modeParameter); portletURL.setPortletMode(mode); } catch (PortletModeException e) { // only valid modes supported. } } String windowParameter = portalUrl.removeParameter(Bridge.PORTLET_WINDOWSTATE_PARAMETER); if (null != windowParameter) { try { WindowState state = new WindowState(windowParameter); portletURL.setWindowState(state); } catch (WindowStateException e) { // only valid modes supported. } } setBaseUrlParameters(portalUrl, portletURL); } protected void setBaseUrlParameters(PortalActionURL portalUrl, BaseURL resourceURL) { portalUrl.removeParameter(Bridge.PORTLET_MODE_PARAMETER); portalUrl.removeParameter(Bridge.PORTLET_WINDOWSTATE_PARAMETER); String secure = portalUrl.getParameter(Bridge.PORTLET_SECURE_PARAMETER); if (null != secure) { try { if ("true".equalsIgnoreCase(secure)) { resourceURL.setSecure(true); } else if ("false".equalsIgnoreCase(secure)) { resourceURL.setSecure(false); } } catch (PortletSecurityException e) { // do nothing } portalUrl.removeParameter(Bridge.PORTLET_SECURE_PARAMETER); } } @Override protected String createPartialActionUrl(PortalActionURL portalUrl) { MimeResponse renderResponse = getMimeResponse(); ResourceURL resourceURL = renderResponse.createResourceURL(); setBaseUrlParameters(portalUrl, resourceURL); resourceURL.setParameters(portalUrl.getParameters()); resourceURL.setParameter(Bridge.FACES_VIEW_ID_PARAMETER, getViewIdFromUrl(portalUrl)); resourceURL.setParameter(PortletBridgeConstants.AJAX_PARAM, Boolean.TRUE.toString()); return encodeURL(resourceURL.toString()); } @Override public String getResponseCharacterEncoding() { return getMimeResponse().getCharacterEncoding(); } @Override public String getResponseContentType() { return getMimeResponse().getContentType(); } @Override public void setResponseContentType(String contentType) { getMimeResponse().setContentType(contentType); } @Override public void setResponseContentLength(int length) { } @Override public int getResponseBufferSize() { return getMimeResponse().getBufferSize(); } @Override public void setResponseBufferSize(int size) { getMimeResponse().setBufferSize(size); } @Override public OutputStream getResponseOutputStream() throws IOException { return getMimeResponse().getPortletOutputStream(); } @Override public Writer getResponseOutputWriter() throws IOException { return getMimeResponse().getWriter(); } @Override public boolean isResponseCommitted() { boolean committed; // Override ServletResponse for Flash to ensure getMimeResponse() does throw ClassCastException if (isServletResponseRequiredForFlash()) { overrideHttpResponseForFlash = true; committed = getMimeResponse().isCommitted(); overrideHttpResponseForFlash = false; } else { committed = getMimeResponse().isCommitted(); } return committed; } @Override public void responseFlushBuffer() throws IOException { getPortletFlash().doLastPhaseActions(FacesContext.getCurrentInstance(), false); getMimeResponse().flushBuffer(); } @Override public void responseReset() { getMimeResponse().reset(); } @Override public void addResponseHeader(String name, String value) { getMimeResponse().addProperty(name, value); } @Override public void setResponseHeader(String name, String value) { getMimeResponse().setProperty(name, value); } @Override public void responseSendError(int statusCode, String message) throws IOException { } @Override public String getRequestCharacterEncoding() { // TODO - save character encoding from action request. return null; } @Override public int getRequestContentLength() { return 0; } }