package org.deri.grefine.rdf;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.json.JSONException;
import org.json.JSONWriter;
import org.openrdf.model.BNode;
import org.openrdf.model.Resource;
import org.openrdf.model.Statement;
import org.openrdf.model.Value;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import com.google.refine.model.Project;
import com.google.refine.model.Row;
abstract public class ResourceNode implements Node {
private List<Link> links = new ArrayList<Link>();
public List<Link> getLinks() {
return links;
}
private List<RdfType> rdfTypes = new ArrayList<RdfType>();
public void addLink(Link link) {
this.links.add(link);
}
public void addType(RdfType type) {
this.rdfTypes.add(type);
}
public Link getLink(int index) {
return this.links.get(index);
}
public int getLinkCount() {
return this.links.size();
}
public List<RdfType> getTypes() {
return this.rdfTypes;
}
protected abstract void writeNode(JSONWriter writer) throws JSONException;
@Override
public void write(JSONWriter writer, Properties options)throws JSONException{
writer.object();
//writer node
writeNode(writer);
//write types
writer.key("rdfTypes");
writer.array();
for(RdfType type:this.getTypes()){
writer.object();
writer.key("uri");writer.value(type.uri);
writer.key("curie");writer.value(type.curie);
writer.endObject();
}
writer.endArray();
//write links
writer.key("links");
writer.array();
for(int i=0;i<getLinkCount();i++){
Link l = getLink(i);
l.write(writer,options);
}
writer.endArray();
writer.endObject();
}
protected void addTypes(Resource[] rs,ValueFactory factory, RepositoryConnection con, URI baseUri) throws RepositoryException {
for(Resource r:rs){
for(RdfType type:this.getTypes()){
Statement stmt = factory.createStatement(r, RDF.TYPE, factory.createURI(Util.resolveUri(baseUri, type.uri)));
con.add(stmt);
}
}
}
protected Resource[] addLinks(Resource[] rs,URI baseUri,ValueFactory factory,RepositoryConnection con, Project project,Row row,int rowIndex,BNode[] blanks) throws RepositoryException{
for(int i=0;i<getLinkCount();i++){
Link l = getLink(i);
org.openrdf.model.URI p = factory.createURI(Util.resolveUri(baseUri, l.propertyUri));
Value[] os = l.target.createNode(baseUri, factory, con, project, row, rowIndex,blanks);
if(os!=null){
for(Value o:os){
for(Resource r:rs){
con.add(factory.createStatement(r, p, o));
}
}
}
}
return rs;
}
public void setTypes(List<RdfType> types) {
this.rdfTypes = types;
}
public Value[] createNode(URI baseUri,ValueFactory factory,RepositoryConnection con, Project project,Row row,int rowIndex,BNode[] blanks) {
Resource[] r = createResource(baseUri, factory, project, row, rowIndex,blanks);
if(r==null){
return null;
}
try{
addTypes(r, factory,con, baseUri);
return addLinks(r,baseUri,factory,con, project,row,rowIndex,blanks);
}catch(RepositoryException e){
throw new RuntimeException(e);
}
}
public abstract Resource[] createResource(URI baseUri,ValueFactory factory, Project project,Row row,int rowIndex,BNode[] blanks) ;
public static class RdfType{
String uri;
public String getUri() {
return uri;
}
String curie;
public RdfType(String uri,String curie){
this.uri = uri;
this.curie = curie;
}
}
}