1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package org.openrdf.elmo.sesame.converters.impl;
30
31 import java.io.CharArrayReader;
32 import java.io.CharArrayWriter;
33 import java.io.IOException;
34
35 import javax.xml.parsers.DocumentBuilder;
36 import javax.xml.parsers.DocumentBuilderFactory;
37 import javax.xml.parsers.ParserConfigurationException;
38 import javax.xml.transform.Result;
39 import javax.xml.transform.Source;
40 import javax.xml.transform.Transformer;
41 import javax.xml.transform.TransformerException;
42 import javax.xml.transform.TransformerFactory;
43 import javax.xml.transform.dom.DOMSource;
44 import javax.xml.transform.stream.StreamResult;
45
46 import org.openrdf.elmo.exceptions.ElmoConversionException;
47 import org.openrdf.elmo.sesame.converters.Marshall;
48 import org.openrdf.model.Literal;
49 import org.openrdf.model.URI;
50 import org.openrdf.model.ValueFactory;
51 import org.openrdf.model.vocabulary.RDF;
52 import org.w3c.dom.Document;
53 import org.xml.sax.InputSource;
54 import org.xml.sax.SAXException;
55
56 public class XMLDocumentMarshall implements Marshall<Document> {
57 private ValueFactory vf;
58
59 private DocumentBuilder builder;
60
61 private Transformer transformer;
62
63 private URI datatype = RDF.XMLLITERAL;
64
65 public XMLDocumentMarshall(ValueFactory vf) {
66 this.vf = vf;
67 }
68
69 public Class<Document> getJavaClass() {
70 return Document.class;
71 }
72
73 public URI getDatatype() {
74 return datatype;
75 }
76
77 public void setDatatype(URI datatype) {
78 this.datatype = datatype;
79 }
80
81 public Literal serialize(Document object) {
82 Source source = new DOMSource(object);
83 CharArrayWriter writer = new CharArrayWriter();
84 Result result = new StreamResult(writer);
85 try {
86 if (transformer == null) {
87 transformer = TransformerFactory.newInstance().newTransformer();
88 }
89 transformer.transform(source, result);
90 } catch (TransformerException e) {
91 throw new ElmoConversionException(e);
92 }
93 return vf.createLiteral(writer.toString(), datatype);
94 }
95
96 public Document deserialize(Literal literal) {
97 try {
98 char[] charArray = literal.getLabel().toCharArray();
99 CharArrayReader reader = new CharArrayReader(charArray);
100 try {
101 if (builder == null) {
102 builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
103 }
104 return builder.parse(new InputSource(reader));
105 } finally {
106 reader.close();
107 }
108 } catch (SAXException e) {
109 throw new ElmoConversionException(e);
110 } catch (IOException e) {
111 throw new ElmoConversionException(e);
112 } catch (ParserConfigurationException e) {
113 throw new ElmoConversionException(e);
114 }
115 }
116
117 }