RE: Using Jivan in a Barracuda App
"Christian Cryder" <[email protected]>
| Newsgroups | gmane.comp.java.enhydra.barracuda.general |
|---|---|
| Message-ID | <[email protected]> |
> <table><tr><td> > BBB > </tr></td></table> Not sure if that was a typo or not, but I see an obvious problem...your </tr></td> are in the wrong order. They should be reversed. Christian ---------------------------------------------- Christian Cryder Internet Architect, ATMReports.com Project Chair, BarracudaMVC - http://barracudamvc.org ---------------------------------------------- "Coffee? I could quit anytime, just not today" > -----Original Message----- > From: [email protected] > [mailto:[email protected]]On Behalf Of David R Robison > Sent: Tuesday, November 25, 2003 7:42 AM > To: [email protected] > Subject: Re: [Barracuda] Using Jivan in a Barracuda App > > > The JivanDOMWriter did NOT fix the problem. I now believe that > the problem might > lie somewhere in the Jivan parser. It appears to be very > sensitive to how the > text file is layed out. For example, the following code renders correctly: > > <table><tr><td> > BBB > </tr></td></table> > > however, if there is line breaks and space between the elements such as... > > <table> > <tr> > <td> > BB > </td> > </tr> > </table> > > then it likes to insert empty <tr></tr> and <td></td> blocks. > > David Robison > > > Quoting Jacob Kjome <[email protected]>: > > > > > David, can you try out Arno's JivanDOMWriter and report on whether that > > > > fixes your issue? We can get this into Barracuda shortly after that. > > > > Jake > > > > At 12:28 PM 11/24/2003 +0100, you wrote: > > >Hi David, Jake, > > > > > >DefaultDOMWriter is really a class from XMLC. As Jake said, it should > > be > > >called XMLCDOMWriter. Using Jivan to create the DOM and XMLC to > > serialize > > >it, may result in strange behaviour, since XMLC is trying to correct > > HTML, > > >while Jivan is not. (Even when outputting, XMLC is calling Tidy for > > pretty > > >printing and change the DOM as Tidy thinks.) > > > > > >Anyway, this might be the source of the bug. So I went ahead and wrote > > a > > >JivanDOMWriter, which should be used to output DOM created with Jivan. > > It > > >also takes advantage of the speed improvement in Jivan serialization, > > > > >which will speed up you the process by serveral times. > > > > > >I haven't done testing on this class, so I would appreciate if you can > > > > >give it a try and let me know if this solves your problem. > > > > > >-Arno > > > > > > > > >Jacob Kjome wrote: > > > > > >>Hi David, > > >>So, when you load up a document with Jivan and modify it directly with > > > > >>Jivan or via the standard DOM interfaces and then render it with > > >>DefaultDOMWriter, it works fine, but when you use BTemplate you get > > the > > >>data you expect along with extraneous empty elements as well? Do I > > have > > >>it straight so far? That's certainly odd. I can't say that I've > > >>experimented much with Jivan and BTemplate. Just with standard DOM > > >>modifications. > > >>Christian, any idea? Arno, any thoughts here? > > >> > > >>Jake > > >>At 03:05 PM 11/22/2003 -0500, you wrote: > > >> > > >>>If I load a document with Jivan and then render it with > > DefaultDOMWriter > > >>>everything works fine. However, If I use the page to create a > > BTemplate > > >>>component to customize it using a TemplateModel, then the page does > > not > > >>>render > > >>>correctly, especially when rendering tables. I end up getting a blank > > > > >>><TD></TD> > > >>>between each cell in the table and a blank <TR></TR> between each > > row. > > >>> > > >>>Can a document loaded with Jivan be used in a BTemplate component? Am > > I > > >>>doing > > >>>something wrong? Any ideas? > > >>> > > >>>Thanks in advance, > > >>>David Robison > > >>> > > >>>Quoting David R Robison <[email protected]>: > > >>> > > >>> > Thanks for the info... > > >>> > The problem I'm now having is in modifying the loaded HTML file. > > Here is > > >>> > my code: > > >>> > > > >>> > class RenderSitePageHandler extends DefaultBaseEventListener > > { > > >>> > public void handleViewEvent(ViewEventContext > > context) > > >>> throws > > >>> > EventException, > > >>> > ServletException, IOException { > > >>> > HttpServletRequest req = > > context.getRequest(); > > >>> > > > >>> > //get the XMLC object > > >>> > Document page = > > >>> > > > >>> > > > DefaultDOMLoader.getGlobalInstance().getDOM("/WEB-INF/jivan/SitePa > ge.html"); > > >>> > DocumentFactory docFactory = > > >>> DocumentFactory.getInstance(); > > >>> > docFactory.docManFor(page).repair(page); > > >>> > > > >>> > //create a template component and render > > it > > >>> > Node node = > > page.getElementById("SiteForm"); > > >>> > BTemplate templateComp = new BTemplate(new > > > > >>> SiteModel(context)); > > >>> > templateComp.setView(new > > >>> DefaultTemplateView(node)); > > >>> > try {templateComp.render(new > > >>> DefaultViewContext(context));} > > >>> > catch (RenderException re) > > {logger.warn("Render > > >>> err:"+re);} > > >>> > > > >>> > //now actually render the page > > >>> > new DefaultDOMWriter().write(page, > > >>> context.getResponse()); > > >>> > } > > >>> > } > > >>> > > > >>> > If I comment out the section where I create a template componet > > then the > > >>> > page > > >>> > renders fine. If not, then, when I write out the DOM, I get an > > empty > > >>> > <td></td> > > >>> > between each cell in my table and an empty <tr></tr> between each > > row. > > >>> > I'm not > > >>> > adding new rows to the table, just populating a form that uses > > tables. > > >>> > > > >>> > Any idea? Am I missing something? > > >>> > > > >>> > Thanks in advance, > > >>> > David > > >>> > > > >>> > Quoting Jacob Kjome <[email protected]>: > > >>> > > > >>> > > DefaultDOMWriter uses XMLC to format the DOM. You can create > > your > > >>> > own > > >>> > > > > >>> > > DOMWriter if you want. This is actually why I wanted to > > rename > > >>> > > DefaultDOMWriter to XMLCDOMWriter. Calling is "Default" hides > > its > > >>> > > implementation too much, and the whole point to switch out > > >>> > > implementations > > >>> > > at will anyway, not use a single default one. The DOMLoader is > > the > > >>> > more > > >>> > > > > >>> > > generic of the 3 interfaces. Anyway, knowing that, you can > > create > > >>> > your > > >>> > > own > > >>> > > DOMWriter implementation that doesn't use XMLC's DOM formatter. > > Oh, > > >>> > and > > >>> > > I > > >>> > > forgot, there still is a dependency on XMLC via the > > >>> > > XMLCDeferredParsingDOMFactory instance created by default in > > the > > >>> > > DefaultDOMLoader. Hmm.... Those should really be separated > > more. > > >>> > > Maybe > > >>> > > we should add another getGlobalInstance() that takes a > > DOMFactory as > > >>> > a > > >>> > > > > >>> > > parameter and have the default dom factory loaded up via > > reflection. > > >>> > > > >>> > > That > > >>> > > way, DefaultDOMLoader would be much more generic. Anyway... > > >>> > > > > >>> > > > > >>> > > Here are some ways to use the JivanDOMFactory.... > > >>> > > > > >>> > > First do... > > >>> > > DefaultDOMLoader loader = > > DefaultDOMLoader.getGlobalInstance(); > > >>> > > > > >>> > > Then, either use the object repository assember as shown by > > Thelmo > > >>> > below > > >>> > > > > >>> > > (except change XMLCDeferredParsingDOMFactory to JivanDOMFactory) > > or > > >>> > use > > >>> > > the > > >>> > > following... > > >>> > > > > >>> > > > > >>> > > JivanDOMFactory jfactory = new JivanDOMFactory(); > > >>> > > jfactory.setServletContext(getServletContext()); > > >>> > > loader.setDefaultDOMFactory(jfactory); > > >>> > > > > >>> > > //note that you can also choose to set the default dom factory > > to > > >>> > > something > > >>> > > else and use Jivan for a specific fully qualified class name > > (String) > > >>> > or > > >>> > > > > >>> > > file path such as.... > > >>> > > String docPath = "/WEB-INF/mydocs/myfile.html"; > > >>> > > loader.registerDOMFactory(jfactory, docPath); > > >>> > > > > >>> > > > > >>> > > Then do.... > > >>> > > > > >>> > > Document doc = loader.getDOM(docPath); > > >>> > > > > >>> > > > > >>> > > Of course, you can skip the DOMLoader as you did before, but at > > that > > >>> > > point, > > >>> > > you might as well just load things as described here... > > >>> > > http://www.jivan.org/parser/samples.html > > >>> > > > > >>> > > You can also look at how JivanDOMFactory is implemented to for > > an > > >>> > > example > > >>> > > of how to use it directly. > > >>> > > > > >>> > > Hope that clears things up a bit. > > >>> > > > > >>> > > Jake > > >>> > > > > >>> > > At 01:18 PM 11/18/2003 -0500, you wrote: > > >>> > > >Thanks, when I try this without the xmlc.jar file, it > > complains > > >>> > that > > >>> > > the > > >>> > > >class > > >>> > > > > > >>> > > >org/enhydra/xml/io/DOMFormatter > > >>> > > > > > >>> > > >is not found. Is the xmlc.jar files still required? > > >>> > > > > > >>> > > >david > > >>> > > > > > >>> > > >Thelmo Loisio wrote: > > >>> > > >> > > >>> > > >>On Tue, 2003-11-18 at 17:19, David R Robison wrote: > > >>> > > >> > > >>> > > >>> > > >>> > > >>>Do you have an example of what to set in the > > object-repository to > > >>> > use > > >>> > > jivan? > > >>> > > >>>David > > >>> > > >>> > > >>> > > >> > > >>> > > >> > > >>> > > >> >From the contrib package here it is snippet from > > >>> > > >>object-repository.xml... > > >>> > > >> > > >>> > > >><object name="$df" > > >>> > > > > >>> > > > >>class="org.enhydra.barracuda.core.util.dom.XMLCDeferredParsingDOMFac > > > > >>> to ry"> > > >>> > > >> <!-- set the servlet context so that the dom factory > > can > > >>> > > read > > >>> > > >>web.xml context params --> > > >>> > > >> <method name="setServletContext" arg="$sc"/> > > >>> > > >> </object> > > >>> > > >> > > >>> > > >> <object > > >>> > > class="org.enhydra.barracuda.core.util.dom.DefaultDOMLoader"> > > >>> > > >> <method name="getGlobalInstance" return="$dl"/> > > >>> > > >> </object> > > >>> > > >> > > >>> > > >>... and from java within an handleViewEvent method... > > >>> > > >> > > >>> > > >>Document page = > > >>> > > >>DefaultDOMLoader.getGlobalInstance().getDOM(WaitHTML.class, > > >>> > > >>context.getViewCapabilities().getClientLocale()); > > >>> > > >> > > >>> > > >> > > >>> > > >> > > >>> > > > > > >>> > > > > > >>> > > >-- > > >>> > > > > > >>> > > >David R Robison > > >>> > > >Open Roads Consulting, Inc. > > >>> > > >708 S. Battlefield Blvd., Chesapeake, VA 23322 > > >>> > > >phone: (757) 546-3401 > > >>> > > >e-mail: > > >>> > > > > >>> > > > ><mailto:[email protected]>drrobison@openroadsconsulti > > > > >>> ng .com > > >>> > > >web: > > <http://openroadsconsulting.com>http://openroadsconsulting.com > > >>> > > > > >>> > > _______________________________________________ > > >>> > > Barracuda mailing list > > >>> > > [email protected] > > >>> > > http://barracudamvc.org/lists/listinfo/barracuda > > >>> > > > > >>> > _______________________________________________ > > >>> > Barracuda mailing list > > >>> > [email protected] > > >>> > http://barracudamvc.org/lists/listinfo/barracuda > > >>> > > > >>>_______________________________________________ > > >>>Barracuda mailing list > > >>>[email protected] > > >>>http://barracudamvc.org/lists/listinfo/barracuda > > >> > > >>_______________________________________________ > > >>Barracuda mailing list > > >>[email protected] > > >>http://barracudamvc.org/lists/listinfo/barracuda > > > > > > > > >package org.enhydra.barracuda.core.util.dom; > > > > > >import java.io.IOException; > > >import java.io.OutputStream; > > >import java.io.PrintWriter; > > >import java.io.Writer; > > > > > >import javax.servlet.http.HttpServletResponse; > > > > > >import org.apache.log4j.Logger; > > >import org.jivan.html.document.DocumentFactory; > > >import org.jivan.html.document.DocumentManager; > > >import org.w3c.dom.Element; > > >import org.w3c.dom.Node; > > >import org.w3c.dom.html.HTMLDocument; > > > > > >/** This class is a specialized DOMWriter for Jivan. It calls the Jivan > > > > >serializers > > > * for output to a Outputstream or java.io.Writer. > > > * > > > * The root node of the tree to be outputted must be either a Document > > or > > > Element. > > > * This means DocumentFragments are not supported. (other node types > > don't > > > * really make sense here) > > > * > > > * After printout, the subtree is being repaired and ready to be used > > again. > > > * @author Arno, [email protected] > > > */ > > >public class JivanDOMWriter implements DOMWriter { > > > > > > protected static final Logger logger = > > > Logger.getLogger(JivanDOMWriter.class.getName()); > > > > > > // prevent the HTML pages from being cached by the browser > > > protected boolean preventCaching = false; > > > // how long can the page be cached by browser > > > protected int maxAge = 0; //csc_061202.1 - added > > > > > > /** > > > * Createing a DOMWriter for outputting a DOM created by > > Jivan > > > */ > > > public JivanDOMWriter() { > > > super(); > > > } > > > > > > /* (non-Javadoc) > > > * @see > > > org.enhydra.barracuda.core.util.dom.DOMWriter#write(org.w3c.dom.Node, > > > > > java.io.OutputStream) > > > */ > > > public void write(Node node, OutputStream out) throws > > IOException { > > > if (node.getNodeType()==Node.DOCUMENT_NODE) { > > > > > >DocumentFactory.getInstance().docManFor(node).serialize(out); > > > } else { > > > write(node, new PrintWriter(out)); > > > } > > > } > > > > > > /** > > > * output of the Document of this node using a writer for the > > output. > > > * After serialization, the Document is being repaired. > > > */ > > > public void write(Node node, Writer writer) throws IOException > > { > > > switch(node.getNodeType()) { > > > case Node.DOCUMENT_NODE: > > > > > >DocumentFactory.getInstance().docManFor(node).serialize(writer); > > > break; > > > case Node.ELEMENT_NODE: > > > DocumentManager man = > > > DocumentFactory.getInstance().docManFor(node); > > > > > writer.write(man.serialize((Element)node, > > > true)); > > > default: > > > throw new > > IllegalArgumentException("Only > > > Elements and Dcument can be serialized, not "+node); > > > } > > > } > > > > > > /** > > > * Write a DOM to a ServletResponse object. This method will > > > * automatically set the content type for you. > > > * This method is copied from DefaultDOMWriter. It should > > really be > > > * abstracted from a common base class. > > > * > > > * @param node a DOM node, which belongs to the Document to be > > > > > written out > > > * @param resp the HttpServletResponse object > > > */ > > > public void write(Node node, HttpServletResponse resp) throws > > > > > IOException { > > > //set the response type (TODO:need to support WML as > > well) > > > String responseType = "text/xml"; > > > if (node instanceof HTMLDocument) responseType = > > "text/html"; > > > if (logger.isDebugEnabled()) logger.debug("Setting the > > > > > response type:"+responseType); > > > resp.setContentType(responseType); > > > > > > //if we need to prevent caching > > > if (preventCaching) { > > > //add the appropriate headers to the > > response > > > if (logger.isDebugEnabled()) > > > logger.debug("updating resp hdr to prevent caching"); > > > resp.setHeader("Pragma","no-cache"); > > > resp.setHeader("Cache-Control","no-cache"); > > > resp.setDateHeader("Expires", > > > System.currentTimeMillis()); > > > > > > //csc_061202.1 - added > > > //otherwise explicitly give it a max-age (this will > > > generally allow browsers like > > > //IE to page back in history without reloading, but if > > > > > the user actually revisits the > > > //URL, then it will still be reloaded) > > > } else { > > > > > resp.setHeader("Cache-Control","max-age="+maxAge); > > > resp.setDateHeader("Last-Modified", > > > System.currentTimeMillis()); > > > } > > > > > > //write the dom > > > write(node, resp.getWriter()); > > > } > > > > > > /** > > > * @return Returns the maxAge. > > > */ > > > public int getMaxAge() { > > > return maxAge; > > > } > > > > > > /** > > > * @param maxAge The maxAge to set. > > > */ > > > public void setMaxAge(int maxAge) { > > > this.maxAge = maxAge; > > > } > > > > > > /** > > > * @return Returns the preventCaching. > > > */ > > > public boolean isPreventCaching() { > > > return preventCaching; > > > } > > > > > > /** > > > * @param preventCaching The preventCaching to set. > > > */ > > > public void setPreventCaching(boolean preventCaching) { > > > this.preventCaching = preventCaching; > > > } > > > > > >} > > > > _______________________________________________ > > Barracuda mailing list > > [email protected] > > http://barracudamvc.org/lists/listinfo/barracuda > > > _______________________________________________ > Barracuda mailing list > [email protected] > http://barracudamvc.org/lists/listinfo/barracuda