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;
     }