package org.hyperdata.scute.rdf;
import java.io.InputStream;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.util.FileManager;
/**
* output format as described in http://lists.w3.org/Archives/Public/public-linked-json/2011Sep/0035.html
*/
public class ModelToJSON {
private ModelToJSON(Model model) {
}
public static String getJSON(Model model) {
StringBuffer json = new StringBuffer("[");
StmtIterator iterator = model.listStatements();
boolean first = true;
while (iterator.hasNext()) { // neater way of doing this?
if(first){
first = false;
} else {
json.append("\n,");
}
doStatement(json, iterator.nextStatement());
}
return json + "]";
}
private static void doStatement(StringBuffer json, Statement statement) {
json.append("{\n \"s\": ");
doNode(json, statement.getSubject());
json.append(",\n \"p\": ");
doNode(json, statement.getPredicate());
json.append(",\n \"o\": ");
doNode(json, statement.getObject());
json.append("}");
}
private static void doNode(StringBuffer json, RDFNode node) {
// "s": { "type": "uri" , "value": "http://hyperdata.org/seki/Hello" }
json.append("{ \"type\": \"");
doTypeString(json, node);
json.append("\" , \"value\": \"");
doValueString(json, node);
json.append("\" } ");
}
private static void doValueString(StringBuffer json, RDFNode node) {
if (node.isURIResource()) {
json.append(node.asResource().getURI());
return;
}
if (node.isAnon()) {
json.append(node.asResource().getId());
return;
}
if (node.isLiteral()) {
json.append(node.asLiteral().getString());
doLang(json, node.asLiteral());
doDatatype(json, node.asLiteral());
}
}
private static void doTypeString(StringBuffer json, RDFNode node) {
if (node.isURIResource()) {
json.append("uri");
return;
}
if (node.isAnon()) {
json.append("bnode");
return;
}
if (node.isLiteral()) {
json.append("literal");
}
}
private static void doDatatype(StringBuffer json, Literal literal) {
String datatype = literal.getDatatypeURI();
if (datatype != null) {
json.append(", \"datatype\": \"" + datatype + "\"");
}
}
private static void doLang(StringBuffer json, Literal literal) {
String language = literal.getLanguage();
if (!language.equals("")) {
json.append(", \"xml:lang\": \"" + language + "\"");
}
}
public static void main(String args[]) {
Model model = ModelFactory.createDefaultModel();
InputStream in = FileManager.get().open(args[0]);
try {
model.read(in, null);
in.close();
System.out.println(getJSON(model));
} catch (Exception e) {
e.printStackTrace();
}
}
}