View Javadoc

1   /*
2    * Copyright (c) 2007, James Leigh All rights reserved.
3    * 
4    * Redistribution and use in source and binary forms, with or without
5    * modification, are permitted provided that the following conditions are met:
6    * 
7    * - Redistributions of source code must retain the above copyright notice, this
8    *   list of conditions and the following disclaimer.
9    * - Redistributions in binary form must reproduce the above copyright notice,
10   *   this list of conditions and the following disclaimer in the documentation
11   *   and/or other materials provided with the distribution. 
12   * - Neither the name of the openrdf.org nor the names of its contributors may
13   *   be used to endorse or promote products derived from this software without
14   *   specific prior written permission.
15   * 
16   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26   * POSSIBILITY OF SUCH DAMAGE.
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 }