You are viewing a plain text version of this content. The canonical link for it is here.
Posted to pluto-dev@portals.apache.org by Stefan Hepper <st...@apache.org> on 2005/02/02 18:15:09 UTC

Re: We might have a setRenderParameter problem

Ken Ramirez wrote:

> Well, what I would have liked to do was pass attach it to the request 
> as an Object, but there is really no way of doing that. So, I then 
> passed it on the Session. However, it's not as elegant, because you 
> have to put it into the session between the two calls, then you have 
> to pull it out from the session, and finally remove it from the session.
>
> Is this the procedure you would have recommended as well?
>
>
> Ken
>
Yes, session is the only way that scales for this large amount of data. 
You cannot pass directly objects from the action to the render phase as 
this would break inthe remote case where these will be two different 
SOAP calls.

Stefan


> Stefan Hepper wrote:
>
>> Ken Ramirez wrote:
>>
>>> Hi Guys,
>>>
>>> I created a portlet to test the transferring of files from the 
>>> browser to a portlet (using file uploading). In order to convert the 
>>> data passed to the processAction into text, I retrieved the data 
>>> using getPortletInputStream() and then wrote it all out into a 
>>> StringBuffer. I then tried sending the StringBuffer (converted to a 
>>> String using toString), and passed it to setRenderParameter so that 
>>> I can access it from the doView method. In between the processAction 
>>> and doView method, an exception is thrown. I think it's happening in 
>>> the transferring of the parameters from the ActionResponse object to 
>>> the RenderRequest object. The exception is:
>>>
>>> java.lang.ArrayIndexOutOfBoundsException: 4096
>>>     at 
>>> org.apache.coyote.http11.InternalOutputBuffer.write(InternalOutputBuffer.java:688) 
>>>
>>>     at 
>>> org.apache.coyote.http11.InternalOutputBuffer.write(InternalOutputBuffer.java:616) 
>>>
>>>     at 
>>> org.apache.coyote.http11.InternalOutputBuffer.sendHeader(InternalOutputBuffer.java:496) 
>>>
>>>     at 
>>> org.apache.coyote.http11.Http11Processor.prepareResponse(Http11Processor.java:1537) 
>>>
>>>     at 
>>> org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:892) 
>>>
>>>     at org.apache.coyote.Response.action(Response.java:182)
>>>     at org.apache.coyote.Response.sendHeaders(Response.java:374)
>>>     at 
>>> org.apache.coyote.tomcat5.OutputBuffer.doFlush(OutputBuffer.java:322)
>>>     at 
>>> org.apache.coyote.tomcat5.OutputBuffer.close(OutputBuffer.java:283)
>>>     at 
>>> org.apache.coyote.tomcat5.CoyoteResponse.finishResponse(CoyoteResponse.java:477) 
>>>
>>>     at 
>>> org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:163)
>>>     at 
>>> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799) 
>>>
>>>     at 
>>> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705) 
>>>
>>>     at 
>>> org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577) 
>>>
>>>     at 
>>> org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) 
>>>
>>>     at java.lang.Thread.run(Thread.java:534)
>>>
>>> However, when I changed the code from using the request/response 
>>> object to use the PortletSession, everything worked as expected. 
>>> What follows is the source code for the portlet. I commented out the 
>>> session object code and left the code that breaks active so that you 
>>> can test it yourself if you wish.
>>>
>>> import javax.portlet.*;
>>> import java.io.IOException;
>>> import java.io.PrintWriter;
>>> import java.io.InputStream;
>>>
>>> public class ShowFilePortlet extends GenericPortlet
>>> {
>>>     public void processAction(ActionRequest request, ActionResponse 
>>> response)
>>>             throws PortletException, IOException
>>>     {
>>>         StringBuffer sb = new StringBuffer();
>>>         InputStream is = request.getPortletInputStream();
>>>         for(int i = is.read(); i != -1; i = is.read())
>>>             sb.append((char)i);
>>>                PortletSession ps = request.getPortletSession();
>>>         response.setRenderParameter("filedata", sb.toString());
>>>            /* ps.setAttribute("filedata", sb.toString()); */
>>>     }
>>>
>>>     public void doView(RenderRequest request, RenderResponse response)
>>>             throws PortletException, IOException
>>>     {
>>>         response.setContentType("text/html");
>>>         PrintWriter out = response.getWriter();
>>>         StringBuffer text = new StringBuffer();
>>>                // Retrieve value of filedata parameter.
>>>         /* PortletSession ps = request.getPortletSession();
>>>         String filedata = (String)ps.getAttribute("filedata");
>>>         ps.removeAttribute("filedata"); */
>>>         String filedata = request.getParameter("filedata");
>>>                    // Create form with "Select New File" button.
>>>         text.append("<p>Please select a file and press the View File 
>>> button.</p>");
>>>                text.append("<form method=\"post\" action=\"");
>>>         text.append(response.createActionURL().toString());
>>>         text.append("\" enctype=\"multipart/form-data\">");
>>>
>>>         text.append("File: <input type=\"file\" 
>>> name=\"file\"><br/><br/>");
>>>         text.append("<input type=\"submit\" value=\"View File\">");
>>>                text.append("</form>");
>>>
>>>         text.append("<hr/>");
>>>                if(filedata != null)
>>>             text.append(filedata);
>>>
>>>         out.println(text);
>>>     }
>>> }
>>>
>>> -- 
>>> *----*----*----*----*----*----*----*----*----*----*----*----
>>> Stay on top of all things to do with JSR-168 Portlet and
>>> Portal development by bookmarking the authority on the
>>> subject: http://community.java.net/portlet
>>> *
>>> * News
>>> * Weblogs
>>> * Community Tips
>>> * Portlet and Portal Projects
>>> * Featured Articles
>>> * And much more
>>> *
>>> *----*----*----*----*----*----*----*----*----*----*----*----
>>> Ken Ramirez
>>> Send mail to: mailto://kramirez@TheJavaThinkTank.org
>>> Check out the website: http://www.TheJavaThinkTank.org
>>> Check out my Blog at: http://weblogs.java.net/blog/ken_ramirez
>>> *----*----*----*----*----*----*----*----*----*----*----*----
>>>  
>>>
>> Maybe the URL length is restricted to 2k by tomcat. You should not 
>> store that amount of data in render parameters. Render parameter 
>> should define the view state only.
>>
>> Stefan
>
>
>-- 
>*----*----*----*----*----*----*----*----*----*----*----*----
>Stay on top of all things to do with JSR-168 Portlet and
>Portal development by bookmarking the authority on the
>subject: http://community.java.net/portlet
>*
>* News
>* Weblogs
>* Community Tips
>* Portlet and Portal Projects
>* Featured Articles
>* And much more
>*
>*----*----*----*----*----*----*----*----*----*----*----*----
>Ken Ramirez
>Send mail to: mailto://kramirez@TheJavaThinkTank.org
>Check out the website: http://www.TheJavaThinkTank.org
>Check out my Blog at: http://weblogs.java.net/blog/ken_ramirez
>*----*----*----*----*----*----*----*----*----*----*----*----
>  
>