I take it by the deafening silence that this is either exceptionally trivial or exceptionally hard. Has anyone got any ideas?
Thanks,
Rob Cole
CSA Web
"Robert Cole" <[EMAIL PROTECTED]>
27/09/2005 14:45
To
[email protected]
cc
Please respond to
"Tapestry users" <[email protected]>
Subject
Page recorder for page X locked after a commit()
Hi All,
Tapestry 3.0.3 on JDK 1.5
I'm running into the locked page problem when trying to read the content of
multiple pages to generate a PDF.
Some background. We've written a page that is used to display company
information for 200 companies. The pages a normally viewed as HTML, but I've
written some code that uses the IRequestCycle to render the page that I capture
and convert to a PDF, which all works fine.
The problem is that now we need to convert all of the company pages to 1 big
PDF rather than 200 small ones. I don't want to write a page that shows every
company page as an HTML page and then convert that as it would use a large
amount of memory and CPU. So, I'm trying to convert each page at a time and
then get the 1st page of the PDF and add that to a larger document.
So, the process goes:
Service receives request.
Gets list of companies
For each company:
Generate the HTML page
Convert to PDF
Add pdf page to big report
The problem is that the second time I try to activate the company page I get
the error shown below:
org.apache.tapestry.ApplicationRuntimeException
Page recorder for page Issuer is locked after a commit(), but received a change
to property issuerTicker of component Issuer.
The code that activates the page is below. The "cycle" object is the instance
of IRequestCycle that is represents the request, so its the one that's passed
into the service that is doing all of the work, so the same cycle is used each
time I use the underlying page to generate the HTML (see where this is going?)
IPage page = cycle.getPage(pageName);
cycle.setServiceParameters(parameters);
cycle.activate(page);
if (page instanceof IExternalPage) {
IExternalPage externalPage = (IExternalPage) page;
externalPage.activateExternalPage(parameters, cycle);
}
byte[] response = renderAndCaptureResponse(cycle);
The last method is:
private byte[] renderAndCaptureResponse(IRequestCycle cycle) {
ByteArrayOutputStream output = new ByteArrayOutputStream(2046);
IPage page = cycle.getPage();
IMarkupWriter writer = page.getResponseWriter(output);
try {
cycle.renderPage(writer);
} finally {
writer.close();
}
return output.toByteArray();
}
Having looked at the documentation around the page recorder I can see that the
commit() method locks the PageRecorder until the next request cycle. So, when I
come to use the page with a new set of parameters, the page falls over with the
exception since I'm using the same cycle each time.
The question is, how do I get around it, or stop it happening? Can I create a
new IRequestCycle object, or clone the existing one so that each page is
rendered for a different request cycle? Or can I tell the page recorder to
uncommit the commit?
Thanks,
Rob Cole
CSA Web
--
This e-mail may contain confidential and/or privileged information. If you are
not the intended recipient (or have received this e-mail in error) please
notify the sender immediately and destroy this e-mail. Any unauthorized
copying, disclosure or distribution of the material in this e-mail is strictly
forbidden.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
--
This e-mail may contain confidential and/or privileged information. If you are
not the intended recipient (or have received this e-mail in error) please
notify the sender immediately and destroy this e-mail. Any unauthorized
copying, disclosure or distribution of the material in this e-mail is strictly
forbidden.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
