[prev in list] [next in list] [prev in thread] [next in thread] 

List:       barracuda
Subject:    Re: [Barracuda] DOMWrite an HTMLDocument
From:       "Roger C. Soares" <rogersoares () intelinet ! com ! br>
Date:       2003-07-14 6:02:12
[Download RAW message or body]

Hi Jake,

Thanks for the information and code samples. I have to study it better 
to see if it fits my case. You gave me lots of new information! :)

Well, internally, my system works with XML and the W3C Document. HTML is 
just one source of data, and somehow it needs to be imported to an XML 
Document so I can do something with it. In the end I have an XML 
Document, but sometimes it is interesting to format it to HTML to send 
to a browser, that's where I was using the HTMLDocumentFactory. I was 
creating a basic HTML document and importing the nodes from the XML 
Document, so the DOMWriter would use the HTML formatter.

As the createBasicDocument() returns an HTMLDocument I dont't have how 
to set the encoding without getting the DOMImplementation. Also, I can't 
dynamically populate this HTMLDocument and serialize it any more:

HTMLDocument themeDoc = HTMLDocumentFactory.createBasicDocument();
themeDoc.getBody().appendChild(themeDoc.createTextNode("test"));
new DefaultDOMWriter().write(themeDoc, context.getResponse());

I don't really understand well how XMLC works, maybe this 
HTMLDocumentFactory was intended to be an XMLC only class. But as it 
returns an org.w3c.dom.html.HTMLDocument I was expecting it to be valid...

Thanks,
Roger.

--
Jacob Kjome wrote:
> At 12:10 AM 7/14/2003 -0300, you wrote:
> 
> > Hi Jake,
> > 
> > For the transformation I read XML files from the disk and change 
> > dynamically the DOM tree with the parameters from the request.
> > 
> > The JAXP API has a method to load an XML from an InputStream:
> > javax.xml.parsers.DocumentBuilder.parse(InputStream is)
> > doesn't it work for you?
> 
> 
> Sure it does.  I was wondering specifically how you were using XMLC to 
> do this.  Apparently you are not using XMLC to do this, though.
> 
> In the example reduced test case you provided where XMLC was bombing on 
> a NullPointerException, that is actually to be expected.  Here is the 
> explanation from David Li of XMLC fame...
> 
> <quote name="David Li">
> It should throw a null point exception. When you call 
> createBasicDocument(), it creates a XercesLinkedHTMLDocument whose 
> xmlobject is null.
> 
> encoding = ((XMLObjectLink)document).getXMLObject().getEncoding();
> 
> Is calling getEncoding on the null object. There is no reason to call 
> the createBasicDocument and serialize it right away.
> </quote>
> 
> That's why I was wondering how you were creating the document.  It seems 
> you had to be using XMLC to load up your document because it had to be 
> an instance of XMLObjectLink to call getEncoding().  Until I see how you 
> were attempting to load the document via XMLC and getting the 
> NullPointerException, this isn't a bug and it won't be fixed in the 
> XMLC-2.2 final release.  The release will be done very early this week, 
> so get as much info to me now as you can if you want it working the way 
> you think it should work.
> 
> > Now, to the HTML parsing. I don't use XMLC, I call JTidy directly 
> > instead. It is an ugly hack, I remember having some problems when I 
> > wrote this code, but if there is another way to do it that doesn't 
> > involve too many hours to implement I'm willing to update it. Tell me 
> > what you need and I'll research if I can come up with a code you can 
> > use and then I'll just use DOMLoader.
> > 
> > My HTML parser works like this:
> > 1) Read the HTML file from the web
> > 2) Save it to a temp file
> > 3) Parse the temp file with JTidy and store the output in an String
> > 4) Parse this String with Xerces to finally have a DOM tree
> > 
> > I don't remember why I had to create a temp file, I think I can remove 
> > this step because JTidy can read from an InputStream. And I had to get 
> > JTidy's output on a String and parse it again because the DOM tree 
> > generated by JTidy was not compatible with the W3C DOM API... :(
> > 
> > Here is the code:
> > -- 
> > Tidy tidy = new Tidy();
> > FileInputStream in = new FileInputStream(tmpfile);
> > tidy.setMakeClean(false);
> > tidy.setTidyMark(false);        // Don't add Tidy META tag.
> > tidy.setXmlTags(false);
> > tidy.setXmlOut(true);
> > tidy.setRawOut(true);   // avoid mapping values > 127 to entities
> > 
> > ByteArrayOutputStream strWriter = new ByteArrayOutputStream();
> > Document tDoc = tidy.parseDOM(in, strWriter);
> > 
> > String pageStr = strWriter.toString();
> > pageStr = pageStr.substring(pageStr.indexOf("<html"), 
> > pageStr.length()-1);
> > StringReader strReader = new StringReader("<?xml version=\"1.0\" 
> > encoding=\"ISO-8859-1\"?>\n" + htmlDtd + pageStr);
> > 
> > DOMParser domParser = new DOMParser();
> > domParser.parse(new InputSource(strReader));
> > Document doc = domParser.getDocument();
> > -- 
> 
> 
> So, this is what you are doing as a work around to the issue with XMLC 
> that you are having?
> 
> > Humm.. look at that, If DOMLoader can read HTML files I can change all 
> > that by: DOMLoader.load(tmpfile); !!!! Wow! :)
> 
> 
> Yep, but this functionality all depends on the DOMFactory backing the 
> DOMLoader.  The default one for DefaultDOMLoader is the 
> DeferredParsingDOMFactory which, in order to load documents from a file, 
> you need to configure by providing the ServletContext to said factory.  
> This allows it to read context parameters from the web.xml.  Also note 
> that this duplicates the functionality of the XMLCContext from XMLC 
> which would allow you to completely bypass Barracuda's DOMLoader and 
> DOMWriter.  It all depends on what works best for you.  You can see an 
> example of deferred parsing in the XMLC tomcat example.  See the latest 
> CVS for XMLC...
> http://forge.objectweb.org/cvs/?group_id=49
> 
> Note that there are some bug fixes and changes in deferred parsing 
> behavior in the latest XMLC CVS compared to that in Barracuda-1.2.0.  
> Again, XMLC-2.2 will be released this week, so you won't have to wait 
> long for it.  I'm attaching a zip file that has examples of using 
> XMLCContext -vs- using Barracuda's dom loading and writing.  See the 
> web.xml file for examples of the context param configuration I mentioned.
> 
> Note that in addition to the ability to load an hml doc from file, 
> deferred parsing also automatically reloads the file if any change has 
> been made to it.
> 
> Jake
> 
> > Cheers,
> > Roger.
> > 
> > -- 
> > Jacob Kjome wrote:
> > 
> > > Hi Roger,
> > > Ah... that is quite novel
> > > Out of curiosity, can you provide the code snippets you use to load 
> > > the generated XSL transformation using XMLC for both XML and HTML 
> > > documents?  This might be functionality we'd want to add to the 
> > > DOMLoader.  Right now the DOMLoader loads documents from classes and 
> > > either a file from the file system or classpath, but does not yet 
> > > load a stream (if that is, in fact, what you are doing).  Anyway, 
> > > rather than speculate on what you are doing, I'll just wait for you 
> > > to tell me what you are doing....and we'll try to get the bug worked 
> > > out on the XMLC side of things.
> > > thanks,
> > > Jake
> > > At 10:20 AM 7/11/2003 -0300, you wrote:
> > > 
> > > > Hi Jake,
> > > > 
> > > > Thanks a lot for the workaround. Unfortunatly it doesn't work for me 
> > > > because my Document comes from an XSL transformation, so it is not a 
> > > > class. I'm using it to generate a preview:
> > > > http://www.livesidebar.com/servlet/SetTheme.event?themeId=doubleTab
> > > > 
> > > > Fortunatly, it works for XML Documents, so I'm now generating XHTML 
> > > > which is fine for now. Hopefully this bug will be fixed when I need 
> > > > to generate HTML again, so that's fine :)
> > > > 
> > > > Thanks again!
> > > > Cheers,
> > > > Roger.
> > > > 
> > > > -- 
> > > > Jacob Kjome wrote:
> > > > 
> > > > > Hi Roger,
> > > > > Hopefully this bug will get tracked down and fixed in XMLC before 
> > > > > making the XMLC-2.2 release.  In the meantime, you should be able 
> > > > > to load your document successfully using (exception handling not 
> > > > > provided for brevity)...
> > > > > DOMLoader loader = DefaultDOMLoader.getGlobalInstance();
> > > > > Document doc = null;
> > > > > doc = loader.getDOM(MyPageHTML.class);
> > > > > new DefaultDOMWriter().write(doc, resp);
> > > > > Jake
> > > > > At 10:06 AM 7/10/2003 -0300, you wrote:
> > > > > 
> > > > > > Hi Jake,
> > > > > > 
> > > > > > I did test the reduced test case. It produces the exact same 
> > > > > > exception from when I get the HTMLDocument from my business object.
> > > > > > 
> > > > > > Thanx,
> > > > > > Roger.
> > > > > > 
> > > > > > -- 
> > > > > > Jacob Kjome wrote:
> > > > > > 
> > > > > > > Hi Roger,
> > > > > > > See comments below...
> > > > > > > At 11:30 PM 7/9/2003 -0300, you wrote:
> > > > > > > 
> > > > > > > > Hey Barracuda wizards!
> > > > > > > > 
> > > > > > > > I'm updating an application from Barracuda 0.something to 
> > > > > > > > Barracuda 1.2 and I got stuck on this:
> > > > > > > > 
> > > > > > > > -- 
> > > > > > > > java.lang.NullPointerException
> > > > > > > > at 
> > > > > > > > org.enhydra.xml.io.BaseDOMFormatter.getEncoding(BaseDOMFormatter.java:326) \
> > > > > > > >  
> > > > > > > > at 
> > > > > > > > org.enhydra.xml.io.BaseDOMFormatter.(BaseDOMFormatter.java:374)
> > > > > > > > at org.enhydra.xml.io.HTMLFormatter.(HTMLFormatter.java:99)
> > > > > > > > at 
> > > > > > > > org.enhydra.xml.io.DOMFormatter.getFormatter(DOMFormatter.java:156)
> > > > > > > > at 
> > > > > > > > org.enhydra.xml.io.DOMFormatter.write(DOMFormatter.java:192)
> > > > > > > > at 
> > > > > > > > org.enhydra.barracuda.core.util.dom.DefaultDOMWriter.write(DefaultDOMWriter.java:181) \
> > > > > > > >  
> > > > > > > > at 
> > > > > > > > org.enhydra.barracuda.core.util.dom.DefaultDOMWriter.write(DefaultDOMWriter.java:146) \
> > > > > > > >  
> > > > > > > > at 
> > > > > > > > lsb.presentation.screens.WizardScreen$RenderTabPreviewHandler.handleViewEvent(WizardScreen.java:336) \
> > > > > > > >  
> > > > > > > > -- 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > Hmm... curious.  Looks like it has more to do with XMLC than 
> > > > > > > Barracuda, though.  As such, I'm cc'ing the XMLC list.
> > > > > > > 
> > > > > > > > when writing an HTMLDocument with DefaultDOMWriter.
> > > > > > > > 
> > > > > > > > Do you guys have an idea what it could be? The reduced testcase is:
> > > > > > > > 
> > > > > > > > HTMLDocument themeDoc = 
> > > > > > > > org.enhydra.xml.xmlc.html.HTMLDocumentFactory.createBasicDocument(); 
> > > > > > > > 
> > > > > > > > new DefaultDOMWriter().write(themeDoc, context.getResponse());
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > What exactly are you trying to do?  createBasicDocument() will 
> > > > > > > create an empty HTMLDocument.  Why would you want to write that 
> > > > > > > immediately to output?  It still shouldn't fail with a 
> > > > > > > NullPointerException in BaseDOMFormatter, however.  Looks like it 
> > > > > > > bombs on the second line below...
> > > > > > > } else if (document instanceof XMLObjectLink) {
> > > > > > > encoding = 
> > > > > > > ((XMLObjectLink)document).getXMLObject().getEncoding();
> > > > > > > }
> > > > > > > Not sure how that would cause a null pointer exception?  If the 
> > > > > > > document is an instance of XMLObjectLink, then the document is, 
> > > > > > > obviously, not null and that whole line should succeed.  Richard, 
> > > > > > > David, Mark, any ideas here?
> > > > > > > Roger, did you actually test your reduced testcase or are you 
> > > > > > > assuming that it is equivalent to another piece of code that is 
> > > > > > > bombing?  If you haven't tested the reduced testcase, can you 
> > > > > > > post your actual code?  It might make a bit more sense.
> > > > > > > Jake
> > > > > > > 
> > > > > > > > Cheers,
> > > > > > > > Roger.
> > > > > > > > 
> > > > > > > > _______________________________________________
> > > > > > > > Barracuda mailing list
> > > > > > > > Barracuda@barracudamvc.org
> > > > > > > > http://barracudamvc.org/lists/listinfo/barracuda
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > _______________________________________________
> > > > > > > Barracuda mailing list
> > > > > > > Barracuda@barracudamvc.org
> > > > > > > http://barracudamvc.org/lists/listinfo/barracuda
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > _______________________________________________
> > > > > > Barracuda mailing list
> > > > > > Barracuda@barracudamvc.org
> > > > > > http://barracudamvc.org/lists/listinfo/barracuda
> > > > > 
> > > > > 
> > > > > 
> > > > > _______________________________________________
> > > > > Barracuda mailing list
> > > > > Barracuda@barracudamvc.org
> > > > > http://barracudamvc.org/lists/listinfo/barracuda
> > > > 
> > > > 
> > > > 
> > > > _______________________________________________
> > > > Barracuda mailing list
> > > > Barracuda@barracudamvc.org
> > > > http://barracudamvc.org/lists/listinfo/barracuda
> > > 
> > > 
> > > _______________________________________________
> > > Barracuda mailing list
> > > Barracuda@barracudamvc.org
> > > http://barracudamvc.org/lists/listinfo/barracuda
> > 
> > 
> > _______________________________________________
> > Barracuda mailing list
> > Barracuda@barracudamvc.org
> > http://barracudamvc.org/lists/listinfo/barracuda


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic