package esl.cuenet.source.accessors; import com.hp.hpl.jena.ontology.Individual; import com.hp.hpl.jena.ontology.OntModel; import com.mongodb.BasicDBObject; 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; import java.util.regex.Pattern; public class FacebookUserAccessor extends MongoDB implements IAccessor { private Logger logger = Logger.getLogger(FacebookUserAccessor.class); private Attribute[] attributes = null; private boolean[] setFlags = new boolean[6]; private String name, locationName; private String email; private String workplaceName; private String birthday; private OntModel model = null; public FacebookUserAccessor() { super(AccessorConstants.DBNAME); } public FacebookUserAccessor(OntModel model) { this(); this.model = model; } @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 " + YahooPlaceFinderAPI.class.getName()); } @Override public void associateLocation(Attribute attribute, Location timeInterval) throws AccesorInitializationException { throw new AccesorInitializationException("Incorrect Assignment: No location attributes in " + YahooPlaceFinderAPI.class.getName()); } @Override public void associateLong(Attribute attribute, long value) throws AccesorInitializationException { throw new AccesorInitializationException("Long value being initialized for wrong attribute " + FacebookUserAccessor.class.getName()); } @Override public void associateString(Attribute attribute, String value) throws AccesorInitializationException { if (attribute.compareTo(attributes[1])==0) { /* name */ setFlags[1] = true; this.name = value; } else if (attribute.compareTo(attributes[2])==0) { /* birthday */ setFlags[2] = true; this.birthday = value; } else if (attribute.compareTo(attributes[3])==0) { /* location */ setFlags[3] = true; this.locationName = value; } else if (attribute.compareTo(attributes[4])==0) { /* work */ setFlags[4] = true; this.workplaceName = value; } else if (attribute.compareTo(attributes[5])==0) { /* email */ setFlags[5] = true; this.email = value; } else { throw new AccesorInitializationException("String value being initialized for wrong attribute " + FacebookUserAccessor.class.getName()); } } @Override public void associateDouble(Attribute attribute, double value) throws AccesorInitializationException { throw new AccesorInitializationException("Double value being initialized for wrong attribute " + FacebookUserAccessor.class.getName()); } @Override public IResultSet executeQuery() throws SourceQueryException { DBReader reader = this.startReader("fb_users"); BasicDBObject query = new BasicDBObject(); if (setFlags[1]) query.append("name", name); if (setFlags[2]) { Pattern bdayPattern = Pattern.compile("^" + birthday, Pattern.CASE_INSENSITIVE); query.append("birthday", birthday); } reader.query(query); BasicDBObject result = null; while (reader.hasNext()) { result = (BasicDBObject) reader.next(); BasicDBObject r = new BasicDBObject("name", result.get("name")); r.put("birthday", result.get("birthday")); logger.info(r.toString()); } return convertResults(result); } private IResultSet convertResults(BasicDBObject result) { ResultSetImpl resultSet = new ResultSetImpl("Facebook User Accessor", model); if (result == null) return resultSet; Individual personIndividual = Utils.createPersonFromFacebookRecord(result, model); List<Individual> re = new ArrayList<Individual>(); re.add(personIndividual); resultSet.addResult(re); return resultSet; } public IResultSet executeQuery (String name, String birthday) throws SourceQueryException { if (name != null) { this.name = name; setFlags[1] = true; } if (birthday != null) { this.birthday = birthday; setFlags[2] = true; } return executeQuery(); } }