[Tapestry 4.1] UTFDataFormatException in RequestCycle.encodeIdState

View: New views
5 Messages — Rating Filter:   Alert me  

[Tapestry 4.1] UTFDataFormatException in RequestCycle.encodeIdState

by Aaron Kaminsky :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi all,
 
I am having a problem with Tapestry 4.1.6.  I have a form with many
(>1000) components.  I get an exception trying to render the page.  It
looks like the attempt in RequestCycle to call encodeIdState is hitting
a 65k length limit in ObjectOutputStream.writeUTF.  Has anyone else
encountered this problem?  I cannot restructure the page to reduce the
number of components, so I need another way to get around this limit.  I
am thinking that I will need to override RequestCycle so I can call
ObjectOutputStream.writeObject instead of .writeUTF when the string is
long.  Does anyone have a better solution?
 
Exception details follow [[
Exception class: org.apache.hivemind.ApplicationRuntimeException
Exception message: Unable to encode object
,service$0,page$0,component$0,container$0,session$0,sp$0,layout$1,link1$
0,shell$0,Insert$2633,Any$9,Insert_0$12,ie6$0,body$0,OnErrorHandler$0,If
$6398,ConfirmFunctions$0,DownloadableJavaScript$5,BootstrapJavaScript$0,
homeTab$0,tabAnnouncement$1,RenderBody$728,sheetsTab$0,tabOverview$1,glo
balsTab$0,tabGlobalsOverview$1,sharedFormulasTab$0,tabSharedFormulas$1,i
mportTab$0,tabModelImport$1,exportTab$0,tabExportVersion$1,reportsTab$0,
Else$637,tabReportMenu$1,masterVersionChangeForm$0,apstate$1,apVerSel$1,
subMenuList$1,submenuItem$0,content$1,WarnOnUnsavedChan
 
... really long string truncated ...

enu$0,APPageLink$0,Image_5$0,APPageLink_0$0,Image_6$0,APPageLink_1$0,Ima
ge_7$0,APPageLink_2$0,Image_8$0,sampleBalanceSheetReport$1,Image_9$0,sam
plePLReport$1,Image_100,addFavoriteSubmitForm$0:java.io.UTFDataFormatExc
eption. This is sometimes caused when classes being serialized to a
stream dont implement java.io.Serializable.
Stack Trace: {
null
}
Exception class: java.io.UTFDataFormatException
Exception message: null
Stack Trace: {
java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(Unknown
Source)
java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(Unknown
Source)
java.io.ObjectOutputStream.writeUTF(Unknown Source)
org.apache.tapestry.util.io.CompressedDataEncoder.encodeStringCompressed
DataEncoder.java:55
org.apache.tapestry.engine.RequestCycle.encodeIdStateRequestCycle.java:6
78
org.apache.tapestry.form.FormSupportImpl.renderFormSupportImpl.java:482
org.apache.tapestry.form.Form.renderComponentForm.java:217
org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
sponseBuilder.java:187
org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java:5
38
org.apache.tapestry.components.RenderBody.renderComponentRenderBody.java
:39
org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
sponseBuilder.java:187
org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java:5
38
org.apache.tapestry.components.RenderBody.renderComponentRenderBody.java
:39
org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
sponseBuilder.java:187
org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java:5
38
org.apache.tapestry.html.Body.renderComponentBody.java:38
org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
sponseBuilder.java:187
org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java:5
38
org.apache.tapestry.html.Shell.renderComponentShell.java:125
org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
sponseBuilder.java:187
org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:107
org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
sponseBuilder.java:187
org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:107
org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
sponseBuilder.java:187
org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:107
org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
sponseBuilder.java:185
org.apache.tapestry.AbstractPage.renderPageAbstractPage.java:249
org.apache.tapestry.engine.RequestCycle.renderPageRequestCycle.java:400
org.apache.tapestry.services.impl.DefaultResponseBuilder.renderResponseD
efaultResponseBuilder.java:159
org.apache.tapestry.services.impl.ResponseRendererImpl.renderResponseRes
ponseRendererImpl.java:33
$ResponseRenderer_12220132922.renderResponse($ResponseRenderer_122201329
22.java)
org.apache.tapestry.engine.ExternalService.serviceExternalService.java:1
61
$IEngineService_122201329aa.service($IEngineService_122201329aa.java)
org.apache.tapestry.services.impl.EngineServiceOuterProxy.serviceEngineS
erviceOuterProxy.java:72
org.apache.tapestry.engine.AbstractEngine.serviceAbstractEngine.java:241
org.apache.tapestry.services.impl.InvokeEngineTerminator.serviceInvokeEn
gineTerminator.java:54
$WebRequestServicer_1222013297a.service($WebRequestServicer_1222013297a.
java)
com.adaptiveplanning.util.TokenizedRequestFilter.serviceTokenizedRequest
Filter.java:65
$WebRequestServicerFilter_12220132978.service($WebRequestServicerFilter_
12220132978.java)
$WebRequestServicer_1222013297c.service($WebRequestServicer_1222013297c.
java)
$WebRequestServicer_12220132974.service($WebRequestServicer_12220132974.
java)
org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.servi
ceWebRequestServicerPipelineBridge.java:61
$ServletRequestServicer_1222013295a.service($ServletRequestServicer_1222
013295a.java)
org.apache.tapestry.request.DecodedRequestInjector.serviceDecodedRequest
Injector.java:55
$ServletRequestServicerFilter_12220132956.service($ServletRequestService
rFilter_12220132956.java)
$ServletRequestServicer_1222013295c.service($ServletRequestServicer_1222
013295c.java)
org.apache.tapestry.multipart.MultipartDecoderFilter.serviceMultipartDec
oderFilter.java:52
$ServletRequestServicerFilter_12220132954.service($ServletRequestService
rFilter_12220132954.java)
$ServletRequestServicer_1222013295c.service($ServletRequestServicer_1222
013295c.java)
org.apache.tapestry.services.impl.SetupRequestEncoding.serviceSetupReque
stEncoding.java:53
$ServletRequestServicerFilter_12220132958.service($ServletRequestService
rFilter_12220132958.java)
$ServletRequestServicer_1222013295c.service($ServletRequestServicer_1222
013295c.java)
$ServletRequestServicer_1222013294e.service($ServletRequestServicer_1222
013294e.java)
org.apache.tapestry.ApplicationServlet.doServiceApplicationServlet.java:
126
org.apache.tapestry.ApplicationServlet.doGetApplicationServlet.java:103
javax.servlet.http.HttpServlet.serviceHttpServlet.java:690
javax.servlet.http.HttpServlet.serviceHttpServlet.java:803
org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicat
ionFilterChain.java:290
org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilte
rChain.java:206
com.adaptiveplanning.system.ConnectionLeakDetector.doFilterConnectionLea
kDetector.java:58
org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicat
ionFilterChain.java:235
org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilte
rChain.java:206
com.adaptiveplanning.system.RequestMonitor$RequestHandler.performNativeP
rocessingRequestMonitor.java:197
com.adaptiveplanning.system.RequestMonitor$ForkedRequestHandler$1.callRe
questMonitor.java:285
com.adaptiveplanning.system.RequestMonitor$ForkedRequestHandler$1.callRe
questMonitor.java:283
java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
java.util.concurrent.FutureTask.run(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)
}
]]
Request parameters are [[
]]

 
Thanks and Regards,
Aaron Kaminsky

Re: [Tapestry 4.1] UTFDataFormatException in RequestCycle.encodeIdState

by Howard Lewis Ship :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

That's an unexpected limitation!
In exceptional cases, you can revert to simpler methods; for instance, using
a simple <input type="text"/> rather than a TextField component, and
handling that part of the submission inside your listener method much like a
traditional servlet.

As a stop-gap, you should give explicit jwcids to ALL of your components, as
use shorter names ... this will buy you a lot
(if you see the repetition in the generated element ids string at the
root of your problem).  This
may be a time to use less intuitive names (i.e., use abbreviations!).

On Thu, Jul 2, 2009 at 3:31 PM, Aaron Kaminsky
<AaronK@...>wrote:

> Hi all,
>
> I am having a problem with Tapestry 4.1.6.  I have a form with many
> (>1000) components.  I get an exception trying to render the page.  It
> looks like the attempt in RequestCycle to call encodeIdState is hitting
> a 65k length limit in ObjectOutputStream.writeUTF.  Has anyone else
> encountered this problem?  I cannot restructure the page to reduce the
> number of components, so I need another way to get around this limit.  I
> am thinking that I will need to override RequestCycle so I can call
> ObjectOutputStream.writeObject instead of .writeUTF when the string is
> long.  Does anyone have a better solution?
>
> Exception details follow [[
> Exception class: org.apache.hivemind.ApplicationRuntimeException
> Exception message: Unable to encode object
> ,service$0,page$0,component$0,container$0,session$0,sp$0,layout$1,link1$
> 0,shell$0,Insert$2633,Any$9,Insert_0$12,ie6$0,body$0,OnErrorHandler$0,If
> $6398,ConfirmFunctions$0,DownloadableJavaScript$5,BootstrapJavaScript$0,
> homeTab$0,tabAnnouncement$1,RenderBody$728,sheetsTab$0,tabOverview$1,glo
> balsTab$0,tabGlobalsOverview$1,sharedFormulasTab$0,tabSharedFormulas$1,i
> mportTab$0,tabModelImport$1,exportTab$0,tabExportVersion$1,reportsTab$0,
> Else$637,tabReportMenu$1,masterVersionChangeForm$0,apstate$1,apVerSel$1,
> subMenuList$1,submenuItem$0,content$1,WarnOnUnsavedChan
>
> ... really long string truncated ...
>
> enu$0,APPageLink$0,Image_5$0,APPageLink_0$0,Image_6$0,APPageLink_1$0,Ima
> ge_7$0,APPageLink_2$0,Image_8$0,sampleBalanceSheetReport$1,Image_9$0,sam
> plePLReport$1,Image_100,addFavoriteSubmitForm$0:java.io.UTFDataFormatExc
> eption. This is sometimes caused when classes being serialized to a
> stream dont implement java.io.Serializable.
> Stack Trace: {
> null
> }
> Exception class: java.io.UTFDataFormatException
> Exception message: null
> Stack Trace: {
> java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(Unknown
> Source)
> java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(Unknown
> Source)
> java.io.ObjectOutputStream.writeUTF(Unknown Source)
> org.apache.tapestry.util.io.CompressedDataEncoder.encodeStringCompressed
> DataEncoder.java:55
> org.apache.tapestry.engine.RequestCycle.encodeIdStateRequestCycle.java:6
> 78
> org.apache.tapestry.form.FormSupportImpl.renderFormSupportImpl.java:482
> org.apache.tapestry.form.Form.renderComponentForm.java:217
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
> sponseBuilder.java:187
> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java:5
> 38
> org.apache.tapestry.components.RenderBody.renderComponentRenderBody.java
> :39
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
> sponseBuilder.java:187
> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java:5
> 38
> org.apache.tapestry.components.RenderBody.renderComponentRenderBody.java
> :39
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
> sponseBuilder.java:187
> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java:5
> 38
> org.apache.tapestry.html.Body.renderComponentBody.java:38
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
> sponseBuilder.java:187
> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java:5
> 38
> org.apache.tapestry.html.Shell.renderComponentShell.java:125
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
> sponseBuilder.java:187
> org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:107
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
> sponseBuilder.java:187
> org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:107
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
> sponseBuilder.java:187
> org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:107
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefaultRe
> sponseBuilder.java:185
> org.apache.tapestry.AbstractPage.renderPageAbstractPage.java:249
> org.apache.tapestry.engine.RequestCycle.renderPageRequestCycle.java:400
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderResponseD
> efaultResponseBuilder.java:159
> org.apache.tapestry.services.impl.ResponseRendererImpl.renderResponseRes
> ponseRendererImpl.java:33
> $ResponseRenderer_12220132922.renderResponse($ResponseRenderer_122201329
> 22.java)
> org.apache.tapestry.engine.ExternalService.serviceExternalService.java:1
> 61
> $IEngineService_122201329aa.service($IEngineService_122201329aa.java)
> org.apache.tapestry.services.impl.EngineServiceOuterProxy.serviceEngineS
> erviceOuterProxy.java:72
> org.apache.tapestry.engine.AbstractEngine.serviceAbstractEngine.java:241
> org.apache.tapestry.services.impl.InvokeEngineTerminator.serviceInvokeEn
> gineTerminator.java:54
> $WebRequestServicer_1222013297a.service($WebRequestServicer_1222013297a.
> java)
> com.adaptiveplanning.util.TokenizedRequestFilter.serviceTokenizedRequest
> Filter.java:65
> $WebRequestServicerFilter_12220132978.service($WebRequestServicerFilter_
> 12220132978.java)
> $WebRequestServicer_1222013297c.service($WebRequestServicer_1222013297c.
> java)
> $WebRequestServicer_12220132974.service($WebRequestServicer_12220132974.
> java)
> org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.servi
> ceWebRequestServicerPipelineBridge.java:61
> $ServletRequestServicer_1222013295a.service($ServletRequestServicer_1222
> 013295a.java)
> org.apache.tapestry.request.DecodedRequestInjector.serviceDecodedRequest
> Injector.java:55
> $ServletRequestServicerFilter_12220132956.service($ServletRequestService
> rFilter_12220132956.java)
> $ServletRequestServicer_1222013295c.service($ServletRequestServicer_1222
> 013295c.java)
> org.apache.tapestry.multipart.MultipartDecoderFilter.serviceMultipartDec
> oderFilter.java:52
> $ServletRequestServicerFilter_12220132954.service($ServletRequestService
> rFilter_12220132954.java)
> $ServletRequestServicer_1222013295c.service($ServletRequestServicer_1222
> 013295c.java)
> org.apache.tapestry.services.impl.SetupRequestEncoding.serviceSetupReque
> stEncoding.java:53
> $ServletRequestServicerFilter_12220132958.service($ServletRequestService
> rFilter_12220132958.java)
> $ServletRequestServicer_1222013295c.service($ServletRequestServicer_1222
> 013295c.java)
> $ServletRequestServicer_1222013294e.service($ServletRequestServicer_1222
> 013294e.java)
> org.apache.tapestry.ApplicationServlet.doServiceApplicationServlet.java:
> 126
> org.apache.tapestry.ApplicationServlet.doGetApplicationServlet.java:103
> javax.servlet.http.HttpServlet.serviceHttpServlet.java:690
> javax.servlet.http.HttpServlet.serviceHttpServlet.java:803
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicat
> ionFilterChain.java:290
> org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilte
> rChain.java:206
> com.adaptiveplanning.system.ConnectionLeakDetector.doFilterConnectionLea
> kDetector.java:58
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicat
> ionFilterChain.java:235
> org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilte
> rChain.java:206
> com.adaptiveplanning.system.RequestMonitor$RequestHandler.performNativeP
> rocessingRequestMonitor.java:197
> com.adaptiveplanning.system.RequestMonitor$ForkedRequestHandler$1.callRe
> questMonitor.java:285
> com.adaptiveplanning.system.RequestMonitor$ForkedRequestHandler$1.callRe
> questMonitor.java:283
> java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
> java.util.concurrent.FutureTask.run(Unknown Source)
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
> java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
> java.lang.Thread.run(Unknown Source)
> }
> ]]
> Request parameters are [[
> ]]
>
>
> Thanks and Regards,
> Aaron Kaminsky
>



--
Howard M. Lewis Ship

Creator of Apache Tapestry
Director of Open Source Technology at Formos

RE: [Tapestry 4.1] UTFDataFormatException in RequestCycle.encodeIdState

by Aaron Kaminsky :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi Howard,

Thanks for the suggestion.  In our case we may have been able to get by with the workaround you suggested, but it turned out to be much simpler for us to replace the calls to objectOutputStream.writeUTF() with calls to objectOutputStream.writeUnshared().

In case anyone else runs into this, the following approach is working well for us.

We had to create our own RequestCycleFactoryImpl, RequestCycle and CompressedDataEncoder classes to plumb in the writeUTF -> writeUnshared change.  That was done by adding a block to hivemodule.xml to replace the implementation of service-id="tapestry.request.RequestCycleFactory".  We were worried about a performance hit with the change but it seems to be at least as fast for us.  This approach also removes any possibility of running into this limitation in the future.

Regards,
Aaron


-----Original Message-----
From: Howard Lewis Ship [mailto:hlship@...]
Sent: Thursday, July 02, 2009 4:27 PM
To: Tapestry users
Subject: Re: [Tapestry 4.1] UTFDataFormatException in RequestCycle.encodeIdState

That's an unexpected limitation!
In exceptional cases, you can revert to simpler methods; for instance, using a simple <input type="text"/> rather than a TextField component, and handling that part of the submission inside your listener method much like a traditional servlet.

As a stop-gap, you should give explicit jwcids to ALL of your components, as use shorter names ... this will buy you a lot (if you see the repetition in the generated element ids string at the root of your problem).  This may be a time to use less intuitive names (i.e., use abbreviations!).

On Thu, Jul 2, 2009 at 3:31 PM, Aaron Kaminsky
<AaronK@...>wrote:

> Hi all,
>
> I am having a problem with Tapestry 4.1.6.  I have a form with many
> (>1000) components.  I get an exception trying to render the page.  It
> looks like the attempt in RequestCycle to call encodeIdState is
> hitting a 65k length limit in ObjectOutputStream.writeUTF.  Has anyone
> else encountered this problem?  I cannot restructure the page to
> reduce the number of components, so I need another way to get around
> this limit.  I am thinking that I will need to override RequestCycle
> so I can call ObjectOutputStream.writeObject instead of .writeUTF when
> the string is long.  Does anyone have a better solution?
>
> Exception details follow [[
> Exception class: org.apache.hivemind.ApplicationRuntimeException
> Exception message: Unable to encode object
> ,service$0,page$0,component$0,container$0,session$0,sp$0,layout$1,link
> 1$
> 0,shell$0,Insert$2633,Any$9,Insert_0$12,ie6$0,body$0,OnErrorHandler$0,
> If
> $6398,ConfirmFunctions$0,DownloadableJavaScript$5,BootstrapJavaScript$
> 0,
> homeTab$0,tabAnnouncement$1,RenderBody$728,sheetsTab$0,tabOverview$1,g
> lo
> balsTab$0,tabGlobalsOverview$1,sharedFormulasTab$0,tabSharedFormulas$1
> ,i
> mportTab$0,tabModelImport$1,exportTab$0,tabExportVersion$1,reportsTab$
> 0,
> Else$637,tabReportMenu$1,masterVersionChangeForm$0,apstate$1,apVerSel$
> 1, subMenuList$1,submenuItem$0,content$1,WarnOnUnsavedChan
>
> ... really long string truncated ...
>
> enu$0,APPageLink$0,Image_5$0,APPageLink_0$0,Image_6$0,APPageLink_1$0,I
> ma
> ge_7$0,APPageLink_2$0,Image_8$0,sampleBalanceSheetReport$1,Image_9$0,s
> am
> plePLReport$1,Image_100,addFavoriteSubmitForm$0:java.io.UTFDataFormatE
> xc eption. This is sometimes caused when classes being serialized to a
> stream dont implement java.io.Serializable.
> Stack Trace: {
> null
> }
> Exception class: java.io.UTFDataFormatException Exception message:
> null Stack Trace: {
> java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(Unknown
> Source)
> java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(Unknown
> Source)
> java.io.ObjectOutputStream.writeUTF(Unknown Source)
> org.apache.tapestry.util.io.CompressedDataEncoder.encodeStringCompress
> ed
> DataEncoder.java:55
> org.apache.tapestry.engine.RequestCycle.encodeIdStateRequestCycle.java
> :6
> 78
> org.apache.tapestry.form.FormSupportImpl.renderFormSupportImpl.java:48
> 2
> org.apache.tapestry.form.Form.renderComponentForm.java:217
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
> Re
> sponseBuilder.java:187
> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java
> :5
> 38
> org.apache.tapestry.components.RenderBody.renderComponentRenderBody.ja
> va
> :39
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
> Re
> sponseBuilder.java:187
> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java
> :5
> 38
> org.apache.tapestry.components.RenderBody.renderComponentRenderBody.ja
> va
> :39
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
> Re
> sponseBuilder.java:187
> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java
> :5
> 38
> org.apache.tapestry.html.Body.renderComponentBody.java:38
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
> Re
> sponseBuilder.java:187
> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java
> :5
> 38
> org.apache.tapestry.html.Shell.renderComponentShell.java:125
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
> Re
> sponseBuilder.java:187
> org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:10
> 7
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
> Re
> sponseBuilder.java:187
> org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:10
> 7
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
> Re
> sponseBuilder.java:187
> org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:10
> 7
> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
> Re
> sponseBuilder.java:185
> org.apache.tapestry.AbstractPage.renderPageAbstractPage.java:249
> org.apache.tapestry.engine.RequestCycle.renderPageRequestCycle.java:40
> 0
> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderRespons
> eD
> efaultResponseBuilder.java:159
> org.apache.tapestry.services.impl.ResponseRendererImpl.renderResponseR
> es
> ponseRendererImpl.java:33
> $ResponseRenderer_12220132922.renderResponse($ResponseRenderer_1222013
> 29
> 22.java)
> org.apache.tapestry.engine.ExternalService.serviceExternalService.java
> :1
> 61
> $IEngineService_122201329aa.service($IEngineService_122201329aa.java)
> org.apache.tapestry.services.impl.EngineServiceOuterProxy.serviceEngin
> eS
> erviceOuterProxy.java:72
> org.apache.tapestry.engine.AbstractEngine.serviceAbstractEngine.java:2
> 41
> org.apache.tapestry.services.impl.InvokeEngineTerminator.serviceInvoke
> En
> gineTerminator.java:54
> $WebRequestServicer_1222013297a.service($WebRequestServicer_1222013297a.
> java)
> com.adaptiveplanning.util.TokenizedRequestFilter.serviceTokenizedReque
> st
> Filter.java:65
> $WebRequestServicerFilter_12220132978.service($WebRequestServicerFilte
> r_
> 12220132978.java)
> $WebRequestServicer_1222013297c.service($WebRequestServicer_1222013297c.
> java)
> $WebRequestServicer_12220132974.service($WebRequestServicer_12220132974.
> java)
> org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.ser
> vi
> ceWebRequestServicerPipelineBridge.java:61
> $ServletRequestServicer_1222013295a.service($ServletRequestServicer_12
> 22
> 013295a.java)
> org.apache.tapestry.request.DecodedRequestInjector.serviceDecodedReque
> st
> Injector.java:55
> $ServletRequestServicerFilter_12220132956.service($ServletRequestServi
> ce
> rFilter_12220132956.java)
> $ServletRequestServicer_1222013295c.service($ServletRequestServicer_12
> 22
> 013295c.java)
> org.apache.tapestry.multipart.MultipartDecoderFilter.serviceMultipartD
> ec
> oderFilter.java:52
> $ServletRequestServicerFilter_12220132954.service($ServletRequestServi
> ce
> rFilter_12220132954.java)
> $ServletRequestServicer_1222013295c.service($ServletRequestServicer_12
> 22
> 013295c.java)
> org.apache.tapestry.services.impl.SetupRequestEncoding.serviceSetupReq
> ue
> stEncoding.java:53
> $ServletRequestServicerFilter_12220132958.service($ServletRequestServi
> ce
> rFilter_12220132958.java)
> $ServletRequestServicer_1222013295c.service($ServletRequestServicer_12
> 22
> 013295c.java)
> $ServletRequestServicer_1222013294e.service($ServletRequestServicer_12
> 22
> 013294e.java)
> org.apache.tapestry.ApplicationServlet.doServiceApplicationServlet.java:
> 126
> org.apache.tapestry.ApplicationServlet.doGetApplicationServlet.java:10
> 3 javax.servlet.http.HttpServlet.serviceHttpServlet.java:690
> javax.servlet.http.HttpServlet.serviceHttpServlet.java:803
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplic
> at
> ionFilterChain.java:290
> org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFil
> te
> rChain.java:206
> com.adaptiveplanning.system.ConnectionLeakDetector.doFilterConnectionL
> ea
> kDetector.java:58
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplic
> at
> ionFilterChain.java:235
> org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFil
> te
> rChain.java:206
> com.adaptiveplanning.system.RequestMonitor$RequestHandler.performNativ
> eP
> rocessingRequestMonitor.java:197
> com.adaptiveplanning.system.RequestMonitor$ForkedRequestHandler$1.call
> Re
> questMonitor.java:285
> com.adaptiveplanning.system.RequestMonitor$ForkedRequestHandler$1.call
> Re
> questMonitor.java:283
> java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
> java.util.concurrent.FutureTask.run(Unknown Source)
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
> java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
> java.lang.Thread.run(Unknown Source) } ]] Request parameters are [[ ]]
>
>
> Thanks and Regards,
> Aaron Kaminsky
>



--
Howard M. Lewis Ship

Creator of Apache Tapestry
Director of Open Source Technology at Formos

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: [Tapestry 4.1] UTFDataFormatException in RequestCycle.encodeIdState

by Howard Lewis Ship :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Glad you're OK.  I would still suggest doing some of the changes I
suggested.  Or upgrade to T5.1 :-)

On Mon, Jul 6, 2009 at 2:46 PM, Aaron
Kaminsky<AaronK@...> wrote:

> Hi Howard,
>
> Thanks for the suggestion.  In our case we may have been able to get by with the workaround you suggested, but it turned out to be much simpler for us to replace the calls to objectOutputStream.writeUTF() with calls to objectOutputStream.writeUnshared().
>
> In case anyone else runs into this, the following approach is working well for us.
>
> We had to create our own RequestCycleFactoryImpl, RequestCycle and CompressedDataEncoder classes to plumb in the writeUTF -> writeUnshared change.  That was done by adding a block to hivemodule.xml to replace the implementation of service-id="tapestry.request.RequestCycleFactory".  We were worried about a performance hit with the change but it seems to be at least as fast for us.  This approach also removes any possibility of running into this limitation in the future.
>
> Regards,
> Aaron
>
>
> -----Original Message-----
> From: Howard Lewis Ship [mailto:hlship@...]
> Sent: Thursday, July 02, 2009 4:27 PM
> To: Tapestry users
> Subject: Re: [Tapestry 4.1] UTFDataFormatException in RequestCycle.encodeIdState
>
> That's an unexpected limitation!
> In exceptional cases, you can revert to simpler methods; for instance, using a simple <input type="text"/> rather than a TextField component, and handling that part of the submission inside your listener method much like a traditional servlet.
>
> As a stop-gap, you should give explicit jwcids to ALL of your components, as use shorter names ... this will buy you a lot (if you see the repetition in the generated element ids string at the root of your problem).  This may be a time to use less intuitive names (i.e., use abbreviations!).
>
> On Thu, Jul 2, 2009 at 3:31 PM, Aaron Kaminsky
> <AaronK@...>wrote:
>
>> Hi all,
>>
>> I am having a problem with Tapestry 4.1.6.  I have a form with many
>> (>1000) components.  I get an exception trying to render the page.  It
>> looks like the attempt in RequestCycle to call encodeIdState is
>> hitting a 65k length limit in ObjectOutputStream.writeUTF.  Has anyone
>> else encountered this problem?  I cannot restructure the page to
>> reduce the number of components, so I need another way to get around
>> this limit.  I am thinking that I will need to override RequestCycle
>> so I can call ObjectOutputStream.writeObject instead of .writeUTF when
>> the string is long.  Does anyone have a better solution?
>>
>> Exception details follow [[
>> Exception class: org.apache.hivemind.ApplicationRuntimeException
>> Exception message: Unable to encode object
>> ,service$0,page$0,component$0,container$0,session$0,sp$0,layout$1,link
>> 1$
>> 0,shell$0,Insert$2633,Any$9,Insert_0$12,ie6$0,body$0,OnErrorHandler$0,
>> If
>> $6398,ConfirmFunctions$0,DownloadableJavaScript$5,BootstrapJavaScript$
>> 0,
>> homeTab$0,tabAnnouncement$1,RenderBody$728,sheetsTab$0,tabOverview$1,g
>> lo
>> balsTab$0,tabGlobalsOverview$1,sharedFormulasTab$0,tabSharedFormulas$1
>> ,i
>> mportTab$0,tabModelImport$1,exportTab$0,tabExportVersion$1,reportsTab$
>> 0,
>> Else$637,tabReportMenu$1,masterVersionChangeForm$0,apstate$1,apVerSel$
>> 1, subMenuList$1,submenuItem$0,content$1,WarnOnUnsavedChan
>>
>> ... really long string truncated ...
>>
>> enu$0,APPageLink$0,Image_5$0,APPageLink_0$0,Image_6$0,APPageLink_1$0,I
>> ma
>> ge_7$0,APPageLink_2$0,Image_8$0,sampleBalanceSheetReport$1,Image_9$0,s
>> am
>> plePLReport$1,Image_100,addFavoriteSubmitForm$0:java.io.UTFDataFormatE
>> xc eption. This is sometimes caused when classes being serialized to a
>> stream dont implement java.io.Serializable.
>> Stack Trace: {
>> null
>> }
>> Exception class: java.io.UTFDataFormatException Exception message:
>> null Stack Trace: {
>> java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(Unknown
>> Source)
>> java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(Unknown
>> Source)
>> java.io.ObjectOutputStream.writeUTF(Unknown Source)
>> org.apache.tapestry.util.io.CompressedDataEncoder.encodeStringCompress
>> ed
>> DataEncoder.java:55
>> org.apache.tapestry.engine.RequestCycle.encodeIdStateRequestCycle.java
>> :6
>> 78
>> org.apache.tapestry.form.FormSupportImpl.renderFormSupportImpl.java:48
>> 2
>> org.apache.tapestry.form.Form.renderComponentForm.java:217
>> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
>> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
>> Re
>> sponseBuilder.java:187
>> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java
>> :5
>> 38
>> org.apache.tapestry.components.RenderBody.renderComponentRenderBody.ja
>> va
>> :39
>> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
>> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
>> Re
>> sponseBuilder.java:187
>> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java
>> :5
>> 38
>> org.apache.tapestry.components.RenderBody.renderComponentRenderBody.ja
>> va
>> :39
>> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
>> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
>> Re
>> sponseBuilder.java:187
>> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java
>> :5
>> 38
>> org.apache.tapestry.html.Body.renderComponentBody.java:38
>> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
>> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
>> Re
>> sponseBuilder.java:187
>> org.apache.tapestry.AbstractComponent.renderBodyAbstractComponent.java
>> :5
>> 38
>> org.apache.tapestry.html.Shell.renderComponentShell.java:125
>> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
>> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
>> Re
>> sponseBuilder.java:187
>> org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:10
>> 7
>> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
>> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
>> Re
>> sponseBuilder.java:187
>> org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:10
>> 7
>> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
>> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
>> Re
>> sponseBuilder.java:187
>> org.apache.tapestry.BaseComponent.renderComponentBaseComponent.java:10
>> 7
>> org.apache.tapestry.AbstractComponent.renderAbstractComponent.java:724
>> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderDefault
>> Re
>> sponseBuilder.java:185
>> org.apache.tapestry.AbstractPage.renderPageAbstractPage.java:249
>> org.apache.tapestry.engine.RequestCycle.renderPageRequestCycle.java:40
>> 0
>> org.apache.tapestry.services.impl.DefaultResponseBuilder.renderRespons
>> eD
>> efaultResponseBuilder.java:159
>> org.apache.tapestry.services.impl.ResponseRendererImpl.renderResponseR
>> es
>> ponseRendererImpl.java:33
>> $ResponseRenderer_12220132922.renderResponse($ResponseRenderer_1222013
>> 29
>> 22.java)
>> org.apache.tapestry.engine.ExternalService.serviceExternalService.java
>> :1
>> 61
>> $IEngineService_122201329aa.service($IEngineService_122201329aa.java)
>> org.apache.tapestry.services.impl.EngineServiceOuterProxy.serviceEngin
>> eS
>> erviceOuterProxy.java:72
>> org.apache.tapestry.engine.AbstractEngine.serviceAbstractEngine.java:2
>> 41
>> org.apache.tapestry.services.impl.InvokeEngineTerminator.serviceInvoke
>> En
>> gineTerminator.java:54
>> $WebRequestServicer_1222013297a.service($WebRequestServicer_1222013297a.
>> java)
>> com.adaptiveplanning.util.TokenizedRequestFilter.serviceTokenizedReque
>> st
>> Filter.java:65
>> $WebRequestServicerFilter_12220132978.service($WebRequestServicerFilte
>> r_
>> 12220132978.java)
>> $WebRequestServicer_1222013297c.service($WebRequestServicer_1222013297c.
>> java)
>> $WebRequestServicer_12220132974.service($WebRequestServicer_12220132974.
>> java)
>> org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.ser
>> vi
>> ceWebRequestServicerPipelineBridge.java:61
>> $ServletRequestServicer_1222013295a.service($ServletRequestServicer_12
>> 22
>> 013295a.java)
>> org.apache.tapestry.request.DecodedRequestInjector.serviceDecodedReque
>> st
>> Injector.java:55
>> $ServletRequestServicerFilter_12220132956.service($ServletRequestServi
>> ce
>> rFilter_12220132956.java)
>> $ServletRequestServicer_1222013295c.service($ServletRequestServicer_12
>> 22
>> 013295c.java)
>> org.apache.tapestry.multipart.MultipartDecoderFilter.serviceMultipartD
>> ec
>> oderFilter.java:52
>> $ServletRequestServicerFilter_12220132954.service($ServletRequestServi
>> ce
>> rFilter_12220132954.java)
>> $ServletRequestServicer_1222013295c.service($ServletRequestServicer_12
>> 22
>> 013295c.java)
>> org.apache.tapestry.services.impl.SetupRequestEncoding.serviceSetupReq
>> ue
>> stEncoding.java:53
>> $ServletRequestServicerFilter_12220132958.service($ServletRequestServi
>> ce
>> rFilter_12220132958.java)
>> $ServletRequestServicer_1222013295c.service($ServletRequestServicer_12
>> 22
>> 013295c.java)
>> $ServletRequestServicer_1222013294e.service($ServletRequestServicer_12
>> 22
>> 013294e.java)
>> org.apache.tapestry.ApplicationServlet.doServiceApplicationServlet.java:
>> 126
>> org.apache.tapestry.ApplicationServlet.doGetApplicationServlet.java:10
>> 3 javax.servlet.http.HttpServlet.serviceHttpServlet.java:690
>> javax.servlet.http.HttpServlet.serviceHttpServlet.java:803
>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplic
>> at
>> ionFilterChain.java:290
>> org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFil
>> te
>> rChain.java:206
>> com.adaptiveplanning.system.ConnectionLeakDetector.doFilterConnectionL
>> ea
>> kDetector.java:58
>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplic
>> at
>> ionFilterChain.java:235
>> org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFil
>> te
>> rChain.java:206
>> com.adaptiveplanning.system.RequestMonitor$RequestHandler.performNativ
>> eP
>> rocessingRequestMonitor.java:197
>> com.adaptiveplanning.system.RequestMonitor$ForkedRequestHandler$1.call
>> Re
>> questMonitor.java:285
>> com.adaptiveplanning.system.RequestMonitor$ForkedRequestHandler$1.call
>> Re
>> questMonitor.java:283
>> java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
>> java.util.concurrent.FutureTask.run(Unknown Source)
>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
>> java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
>> java.lang.Thread.run(Unknown Source) } ]] Request parameters are [[ ]]
>>
>>
>> Thanks and Regards,
>> Aaron Kaminsky
>>
>
>
>
> --
> Howard M. Lewis Ship
>
> Creator of Apache Tapestry
> Director of Open Source Technology at Formos
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@...
> For additional commands, e-mail: users-help@...
>
>



--
Howard M. Lewis Ship

Creator of Apache Tapestry
Director of Open Source Technology at Formos

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


RE: [Tapestry 4.1] UTFDataFormatException in RequestCycle.encodeIdState

by Woozy :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

In digging into the source of ObjectOutputStream, (1.6.0_11) this appears to be the best option anyway - if writeUnshared() is called with a String, it eventually calls a method writeString() that does the UTF length check and calls a special "writeLongUTF()" method on the backing BlockDataOutputStream.

This gets the same performance benefit without the length limitation, or any special handling in the calling code.

Just confirming Aaron's fix wouldn't cause any performance hit, or even necessarily the rendered result, except in extreme cases like this where the UTF8 string header in the output stream is 8 bytes instead of 2.


...it turned out to be much simpler for us to replace the calls to objectOutputStream.writeUTF() with calls to objectOutputStream.writeUnshared().

In case anyone else runs into this, the following approach is working well for us.

We had to create our own RequestCycleFactoryImpl, RequestCycle and CompressedDataEncoder classes to plumb in the writeUTF -> writeUnshared change.  That was done by adding a block to hivemodule.xml to replace the implementation of service-id="tapestry.request.RequestCycleFactory".  We were worried about a performance hit with the change but it seems to be at least as fast for us.
...