If I might refer you all back to the original question...

I don't want to update the component tree via a remoting call.
I do want to use Clay to render a chunk of HTML from within the remoting
method. I want to do that for consistency; it's how everything else on
the site is rendered.
I do want the remoting method to return a chunk of HTML which the page
then uses by (as Hermod realised) setting "div.innerHTML =
originalRequest.responseText"

It sounds as though Clay won't currently do that. It would be very
useful if it could be persuaded to. 
I have instead coded my remoting call to use Freemarker templates to
generate the HTML. That's a pain in the backside as some of the fields
use converters, which I have to provide in the Freemarker model, and
because it means a second set of HTML that renders in a different
manner, that I need to manage and that the 3rd-party design agency need
to learn to deal with. And that HTML, of course, isn't "plain html" in
the way that Clay pages can be.

Cheers,
Ian.


  

> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
> Sent: 07 December 2006 08:15
> To: [email protected]
> Subject: RE: SV: CLAY: Using clay to import file in remoting method
> 
> Hi
> 
> Ok, that got a load of my shoulders.
> 
> Now, I obvously worded my intentions wrong here. What I am 
> thinking of is the case that when an asynchronous request 
> comes in there should be the possibility for Clay to render 
> the response. I am not suggesting to alter the component tree 
> as per se. I am aware that doing so would be dangerous, 
> particularly in the case where the state is held on the 
> client (Severside we could have full controll over the 
> component tree). 
> 
> Lets assume that I have a table on my page, that I want to 
> update using Ajax. Now there are two possibilities here. The 
> first beeing just returning data that is then handled on the 
> client side using a JSON type DOM altering. The other would 
> be to just set the .innerHtml of the DOM component with a 
> serverside rendered response. It's the latter scenario that I 
> am thinking about and where using Clay to do the rendering.
> 
> Hemrod
> 
> -----Original Message-----
> From: Gary VanMatre [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, December 06, 2006 10:45 PM
> To: [email protected]; [EMAIL PROTECTED]
> Subject: Re: SV: CLAY: Using clay to import file in remoting method
> 
> 
> >From: Hermod Opstvedt <[EMAIL PROTECTED]>
> >
> > Hi
> > 
> > I think we need to give this a good hard thought. What you 
> (if I read 
> > you
> > right) are saying in essence is that Shale/Clay and Ajax 
> will not work. 
> > 
> 
> No, I'm *not* saying that Shale/Clay and Ajax will not work.  
> The testbed in the sandbox is proof that it will work.  There 
> are are a couple of pages that use Trinidad's built in Ajax 
> support and it works really well.  I'm using clay templates 
> with namespaces so they look pretty much like JSP.
> 
> http://svn.apache.org/viewvc/shale/sandbox/shale-clay-trinidad
/src/main/webapp/pages/catalog.html?view=markup
> 
> All you have to do is nest the components you want partial 
> rendering on in a panelPartialRoot component.
> 
> <tr:panelPartialRoot>
>     <tr:commandLink actionListener="[EMAIL PROTECTED]" 
>         partialSubmit="true" text="#{foo.name}"/> 
> </tr:panelPartialRoot>
> 
> These components know how to render the javascript required for PPR.  
> This stuff is really a works of craftsmanship.  I've been 
> told that this is their first generation of components.  The 
> future stuff will blow you away with drag and drop and other 
> sick client side effects.
> 
> However, I don't believe that these components will allow you 
> to dynamically change the structure of a view without 
> recreating it.  They don't have client side code adding 
> widgets that are not already represented by some component in 
> the backing view.  The client is not swapping out chunks of 
> the view tree using Ajax calls and then allowing the entire 
> page to be posted back as a whole.
> 
> 
> > That is a scenario that we can not have - This needs to be 
> addressed, 
> > otherwise we will loose out before we even begin.
> > 
> 
> The scenario that Clay will need some help with is Ajax + dynamic 
> views using Shale's remoting.
> 
> There are multiple scenarios for using remoting.  The Shale 
> remoting is 
> service centric versus component centric.
> 
> 
> > The scenario that I outlined, is something that we need to 
> support in these 
> > web 2.0(3.0?) days because fullpage rendering of dynamic 
> content is not 
> > acceptable anymore - hence the efforts of PPR in for 
> instance in Trinidad 
> > and also other opensource projects. If PPR of Dynamic 
> MyFaces stuff can be 
> > achieved than it should also be doable in Shale/Clay 
> > 
> 
> The challenge here is that this type of PPR is coupled with 
> the components.  It
> would be very difficult to create this type of generic 
> snap-in remoting for 
> components that were not build with this support in mind 
> (the shale commons validator comes to mind).
> 
> Clay is a tool/utility for composing JSF views using 
> something other than JSP.
> It doesn't modify or add behaivor to the components it just 
> snaps them 
> together.
> 
> 
> > So lets put our heads on the block :) 
> > 
> 
> I wouldn't mind doing some work in this area but it would 
> shift the focus 
> of Shale more into component ware.
> 
> 
> > Hermod 
> > 
> 
> Gary
> 
> > 
> > 
> > -----Opprinnelig melding----- 
> > Fra: Gary VanMatre [mailto:[EMAIL PROTECTED] 
> > Sendt: 6. desember 2006 18:54 
> > Til: [email protected] 
> > Emne: RE: CLAY: Using clay to import file in remoting method 
> > 
> > >From: 
> > > 
> > > Hi 
> > > 
> > > I think that this can be very useful in conjunction with 
> PPR. In this way 
> > one 
> > > could define an outcome that was just a Clay component, where the 
> > component was 
> > > not a complete page, but a pagefraction. It would then be 
> very easy to use 
> > Ajax 
> > > to put that into the div's innerhtml because it 
> would(should) be a 
> > complete 
> > > component body. There might be implications regarding 
> state that I don't 
> > see 
> > > though. 
> > > 
> > 
> > This would be really interesting but there are several 
> challenges. I've 
> > been looking at the myfaces Trinidad components. The 
> provide a parital page 
> > rendering strategy that is a different from Shale's remoting. 
> > 
> > Shale's remoting is build for invoking logic in a backing bean and 
> > delivering a XML response. It doesn't try to use the 
> component tree that 
> > rendered the original page. 
> > 
> > The Trinidad component library for PPR uses the component 
> tree and hooks 
> > into the entire lifecycle. A partial page request results 
> in the current 
> > page's component tree getting restored. The PPR is applied 
> to the entire 
> > component tree but the results are filtered. 
> > 
> > This makes a lot of sense. The page can be treated a whole 
> using a browser 
> > submit or individual components within the page. It is 
> important that the 
> > entire page is represented by the component tree. 
> > 
> > However, dynamically changing the tree from an action 
> callback is different 
> > than working with a static tree. You could potentially be 
> removing a 
> > component from the tree that invoked an action that is 
> removing itself. 
> > There are also timming issues when the component tree is 
> saved within the 
> > lifecycle. Normally the view state is saved after 
> rendering. In JSF 1.1 
> > this is done from the ViewTag. Clay invoke the this logic 
> from the view 
> > handler when using full template views. 
> > 
> > Outside of PPR, if we are going to try to change the 
> component tree in the 
> > invoke application phase, we would need to find the clay 
> component, clear 
> > it's children, assign a new jsfid (template). We would need 
> to tell the 
> > state manager to save state on the tree because the next 
> phase would be to 
> > render the response. If we are using a actionListener 
> without an action 
> > outcome, the modifed tree would be rendered. However, if we 
> have an action 
> > outcome that matches a navigation rule, the view will be 
> recreated and our 
> > work is lost since the view will be rebuild for the 
> original template. 
> > 
> > If we are going to try to use Shale's remoting, we would 
> need to some how 
> > restore the view by passing on the viewId in our remoting 
> request, find the 
> > Clay component in the tree, remove the children, set a new 
> jsfid, invoke 
> > rendering using a dummy response writter, save the 
> component tree and return 
> > the rendered markup. This only really addresses rendering. 
> We would also 
> > need to simulate decoding the values delivered from the 
> parital page 
> > request. The renderering can be decoupled from the the tree 
> but decoding 
> > the submitted values needs a UIViewRoot at the top to store 
> queue events. 
> > 
> > I have an experment in the sandbox of using Trinidad PPR 
> with attached 
> > script to add dynamic content. It only handles rendering 
> and wouldn't be 
> > usefull for anything other than devlivering static content. 
> > 
> > Maybe you can use some ideas for here: 
> > 
> http://svn.apache.org/viewvc/shale/sandbox/shale-clay-trinidad
> /src/main/java 
> > /org/apache/myfaces/trinidad/blank/CatalogBacking.java?view=markup 
> > 
> > 
> > 
> > > Hermod 
> > > 
> > 
> > Gary 
> > 
> > > -----Original Message----- 
> > > From: Ian.Priest [mailto:[EMAIL PROTECTED] 
> > > Sent: Tuesday, December 05, 2006 11:22 AM 
> > > To: [email protected] 
> > > Subject: RE: CLAY: Using clay to import file in remoting method 
> > > 
> > > 
> > > 
> > > Responses below... 
> > > 
> > > > -----Original Message----- 
> > > > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
> > > > Sent: 04 December 2006 15:54 
> > > > To: [email protected] 
> > > > Subject: Re: CLAY: Using clay to import file in remoting method 
> > > > 
> > > > >From: "Ian.Priest" 
> > > > > 
> > > > > Hi, 
> > > > > 
> > > > > I've set up a couple of remoting methods, but I don't 
> > > > really want to 
> > > > > code the HTML in my java method. 
> > > > 
> > > > Are you talking about Shale/Ajax style of remoting? 
> > &a mp;g t; 
> > > Yup. 
> > > 
> > > > 
> > > > >What I'd like to do is have the snippet of HTML returned by my 
> > > > >remoting method defined in the same way as the rest of the 
> > > > html on the 
> > > > >site; i.e. in an html file that's loaded by Clay. 
> > > > > 
> > > > 
> > > > Do you want to pull this html content from a place other than 
> > > > the classpath or the web context root? 
> > > 
> > > From within the web-context root. In fact it would live 
> side-by-side 
> > > with the main page. So if I had page main.html and wanted 
> to return 
> > > snippet.html as the response to the remoting call then 
> I'd arrange it as 
> > > 
> > > /somedir/main.html 
> > > /somedir/snippet.html 
> > > 
> > > > Is the html dynamic or static? 
> > > > 
> > > 
> > > The content of snippet.html would be dynamic. In my use 
> case I go and 
> > > get a List of extra info about an item and would want sni 
> ppet. html to 
> > > render a table with a row per List entry. 
> > > 
> > > > 
> > > > > My remoting method fetches a detail list when a table row 
> > > > is clicked, 
> > > > > a little like opening the next level of a tree, so what I'd 
> > > > like to do is: 
> > > > > 
> > > > > 1. User clicks on row x in the table 
> > > > > 2. Remoting method viewController.getDetails() is called 3. 
> > > > > viewController.getDetails() loads details of x as a 
> List and sets a 
> > > > > variable theList 4. viewController.getDetails() creates an 
> > > > instance of 
> > > > > Clay that loads file theDetails.html 5. File 
> > > > theDetails.html renders 
> > > > > as a couple of table rows using 
> > > > > viewController.getTheList() to get table contents 6. 
> > > > > viewController.getDetails() gets the HTML rendered by 
> the Clay load 
> > > > > and writes it out as t he r esponse to the remoting method 
> > > > > 
> > > > 
> > > > Are you trying to render a static document or do you need to 
> > > > collect and store data? 
> > > Not static. I collect then want to display more data. My 
> remoting method 
> > > gets more information then renders a dynamic document to 
> return as the 
> > > response from the remoting method. The dynamic document 
> displays the 
> > > extra info. 
> > > 
> > > > 
> > > > Or, are you looking at the Clay runtime options using the 
> > > > shapeValidator callback and you would like to load html 
> fragments? 
> > > > 
> > > Yes, I'm trying to understand how (or if) I could use class 
> > > org.apache.shale.clay.component.Clay to process a subtree 
> and then grab 
> > > the HTML result of that processing to return as the output of my 
> > > remoting method. 
> > > 
> > > > 
> > > > > Doing the above means the HTML style agency will still be 
> > > &g t; able to edit 
> > > > > the HTML look and feel without me having to edit the Java 
> > > > code for them. 
> > > > 
> > > > What part of the java code are you talking about? 
> > > 
> > > The remoting method. It generates HTML and uses a 
> ResponseWriter to 
> > > output the HTML to the page that made the remoting call. 
> I would like to 
> > > generate that HTML by calling Clay and having it render a 
> sub-tree, but 
> > > I can't see how to do it or even if it can be done. 
> Pseudo-code... 
> > > 
> > > Class MyViewController extends AbstractViewController { 
> > > 
> > > /** 
> > > * Called by AJAX function in page main.html 
> > > * 
> > > * Use Clay to render a dynamic snippet of HTML then return it. 
> > > */ 
> > > public void aRemotingMethod() { 
> > > // Get item id 
> > > String id = 
> > > getFacesContext().getExternalContext().getRequestMap().get("id"); 
> > > 
> > > // Get more detail about item with id 
> > > L ist extraDetails = getExtraDetail(id); 
> > > 
> > > /** This works, but HTML is hard-coded into the 
> > > ViewController... 
> > > String html = " 
> > " 
> > > for( String detail: extraDetails ) { 
> > > html += " " + detail + " 
> > "; 
> > > } 
> > > html += " 
> > "; 
> > > 
> > > // Can I somehow use Clay here to generate HTML? 
> > > // Clay clay = new Clay(); 
> > > // Need to set URL of snippet.html as view id 
> > > // Need to make extraDetail available to the processor. 
> > > Make this class 
> > > // the ViewController for snippet.html? 
> > > // Get clay to process: clay.encodeBegin()? 
> > > // Get HTML back from clay somehow once sub-tree is 
> > > created 
> > > // String html = clay.?????() 
> > > 
> > > // Return HTML 
> > > writer.write(html); 
> > > getFacesContext.responseComplete(); 
> > > 
> > > } 
> > > } 
> > > 
> > > > 
> > > > > I want to avoid reloading the page or sending a full tree 
> > > > view that can 
> > > > > just be unfolded as the page size would then be potentially 
> > > > very large. 
> > > > > 
> > > > > Is this possible? Are there any code examples? 
> > > > > 
> > > > 
> > > > I'm not sure that I understand your use case but it sounds 
> > > > like you want the html content fragments to be managed 
> > > > outside of the web application? 
> > > 
> > > I want the HTML fragment to be managed outside the 
> ViewController class 
> > > code, yes. The third parties can edit snippet.html to alter the 
> > > look-and-feel. 
> > > 
> > > > 
> > > > 
> > > > > Cheers, 
> > > > > Ian. 
> > > > > 
> > > > 
> > > > Gary 
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > 
> > > 
> > > 
> > > 
> > > * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
> * * * * * * * * 
> > * 
> > > 
> > > This email with attachments is solely for the use of the 
> individual or 
> > > entity to whom it is addressed. Please also be aware that 
> the DnB NOR 
> > Group 
> > > cannot accept any payment orders or other legally binding 
> correspondence 
> > with 
> > > customers as a part of an email. 
> > > 
> > > This email message has been virus checked by the anti 
> virus programs used 
> > > in the DnB NOR Group. 
> > > 
> > > * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
> * * * * * * * * 
> > * 
> > > 
> > 
> 
> 

Reply via email to