You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by mf...@apache.org on 2009/05/07 18:56:07 UTC
svn commit: r772707 - in /myfaces/portlet-bridge/core/trunk_2.0.x:
api/src/main/java/javax/portlet/faces/
impl/src/main/java/org/apache/myfaces/portlet/faces/application/
impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/
impl/src/main/java/or...
Author: mfreedman
Date: Thu May 7 16:56:07 2009
New Revision: 772707
URL: http://svn.apache.org/viewvc?rev=772707&view=rev
Log:
Interim fixes for getting Trinidad-Ajax sample working. I.e. fixes to get request dispatched thru bridge to Faces for an inline resource protocol to work.
Added:
myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/application/PortletViewHandlerResourceResponseWrapper.java
Modified:
myfaces/portlet-bridge/core/trunk_2.0.x/api/src/main/java/javax/portlet/faces/GenericFacesPortlet.java
myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/application/PortletViewHandlerImpl.java
myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java
myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextImpl.java
Modified: myfaces/portlet-bridge/core/trunk_2.0.x/api/src/main/java/javax/portlet/faces/GenericFacesPortlet.java
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/trunk_2.0.x/api/src/main/java/javax/portlet/faces/GenericFacesPortlet.java?rev=772707&r1=772706&r2=772707&view=diff
==============================================================================
--- myfaces/portlet-bridge/core/trunk_2.0.x/api/src/main/java/javax/portlet/faces/GenericFacesPortlet.java (original)
+++ myfaces/portlet-bridge/core/trunk_2.0.x/api/src/main/java/javax/portlet/faces/GenericFacesPortlet.java Thu May 7 16:56:07 2009
@@ -562,18 +562,11 @@
return false;
}
- // merely dispatch this to the nonJSF target
- // but because this is portlet 1.0 we have to ensure the content type is set.
- // Ensure the ContentType is set before rendering
- if (response.getContentType() == null)
- {
- response.setContentType(request.getResponseContentType());
- }
try
{
PortletRequestDispatcher dispatcher =
this.getPortletContext().getRequestDispatcher(targetPath);
- dispatcher.include(request, response);
+ dispatcher.forward(request, response);
return true;
} catch (Exception e)
{
@@ -588,9 +581,6 @@
initBridgeRequest(request, response);
// Set the response ContentType/CharacterSet
- setResponseContentType(response, getResponseContentType(request),
- getResponseCharacterSetEncoding(request));
-
try
{
mFacesBridge.doFacesRequest(request, response);
@@ -685,26 +675,6 @@
}
}
- private void setResponseContentType(RenderResponse response, String contentType,
- String charSetEncoding)
- {
- if (contentType == null)
- {
- return;
-
- }
- if (charSetEncoding != null)
- {
- StringBuffer buf = new StringBuffer(contentType);
- buf.append(";");
- buf.append(charSetEncoding);
- response.setContentType(buf.toString());
- } else
- {
- response.setContentType(contentType);
- }
- }
-
private String getFromServicesPath(PortletContext context, String resourceName)
{
// Check for a services definition
Modified: myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/application/PortletViewHandlerImpl.java
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/application/PortletViewHandlerImpl.java?rev=772707&r1=772706&r2=772707&view=diff
==============================================================================
--- myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/application/PortletViewHandlerImpl.java (original)
+++ myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/application/PortletViewHandlerImpl.java Thu May 7 16:56:07 2009
@@ -50,8 +50,8 @@
import javax.portlet.MimeResponse;
import javax.portlet.PortletContext;
-import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
+import javax.portlet.ResourceResponse;
import javax.portlet.faces.Bridge;
import javax.portlet.faces.BridgeUtil;
import javax.portlet.faces.annotation.PortletNamingContainer;
@@ -60,6 +60,7 @@
import javax.portlet.filter.PortletResponseWrapper;
import org.apache.myfaces.portlet.faces.application.PortletViewHandlerRenderResponseWrapper;
+import org.apache.myfaces.portlet.faces.application.PortletViewHandlerResourceResponseWrapper;
import org.apache.myfaces.portlet.faces.bridge.BridgeImpl;
import org.apache.myfaces.portlet.faces.util.QueryString;
@@ -282,7 +283,7 @@
}
ExternalContext extContext = context.getExternalContext();
- RenderResponse renderResponse = (RenderResponse) extContext.getResponse();
+ MimeResponse mimeResponse = (MimeResponse) extContext.getResponse();
try
{
@@ -319,7 +320,7 @@
else
{
newWriter = renderKit.createResponseWriter(strWriter, null,
- renderResponse.getCharacterEncoding());
+ mimeResponse.getCharacterEncoding());
}
context.setResponseWriter(newWriter);
@@ -336,14 +337,14 @@
// Dispatch may have output to an OutputStream instead of a Writer
Writer renderResponseWriter = null;
try {
- renderResponseWriter = renderResponse.getWriter();
+ renderResponseWriter = mimeResponse.getWriter();
}
catch (IllegalStateException ise) {
// got this exception because we've called getOutputStream() previously
renderResponseWriter = new BufferedWriter(
new OutputStreamWriter(
- renderResponse.getPortletOutputStream(),
- renderResponse.getCharacterEncoding()));
+ mimeResponse.getPortletOutputStream(),
+ mimeResponse.getCharacterEncoding()));
}
if (null != oldWriter)
{
@@ -363,7 +364,7 @@
context.setResponseWriter(oldWriter);
}
- RenderResponse wrappedResponse = (RenderResponse) extContext.getRequestMap().get(Bridge.AFTER_VIEW_CONTENT);
+ MimeResponse wrappedResponse = (MimeResponse) extContext.getRequestMap().get(Bridge.AFTER_VIEW_CONTENT);
if (wrappedResponse != null)
{
wrappedResponse.flushBuffer();
@@ -377,7 +378,6 @@
throws IOException
{
String viewURI = viewToRender.getViewId();
- RenderRequest request = (RenderRequest) extContext.getRequest();
// update the JSTL locale attribute in request scope so that JSTL
// picks up the locale from viewRoot. This attribute must be updated
@@ -386,11 +386,19 @@
extContext.getRequestMap().put("javax.servlet.jsp.jstl.fmt.locale", context.getViewRoot().getLocale());
// save the original response
- RenderResponse originalResponse = (RenderResponse) extContext.getResponse();
+ MimeResponse originalResponse = (MimeResponse) extContext.getResponse();
// replace the response with our wrapper
//TODO: need a separate response wrapper for resources
- PortletViewHandlerRenderResponseWrapper wrapped = new PortletViewHandlerRenderResponseWrapper(originalResponse/*, context.getViewRoot().getLocale()*/);
+ PortletResponseWrapper wrapped = null;
+ if (BridgeUtil.getPortletRequestPhase() == Bridge.PortletPhase.RESOURCE_PHASE)
+ {
+ wrapped = new PortletViewHandlerResourceResponseWrapper((ResourceResponse)originalResponse/*, context.getViewRoot().getLocale()*/);
+ }
+ else
+ {
+ wrapped = new PortletViewHandlerRenderResponseWrapper((RenderResponse) originalResponse/*, context.getViewRoot().getLocale()*/);
+ }
if (!(wrapped instanceof PortletResponseWrapper))
throw new IOException();
Added: myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/application/PortletViewHandlerResourceResponseWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/application/PortletViewHandlerResourceResponseWrapper.java?rev=772707&view=auto
==============================================================================
--- myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/application/PortletViewHandlerResourceResponseWrapper.java (added)
+++ myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/application/PortletViewHandlerResourceResponseWrapper.java Thu May 7 16:56:07 2009
@@ -0,0 +1,131 @@
+/* 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.myfaces.portlet.faces.application;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import javax.portlet.filter.ResourceResponseWrapper;
+import javax.portlet.ResourceResponse;
+
+
+public class PortletViewHandlerResourceResponseWrapper
+ extends ResourceResponseWrapper
+ {
+ private static final int WRITE_BUFFER_SIZE = 1024;
+
+ private int mBufferSize = WRITE_BUFFER_SIZE;
+ private ByteArrayOutputStream mBytes;
+ private boolean mIsWritingBytes;
+ private PrintWriter mPrintWriter;
+ private boolean mIsWritingChars;
+
+ public PortletViewHandlerResourceResponseWrapper(ResourceResponse response)
+ {
+ super(response);
+ }
+
+ public PrintWriter getWriter() throws java.io.IOException
+ {
+ if (mBytes == null)
+ {
+ mBytes = new ByteArrayOutputStream(mBufferSize);
+ }
+ if (mPrintWriter == null)
+ {
+ mPrintWriter = new PrintWriter(new OutputStreamWriter(mBytes, this.getCharacterEncoding()),true);
+ }
+
+ mIsWritingChars = true;
+ mIsWritingBytes = false;
+
+ return mPrintWriter;
+ }
+
+ public OutputStream getPortletOutputStream() throws IOException
+ {
+ if (mBytes == null)
+ {
+ mBytes = new ByteArrayOutputStream(mBufferSize);
+ }
+
+ mIsWritingChars = false;
+ mIsWritingBytes = true;
+
+ return mBytes;
+ }
+
+ public void resetBuffer()
+ {
+
+ if (mPrintWriter != null)
+ {
+ mPrintWriter.close();
+ mPrintWriter = null;
+ }
+
+ reset();
+
+ mIsWritingBytes = false;
+ mIsWritingChars = false;
+ }
+
+ public void reset()
+ {
+ if (mBytes != null)
+ mBytes.reset();
+ }
+
+
+ public void flushBuffer() throws java.io.IOException
+ {
+ if (mBytes == null) return; // nothing to do!
+
+
+ // Move the data from the buffer to the response
+
+ // First determine whether response has used a writer or outputstream
+ try {
+ copyToWriter(this.getResponse().getWriter());
+ }
+ catch (IllegalStateException ise) {
+ mBytes.writeTo(this.getResponse().getPortletOutputStream());
+ }
+ }
+
+ private void copyToWriter(PrintWriter writer) throws java.io.IOException
+ {
+ try {
+ writer.write(mBytes.toString(this.getCharacterEncoding()));
+ }
+ catch (Exception e)
+ {
+ throw new IOException(e.toString());
+ }
+ }
+
+
+
+ }
Modified: myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java?rev=772707&r1=772706&r2=772707&view=diff
==============================================================================
--- myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java (original)
+++ myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java Thu May 7 16:56:07 2009
@@ -754,12 +754,6 @@
restoreFacesView(context, scopeId);
}
- // Ensure the ContentType is set before rendering
- if (extCtx.getResponseContentType() == null)
- {
- response.setContentType(extRequest.getResponseContentType());
- }
-
// ensure that isPostback attribute set if VIEW_STATE param exists
if (extCtx.getRequestParameterValuesMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM))
{
@@ -1047,20 +1041,13 @@
{
// Get the FacesContext instance for this request
Lifecycle lifecycle = getLifecycle();
- context =
- getFacesContextFactory().getFacesContext(mPortletConfig, request, response, lifecycle);
+ context = getFacesContext(request, response, lifecycle, null);
ExternalContext extCtx = context.getExternalContext();
// Use request from ExternalContext in case its been wrapped by an
// extension
ResourceRequest extRequest = (ResourceRequest) extCtx.getRequest();
- // Ensure the ContentType is set before rendering
- if (extCtx.getResponseContentType() == null)
- {
- response.setContentType(extRequest.getResponseContentType());
- }
-
// ensure that isPostback attribute set if VIEW_STATE param exists
if (extCtx.getRequestParameterValuesMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM))
{
Modified: myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextImpl.java?rev=772707&r1=772706&r2=772707&view=diff
==============================================================================
--- myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextImpl.java (original)
+++ myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextImpl.java Thu May 7 16:56:07 2009
@@ -1889,7 +1889,17 @@
private boolean isInProtocolResourceLink(String url)
{
- return isTokenLink(Bridge.IN_PROTOCOL_RESOURCE_LINK, url);
+ // its in protocol if either it contains the special marker or the URL
+ // references a Faces view/resource.
+ if (isTokenLink(Bridge.IN_PROTOCOL_RESOURCE_LINK, url))
+ {
+ return true;
+ }
+ else
+ {
+ return isFacesURL(url);
+ }
+
}
@@ -2017,8 +2027,9 @@
private boolean isRelativePath(String url)
{
+
// relative path doesn't start with a '/'
- if (url.startsWith("/"))
+ if (isAbsoluteURL(url) || url.startsWith("/"))
{
return false;
}