Skip to content

Commit 4b49f70

Browse files
committed
Created new project: Rendering. See issue #5
1 parent c43bc6b commit 4b49f70

File tree

5 files changed

+403
-0
lines changed

5 files changed

+403
-0
lines changed

rendering/pom.xml

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<parent>
7+
<groupId>basil</groupId>
8+
<artifactId>parent</artifactId>
9+
<version>0.4.0-SNAPSHOT</version>
10+
<relativePath>../parent</relativePath>
11+
</parent>
12+
<artifactId>rendering</artifactId>
13+
<packaging>jar</packaging>
14+
15+
<name>BASIL :: Rendering</name>
16+
17+
<description>Tool for Building web Apis SImpLy on top of sparql endpoints</description>
18+
19+
<dependencies>
20+
<!-- Logging -->
21+
<dependency>
22+
<groupId>org.slf4j</groupId>
23+
<artifactId>slf4j-api</artifactId>
24+
</dependency>
25+
<!-- Binding for Log4J -->
26+
<dependency>
27+
<groupId>org.apache.logging.log4j</groupId>
28+
<artifactId>log4j-slf4j-impl</artifactId>
29+
</dependency>
30+
<!-- Log4j API and Core implementation required for binding -->
31+
<dependency>
32+
<groupId>org.apache.logging.log4j</groupId>
33+
<artifactId>log4j-api</artifactId>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.apache.logging.log4j</groupId>
37+
<artifactId>log4j-core</artifactId>
38+
</dependency>
39+
40+
<!-- Test -->
41+
<dependency>
42+
<groupId>junit</groupId>
43+
<artifactId>junit</artifactId>
44+
<scope>test</scope>
45+
</dependency>
46+
47+
<!-- Dependencies -->
48+
<dependency>
49+
<groupId>commons-io</groupId>
50+
<artifactId>commons-io</artifactId>
51+
</dependency>
52+
<dependency>
53+
<groupId>org.apache.commons</groupId>
54+
<artifactId>commons-collections4</artifactId>
55+
</dependency>
56+
<dependency>
57+
<groupId>com.google.code.gson</groupId>
58+
<artifactId>gson</artifactId>
59+
<version>2.3.1</version>
60+
</dependency>
61+
62+
<dependency>
63+
<groupId>org.apache.jena</groupId>
64+
<artifactId>jena-core</artifactId>
65+
<exclusions>
66+
<exclusion>
67+
<groupId>log4j</groupId>
68+
<artifactId>log4j</artifactId>
69+
</exclusion>
70+
<exclusion>
71+
<groupId>org.slf4j</groupId>
72+
<artifactId>slf4j-log4j12</artifactId>
73+
</exclusion>
74+
</exclusions>
75+
</dependency>
76+
<dependency>
77+
<groupId>org.apache.jena</groupId>
78+
<artifactId>jena-arq</artifactId>
79+
<exclusions>
80+
<exclusion>
81+
<groupId>log4j</groupId>
82+
<artifactId>log4j</artifactId>
83+
</exclusion>
84+
<exclusion>
85+
<groupId>org.slf4j</groupId>
86+
<artifactId>slf4j-log4j12</artifactId>
87+
</exclusion>
88+
</exclusions>
89+
</dependency>
90+
91+
</dependencies>
92+
93+
</project>
94+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package uk.ac.open.kmi.basil.rendering;
2+
3+
import java.io.OutputStream;
4+
import java.util.Iterator;
5+
6+
import org.apache.jena.atlas.iterator.Iter;
7+
import org.apache.jena.atlas.iterator.Transform;
8+
import org.apache.jena.riot.Lang;
9+
import org.apache.jena.riot.RDFFormat;
10+
import org.apache.jena.riot.system.StreamOps;
11+
import org.apache.jena.riot.system.StreamRDF;
12+
import org.apache.jena.riot.system.StreamRDFWriter;
13+
import org.apache.jena.riot.system.StreamRDFWriterFactory;
14+
15+
import com.hp.hpl.jena.graph.Triple;
16+
import com.hp.hpl.jena.query.QuerySolution;
17+
import com.hp.hpl.jena.query.ResultSet;
18+
import com.hp.hpl.jena.util.iterator.WrappedIterator;
19+
20+
public class RDFStreamer {
21+
static {
22+
StreamRDFWriter.register(Lang.RDFXML, RDFFormat.RDFXML);
23+
StreamRDFWriter.register(RDFFormat.RDFXML, new StreamRDFXMLWriterFactory());
24+
}
25+
26+
public static void stream(OutputStream os, ResultSet rs, RDFFormat format, Transform<QuerySolution, Iterator<Triple>> adapter) {
27+
StreamRDF stream = StreamRDFWriter.getWriterStream(os, format);
28+
Iterator<Triple> iter = WrappedIterator.createIteratorIterator(Iter.map(rs, adapter));
29+
stream.start();
30+
StreamOps.sendTriplesToStream(iter, stream);
31+
stream.finish();
32+
}
33+
34+
static class StreamRDFXMLWriterFactory implements StreamRDFWriterFactory{
35+
@Override
36+
public StreamRDF create(OutputStream output, RDFFormat format) {
37+
return new WriterStreamRDFXML(output);
38+
}
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package uk.ac.open.kmi.basil.rendering;
2+
3+
import java.util.ArrayList;
4+
import java.util.Iterator;
5+
import java.util.List;
6+
7+
import org.apache.jena.atlas.iterator.Transform;
8+
9+
import com.hp.hpl.jena.graph.Triple;
10+
import com.hp.hpl.jena.query.QuerySolution;
11+
import com.hp.hpl.jena.rdf.model.Property;
12+
import com.hp.hpl.jena.rdf.model.Resource;
13+
import com.hp.hpl.jena.rdf.model.ResourceFactory;
14+
15+
public class SimpleTripleAdapter implements Transform<QuerySolution,Iterator<Triple>> {
16+
private int rowIndex = 0;
17+
private String instanceNS;
18+
private String instanceNamePrefix;
19+
private String propertyNamePrefix;
20+
public SimpleTripleAdapter(String instanceNS) {
21+
this(instanceNS, "row");
22+
}
23+
24+
public SimpleTripleAdapter(String instanceNS, String instanceNamePrefix) {
25+
this(instanceNS, instanceNamePrefix, "col");
26+
}
27+
28+
public SimpleTripleAdapter(String instanceNS, String instanceNamePrefix, String propertyNamePrefix) {
29+
this.instanceNamePrefix = instanceNamePrefix;
30+
this.instanceNS = instanceNS;
31+
this.propertyNamePrefix = propertyNamePrefix;
32+
}
33+
34+
@Override
35+
public Iterator<Triple> convert(QuerySolution qs) {
36+
rowIndex++;
37+
Resource subject = ResourceFactory.createResource(new StringBuilder().append(instanceNS).append(instanceNamePrefix).append(rowIndex).toString());
38+
Property property;
39+
List<Triple> list = new ArrayList<Triple>();
40+
Iterator<String> cn = qs.varNames();
41+
while (cn.hasNext()) {
42+
String c = cn.next();
43+
property = ResourceFactory.createProperty(new StringBuilder().append(instanceNS).append(propertyNamePrefix).append(c).toString());
44+
list.add(new Triple(subject.asNode(), property.asNode(), qs.get(c).asNode()));
45+
}
46+
return list.iterator();
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package uk.ac.open.kmi.basil.rendering;
2+
3+
import java.io.OutputStream;
4+
import java.util.List;
5+
6+
import org.apache.commons.lang3.tuple.ImmutablePair;
7+
import org.apache.commons.lang3.tuple.Pair;
8+
import org.apache.jena.riot.writer.WriterStreamRDFBlocks;
9+
10+
import com.hp.hpl.jena.graph.Node;
11+
import com.hp.hpl.jena.graph.Triple;
12+
import com.hp.hpl.jena.graph.impl.LiteralLabel;
13+
14+
class WriterStreamRDFXML extends WriterStreamRDFBlocks {
15+
private boolean preamble = true;
16+
public WriterStreamRDFXML(OutputStream os) {
17+
super(os);
18+
}
19+
20+
private Pair<String, String> ns(String uri) {
21+
char c = '#';
22+
if (uri.lastIndexOf(c) == -1) {
23+
c = '/';
24+
}
25+
return new ImmutablePair<String, String>(uri.substring(0, uri.lastIndexOf(c) + 1), uri.substring(uri.lastIndexOf(c) + 1));
26+
}
27+
28+
private void openDescription(String subject){
29+
if(preamble){
30+
openRdf();
31+
preamble = false;
32+
}
33+
// Subject
34+
out.print("\n<rdf:Description rdf:about=\"");
35+
out.print(subject);
36+
out.print("\">");
37+
}
38+
39+
private void closeDescription(){
40+
out.print("\n</rdf:Description>");
41+
}
42+
@Override
43+
protected void finalizeRun() {
44+
closeRdf();
45+
super.finalizeRun();
46+
}
47+
private void openRdf(){
48+
out.print("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">");
49+
}
50+
51+
private void closeRdf(){
52+
out.print("\n</rdf:RDF>");
53+
}
54+
55+
@Override
56+
protected void printBatchTriples(Node s, List<Triple> triples) {
57+
openDescription(s.getURI());
58+
for(Triple triple : triples){
59+
// Property
60+
// XMLNS
61+
out.print("\n\t<p:");
62+
Pair<String, String> pp = ns(triple.getPredicate().getURI());
63+
out.print(pp.getRight());
64+
out.print(" xmlns:p=\"");
65+
out.print(pp.getLeft());
66+
out.print("\"");
67+
// Object
68+
if (triple.getObject().isURI()) {
69+
out.print(' ');
70+
out.print("rdf:resource=\"");
71+
out.print(triple.getObject().getURI());
72+
out.print("\"/>");
73+
} else if (triple.getObject().isBlank()) {
74+
out.print(' ');
75+
out.print("rdf:nodeID=\"");
76+
out.print(triple.getObject().getBlankNodeLabel());
77+
out.print("\"/>");
78+
} else if (triple.getObject().isLiteral()) {
79+
LiteralLabel l = triple.getObject().getLiteral();
80+
if (!l.language().equals("")) {
81+
// Lang
82+
out.print(' ');
83+
out.print("xml:lang=\"");
84+
out.print(l.language());
85+
out.print("\">");
86+
out.print(l.getLexicalForm());
87+
out.print("</");
88+
out.print(pp.getRight());
89+
out.print(">");
90+
} else if (l.getDatatypeURI() != null) {
91+
// Lang
92+
out.print(' ');
93+
out.print("rdf:datatype=\"");
94+
out.print(l.getDatatypeURI());
95+
out.print("\">");
96+
out.print(l.getLexicalForm());
97+
out.print("</p:");
98+
out.print(pp.getRight());
99+
out.print(">");
100+
}else{
101+
out.print(">");
102+
out.print(l.getLexicalForm());
103+
out.print("</");
104+
out.print(pp.getRight());
105+
out.print(">");
106+
}
107+
}
108+
}
109+
closeDescription();
110+
}
111+
112+
// @Override
113+
// protected void reset() {
114+
//
115+
// };
116+
117+
}

0 commit comments

Comments
 (0)