package esl.cuenet.source.accessors;
import com.hp.hpl.jena.ontology.*;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import esl.cuenet.model.Constants;
import esl.cuenet.query.IResultIterator;
import esl.cuenet.query.IResultSet;
import esl.cuenet.query.ResultIterator;
import esl.cuenet.query.drivers.mongodb.MongoDB;
import esl.cuenet.source.AccesorInitializationException;
import esl.cuenet.source.Attribute;
import esl.cuenet.source.IAccessor;
import esl.cuenet.source.SourceQueryException;
import esl.datastructures.Location;
import esl.datastructures.TimeInterval;
import org.apache.log4j.Logger;
import java.util.ArrayList;
import java.util.List;
public class AcademixRelationAccessor extends MongoDB implements IAccessor {
private Logger logger = Logger.getLogger(FacebookRelationAccessor.class);
private Attribute[] attributes = null;
private boolean[] setFlags = new boolean[1];
private String name;
private OntModel model = null;
private OntClass personClass = null;
private DatatypeProperty nameProperty = null;
public AcademixRelationAccessor() {
super(AccessorConstants.DBNAME);
}
public AcademixRelationAccessor(OntModel model) {
this();
this.model = model;
personClass = model.getOntClass(Constants.CuenetNamespace + "person");
nameProperty = model.getDatatypeProperty(Constants.CuenetNamespace + "name");
}
@Override
public void setAttributeNames(Attribute[] attributes) throws AccesorInitializationException {
this.attributes = attributes;
}
@Override
public void start() {
for (int i=0; i<setFlags.length; i++) setFlags[i] = false;
}
@Override
public void associateTimeInterval(Attribute attribute, TimeInterval timeInterval) throws AccesorInitializationException {
throw new AccesorInitializationException("Incorrect Assignment: No time interval attributes in "
+ AcademixRelationAccessor.class.getName());
}
@Override
public void associateLocation(Attribute attribute, Location timeInterval) throws AccesorInitializationException {
throw new AccesorInitializationException("Incorrect Assignment: No location attributes in "
+ AcademixRelationAccessor.class.getName());
}
@Override
public void associateLong(Attribute attribute, long value) throws AccesorInitializationException {
throw new AccesorInitializationException("Long value being initialized for wrong attribute "
+ AcademixRelationAccessor.class.getName());
}
@Override
public void associateString(Attribute attribute, String value) throws AccesorInitializationException {
if (attribute.compareTo(attributes[0])==0) { /* name */
setFlags[0] = true;
this.name = value;
logger.info("Associated name: " + name);
}
else
throw new AccesorInitializationException("String value being initialized for wrong attribute "
+ AcademixRelationAccessor.class.getName());
}
@Override
public void associateDouble(Attribute attribute, double value) throws AccesorInitializationException {
throw new AccesorInitializationException("Double value being initialized for wrong attribute "
+ AcademixRelationAccessor.class.getName());
}
@Override
public IResultSet executeQuery() throws SourceQueryException {
MongoDB.DBReader reader = this.startReader("academix_relationships");
ResultSetImpl resultSet = new ResultSetImpl("Academix Relation Accessor for : " + name, model);
BasicDBList clauses = new BasicDBList();
if ( !setFlags[0] ) {
logger.info("Empty");
return new ResultSetImpl("Academix Relation Accessor", model);
}
ObjectProperty knowsProperty = model.getObjectProperty(Constants.CuenetNamespace + "knows");
clauses.add(new BasicDBObject("name", name));
clauses.add(new BasicDBObject("relation_name", name));
BasicDBObject query = new BasicDBObject("$or", clauses);
reader.query(query);
Individual inputPersonIndividual = personClass.createIndividual(personClass.getURI() + name.replaceAll(" ", "_"));
inputPersonIndividual.addLiteral(nameProperty, name);
logger.info("Input Name: " + name);
String rname = null;
while (reader.hasNext()) {
BasicDBObject rel = (BasicDBObject) reader.next();
BasicDBObject normalizedRelation;
if ( !rel.getString("name").equals(name) ) {
normalizedRelation = new BasicDBObject();
normalizedRelation.put("name", rel.getString("relation_name"));
normalizedRelation.put("id", rel.getInt("relation"));
normalizedRelation.put("relation_name", rel.getString("name"));
normalizedRelation.put("relation", rel.getInt("id"));
} else {
normalizedRelation = rel;
}
rname = normalizedRelation.getString("relation_name");
Individual friendIndividual = personClass.createIndividual(personClass.getURI() +
rname.replaceAll(" ", "_"));
friendIndividual.addLiteral(nameProperty, rname);
inputPersonIndividual.addProperty(knowsProperty, friendIndividual);
logger.info("Academix Relation Name: " + rname);
List<Individual> result = new ArrayList<Individual>();
result.add(inputPersonIndividual);
result.add(friendIndividual);
resultSet.addResult(result);
}
return resultSet;
}
public IResultSet executeQuery (String name) throws SourceQueryException {
this.name = name;
setFlags[0] = true;
return executeQuery();
}
}