View Javadoc

1   package org.openprovenance.elmo;
2   import org.w3c.dom.Document;
3   import javax.xml.parsers.DocumentBuilder;
4   import javax.xml.parsers.DocumentBuilderFactory;
5   import javax.xml.transform.Transformer;
6   import javax.xml.transform.TransformerFactory;
7   import javax.xml.transform.Source;
8   import javax.xml.transform.Result;
9   import javax.xml.transform.dom.DOMSource;
10  import org.xml.sax.InputSource;
11  import javax.xml.transform.stream.StreamResult;
12  
13  
14  
15  import java.io.CharArrayWriter;
16  import java.io.CharArrayReader;
17  import org.openrdf.elmo.exceptions.ElmoConversionException;
18  
19  
20  /***
21  XMLLiteral support was dropped because they where being mapped to org.w3c.dom.Document and did not support XML fragments (multiple roots elements).
22  
23  It is now recommended that users create their own XMLLiteral class that can handle XML fragments to what ever extent is desirable.
24  
25  Below is a sample class, which maps rdf:XMLLiteral to the class XmlLiteral, which exposes a read-only w3c document as a property. It can be registered in the ElmoModule or in a configuration file.
26  
27  		module.addLiteral(XmlLiteral.class,
28  				"http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral");
29  
30  
31  See http://www.openrdf.org/forum/mvnforum/viewthread?thread=1738
32  
33  */
34  
35  
36  
37  public class XMLLiteral {
38      private static DocumentBuilder builder;
39  
40      private static Transformer transformer;
41  
42      private String xml;
43  
44      public XMLLiteral(String xml) {
45          this.xml = xml;
46      }
47  
48      public XMLLiteral(Document document) {
49          this.xml = serialize(document);
50      }
51  
52      public Document getDocument() {
53          return deserialize(xml);
54      }
55  
56      @Override
57  		public String toString() {
58          return xml;
59      }
60  
61      private String serialize(Document object) {
62          Source source = new DOMSource(object);
63          CharArrayWriter writer = new CharArrayWriter();
64          Result result = new StreamResult(writer);
65          try {
66              if (transformer == null) {
67                  transformer = TransformerFactory.newInstance()
68                      .newTransformer();
69              }
70              transformer.transform(source, result);
71          } catch (Exception e) {
72              throw new ElmoConversionException(e);
73          }
74          return writer.toString();
75      }
76  
77      private Document deserialize(String xml) {
78          try {
79              char[] charArray = xml.toCharArray();
80              CharArrayReader reader = new CharArrayReader(charArray);
81              try {
82                  if (builder == null) {
83                      DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
84                      dbf.setNamespaceAware(true);
85                      builder = dbf.newDocumentBuilder();
86                  }
87                  return builder.parse(new InputSource(reader));
88              } finally {
89                  reader.close();
90              }
91          } catch (Exception e) {
92              throw new ElmoConversionException(e);
93          }
94      }
95  
96  }