package org.openrdf.repository.object;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import junit.framework.Test;
import org.openrdf.annotations.Iri;
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.repository.RepositoryResult;
import org.openrdf.repository.object.base.ObjectRepositoryTestCase;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Node;
public class DocumentFragmentTest extends ObjectRepositoryTestCase {
private URI pred;
public static Test suite() throws Exception {
return ObjectRepositoryTestCase.suite(DocumentFragmentTest.class);
}
@Iri("urn:test:Entity")
public interface Entity extends RDFObject {
@Iri("urn:test:xml")
DocumentFragment getXML();
void setXML(DocumentFragment xml);
}
public void setUp() throws Exception {
config.addConcept(Entity.class);
super.setUp();
pred = con.getValueFactory().createURI("urn:test:xml");
}
public void testAddSingleElement() throws Exception {
ObjectFactory of = con.getObjectFactory();
Entity entity = con.addDesignation(of.createObject(), Entity.class);
Document doc = parse("<element/>");
DocumentFragment frag = doc.createDocumentFragment();
frag.appendChild(doc.getDocumentElement());
entity.setXML(frag);
RepositoryResult<Statement> results = con.getStatements(entity.getResource(), pred, null);
String xml = results.next().getObject().stringValue();
results.close();
assertEquals("<element/>", xml);
}
public void testReadSingleElement() throws Exception {
ObjectFactory of = con.getObjectFactory();
Entity entity = con.addDesignation(of.createObject(), Entity.class);
Document doc = parse("<element/>");
DocumentFragment frag = doc.createDocumentFragment();
frag.appendChild(doc.getDocumentElement());
String before = toString(frag);
entity.setXML(frag);
entity = (Entity) con.getObject(entity.getResource());
frag = entity.getXML();
assertEquals(before, toString(frag));
}
public void testAddMultipleElements() throws Exception {
ObjectFactory of = con.getObjectFactory();
Entity entity = con.addDesignation(of.createObject(), Entity.class);
Document doc = parse("<element><first/><second/></element>");
DocumentFragment frag = doc.createDocumentFragment();
frag.appendChild(doc.getDocumentElement().getFirstChild());
frag.appendChild(doc.getDocumentElement().getLastChild());
entity.setXML(frag);
RepositoryResult<Statement> results = con.getStatements(entity.getResource(), pred, null);
String xml = results.next().getObject().stringValue();
results.close();
assertEquals("<first/><second/>", xml);
}
public void testReadMultipleElements() throws Exception {
ObjectFactory of = con.getObjectFactory();
Entity entity = con.addDesignation(of.createObject(), Entity.class);
Document doc = parse("<element><first/><second/></element>");
DocumentFragment frag = doc.createDocumentFragment();
frag.appendChild(doc.getDocumentElement().getFirstChild());
frag.appendChild(doc.getDocumentElement().getLastChild());
String before = toString(frag);
entity.setXML(frag);
entity = (Entity) con.getObject(entity.getResource());
DocumentFragment xml = entity.getXML();
assertEquals(before, toString(xml));
}
public void testAddNamespaceElement() throws Exception {
String xml = "<a:Box xmlns:a=\"http://example.org/a#\" required=\"true\"><a:widget size=\"10\"> </a:widget><a:grommit id=\"23\"> text </a:grommit></a:Box>";
Document doc = parse(xml);
ObjectFactory of = con.getObjectFactory();
Entity entity = con.addDesignation(of.createObject(), Entity.class);
DocumentFragment frag = doc.createDocumentFragment();
frag.appendChild(doc.getDocumentElement());
entity.setXML(frag);
RepositoryResult<Statement> resuts = con.getStatements(entity.getResource(), pred, null);
String label = resuts.next().getObject().stringValue();
resuts.close();
assertEquals(xml, label);
}
public void testReadNamespaceElement() throws Exception {
String xml = "<a:Box xmlns:a=\"http://example.org/a#\" required=\"true\"><a:widget size=\"10\"> </a:widget><a:grommit id=\"23\"> text </a:grommit></a:Box>";
Document doc = parse(xml);
ObjectFactory of = con.getObjectFactory();
Entity entity = con.addDesignation(of.createObject(), Entity.class);
DocumentFragment frag = doc.createDocumentFragment();
frag.appendChild(doc.getDocumentElement());
String before = toString(frag);
entity.setXML(frag);
entity = (Entity) con.getObject(entity.getResource());
frag = entity.getXML();
assertEquals(before, toString(frag));
}
private Document parse(String xml) throws Exception {
TransformerFactory factory = TransformerFactory.newInstance();
DocumentBuilderFactory builder = DocumentBuilderFactory.newInstance();
builder.setNamespaceAware(true);
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Source source = new StreamSource(new StringReader(xml));
Document doc = builder.newDocumentBuilder().newDocument();
DOMResult result = new DOMResult(doc);
factory.newTransformer().transform(source, result);
return doc;
}
private String toString(Node node) throws Exception {
TransformerFactory factory = TransformerFactory.newInstance();
Source source = new DOMSource(node);
StringWriter writer = new StringWriter();
Result result = new StreamResult(writer);
factory.newTransformer().transform(source, result);
return writer.toString();
}
}