>From: "Steve Olson" <[EMAIL PROTECTED]> 
>
> Gary, I wanted to thank you for your well-thought-out post just before 
> Christmas. I have attributes on my custom component now that support 
> selecting HTML or PDF, popup window or embedded, for reports. The embed 
> option (I ended up using an OBJECT tag) with a separate servlet serving up 
> the PDF avoided the need for extra renderkits for the PDF. The pop-up 
> options worked out well also. Thanks for pointing me in the right 
> directions. 
> 
> I have been enjoying Clay the more I learn about how to use it. Good 
> stuff... 
> 


I'm glad that I could help out and I hope to see you hanging around.


Gary

> 
> ----- Original Message ----- 
> From: "Gary VanMatre" 
> To: 
> Sent: Sunday, December 24, 2006 10:04 AM 
> Subject: Re: Question about custom component and PDF 
> 
> 
> > >From: "Steve Olson" 
> >> 
> >> I'm new to Clay, and just slightly less new to JSF. I'm experimenting 
> >> with a 
> >> JSF custom component that renders an eclipse BIRT report. I'm using Clay 
> >> HTML 
> >> views in a webapp that among other things needs to render various 
> >> reports. I'm 
> >> not using any JSP, so didn't bother with a JSP tag for this component. 
> >> 
> >> BIRT reports can either be rendered as embedded HTML, or as a PDF. I 
> >> think I 
> >> understand how everything works rendering HTML. My question is with 
> >> rendering a 
> >> report to PDF - the content is no longer HTML and the response content 
> >> type has 
> >> to be application/pdf. So my custom component based on UIComponentBase 
> >> that 
> >> works fine with embeded HTML won't work for PDF. If an attribute on this 
> >> component indicates a PDF rendering is desired, what's a good strategy 
> >> for 
> >> implementing this? One thought that comes to mind is rendering javascript 
> >> back 
> >> in the HTML response, that would pop up a separate window, and have that 
> >> served 
> >> by a separate URL handled outside of Clay/JSF. Are there better 
> >> alternatives 
> >> for handling this? I know very little about custom RenderKits or other 
> >> options, 
> >> and would appreciate it if anyone is interested in pointing me in other 
> >> directions. 
> >> 
> >> Thanks in advance for any tips... 
> > 
> > If you are using full clay views (no-jsp), the clay view handler assumes 
> > the content 
> > type of the response to be "text/html". That's if a content type has not 
> > already been set. 
> > This is one of those todo items. 
> > 
> > Although, I think you could set the response's content 
> > type to "application/pdf" in a view controllers prerender event. Or, 
> > create a JSP page 
> > that sets the content type, has a f:view tag and a single clay component. 
> > 
> > You can change the render kit per view using the f:view tag's 
> > "renderKitId" attribute, 
> > but it applies to the entire page - all components in the view. Clay 
> > allows you to do 
> > this using the "f:view". It just needs to be some place in the page - 
> > unlike the jsp tag 
> > that has to be a root. > > renderKitId="org.acme.mypdfkit"/> 
> > 
> > If you created a html markup renderer for your component and also a PDF 
> > renderer, 
> > you would need to register them in the faces config under different render 
> > kits. 
> > 
> > 
> > org.acme.mypdfkit 
> > 
> > org.acme.mycomponent 
> > org.acme.mycomponent 
> > org.acme.mycomponentPdfRenderer 
> > 
> > 
> > 
> > 
> > 
> > org.acme.mycomponent 
> > org.acme.mycomponent 
> > org.acme.mycomponentRenderer 
> > 
> > 
> > 
> > I've always liked to see the PDF documents embeded in html. If you are 
> > able to embed the 
> > document, you could make a component attribute for documentType (html or 
> > pdf). The renderer 
> > could generate an html embed tag with a src that pointed to a servlet. 
> > The render could save 
> > the document to a map in session scope. The key used to store the 
> > document in the session 
> > map could be added as a query parameter to the src of the embed tag. So, 
> > the servlet only 
> > needs to look for the query parameter and use it as the key into the 
> > document's cache. Next, 
> > push the cached document to the response and set the content type. 
> > 
> > > > src="/contextRoot/embedDoc;jsessionid=xxx?token=123" 
> > type=application/pdf > 
> > 
> > Another approach would be to use the Trinidad internal view handler versus 
> > a servlet. 
> > With the internal view handler, you can map a custom view hander to a view 
> > id. 
> > So, if your view id was "/embedDoc", you could delegate to an internal 
> > view handler 
> > that could create a component tree specifically addressing your needs. 
> > They use this 
> > to complement some of the trinidad components that need popup dialogs. I 
> > have an 
> > example of this in the shale sandbox. 
> > 
> > Properties file to register the mapping between viewId and internal view 
> > handler: 
> > 
> http://svn.apache.org/viewvc/shale/sandbox/shale-clay-trinidad/src/main/resource
>  
> s/META-INF/org.apache.myfaces.trinidad.render.InternalView.properties?view=log
>  
> > 
> > View handler: 
> > 
> http://svn.apache.org/viewvc/shale/sandbox/shale-clay-trinidad/src/main/java/org
>  
> /apache/shale/clay/PageHandler.java?view=log 
> > 
> > Your popup idea would also work nicely with this library. They make it 
> > very 
> > easy to attach script files. Here's an example of sending script to the 
> > browser 
> > (@ "loadHtmlFragment" method): 
> > 
> http://svn.apache.org/viewvc/shale/sandbox/shale-clay-trinidad/src/main/java/org
>  
> /apache/myfaces/trinidad/blank/CatalogBacking.java?view=markup 
> > 
> > Sounds like a fun project. Hope that gives you some ideas. 
> > 
> > Gary 
> 

Reply via email to