1 package org.codehaus.xfire.aegis.type.basic;
2
3 import javax.xml.parsers.DocumentBuilder;
4 import javax.xml.parsers.DocumentBuilderFactory;
5 import javax.xml.parsers.ParserConfigurationException;
6 import javax.xml.stream.XMLStreamException;
7 import javax.xml.stream.XMLStreamReader;
8
9 import org.codehaus.xfire.MessageContext;
10 import org.codehaus.xfire.XFireRuntimeException;
11 import org.codehaus.xfire.aegis.MessageReader;
12 import org.codehaus.xfire.aegis.MessageWriter;
13 import org.codehaus.xfire.aegis.stax.ElementReader;
14 import org.codehaus.xfire.aegis.stax.ElementWriter;
15 import org.codehaus.xfire.aegis.type.Type;
16 import org.codehaus.xfire.fault.XFireFault;
17 import org.codehaus.xfire.util.STAXUtils;
18 import org.codehaus.xfire.util.stax.FragmentStreamReader;
19 import org.w3c.dom.Document;
20
21 /***
22 * Reads and writes <code>org.w3c.dom.Document</code> types.
23 *
24 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
25 */
26 public class DocumentType
27 extends Type
28 {
29 private DocumentBuilder builder;
30
31 public DocumentType()
32 {
33 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
34 try
35 {
36 builder = factory.newDocumentBuilder();
37 }
38 catch (ParserConfigurationException e)
39 {
40 throw new XFireRuntimeException("Couldn't load document builder.", e);
41 }
42 }
43
44 public DocumentType(DocumentBuilder builder)
45 {
46 this.builder = builder;
47 }
48
49 public Object readObject(MessageReader mreader, MessageContext context)
50 throws XFireFault
51 {
52 try
53 {
54 XMLStreamReader reader = ((ElementReader) mreader).getXMLStreamReader();
55 return STAXUtils.read(builder, new FragmentStreamReader(reader));
56 }
57 catch (XMLStreamException e)
58 {
59 throw new XFireFault("Could not parse xml.", e, XFireFault.SENDER);
60 }
61 }
62
63 public void writeObject(Object object, MessageWriter writer, MessageContext context)
64 throws XFireFault
65 {
66 Document doc = (Document) object;
67
68 try
69 {
70 STAXUtils.writeElement(doc.getDocumentElement(),
71 ((ElementWriter) writer).getXMLStreamWriter());
72 }
73 catch (XMLStreamException e)
74 {
75 throw new XFireFault("Could not write xml.", e, XFireFault.SENDER);
76 }
77 }
78 }