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 }