Re: DOMWrite an HTMLDocument
Jacob Kjome <[email protected]>
| Newsgroups | gmane.comp.java.enhydra.barracuda.general |
|---|---|
| Message-ID | <[email protected]> |
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
>>>>>>>[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
>>>
>>>
>>>_______________________________________________
>>>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
DOMLoader-vs-XMLCContext.zip
(application/zip, 2.1 KB) - not displayed