package esl.cuenet.algorithms.firstk.personal.accessor; import com.google.common.collect.Lists; import com.mongodb.BasicDBObject; import esl.cuenet.algorithms.firstk.personal.EventContextNetwork; import esl.cuenet.algorithms.firstk.personal.Location; import esl.cuenet.algorithms.firstk.personal.Time; import esl.cuenet.algorithms.firstk.personal.Utils.RFC3339DateFormatter; import esl.cuenet.query.drivers.mongodb.MongoDB; import org.apache.log4j.Logger; import java.io.FileWriter; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; public class Calendar implements Source { private Candidates candidateSet = Candidates.getInstance(); private Logger logger = Logger.getLogger(Calendar.class); private DateFormat dateTimeFormat = new RFC3339DateFormatter(); private DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); private static Source instance = new Calendar(); protected Calendar() { (new CalendarLoader()).load(); } public static Source getInstance() { return instance; } @Override public List<EventContextNetwork> eventsContaining(Candidates.CandidateReference person, Time interval, Location location) { return null; } @Override public List<EventContextNetwork> participants(EventContextNetwork.Event event) { return null; } @Override public List<EventContextNetwork> subevents(EventContextNetwork.Event event) { return null; } @Override public List<Candidates.CandidateReference> knows(Candidates.CandidateReference person) { return null; } @Override public List<EventContextNetwork> knowsAtTime(Candidates.CandidateReference person, Time time) { return null; } @Override public void writeInstances(FileWriter instanceFile) { } private class CalendarObject { Time time; Location location; List<Candidates.CandidateReference> participants = Lists.newArrayList(); BasicDBObject information = new BasicDBObject(); } public class CalendarLoader extends MongoDB { public CalendarLoader() { super(PConstants.DBNAME); } public List<CalendarObject> load() { MongoDB.DBReader reader = startReader("google_calendar"); reader.getAll(new BasicDBObject()); Candidates.CandidateReference userReference = candidateSet.searchLimitOne(Candidates.EMAIL_KEY, PConstants.EMAIL); reader.getAll(new BasicDBObject()); List<CalendarObject> calendarObjs = Lists.newArrayList(); while (reader.hasNext()) { BasicDBObject object = (BasicDBObject) reader.next(); CalendarObject cal = new CalendarObject(); cal.participants.add(userReference); if (object.containsField("status") && object.getString("status").equals("cancelled")) continue; if (object.containsField("summary")) cal.information.put("title", object.getString("summary")); if (object.containsField("type")) cal.information.put("type", object.getString("type")); if (object.containsField("link")) cal.information.put("link", object.getString("link")); if (object.containsField("description")) { String desc = object.getString("description"); for (String d: desc.split("\n")) { Candidates.CandidateReference participant = candidateSet.searchLimitOne(Candidates.NAME_KEY, d); if (participant != null) cal.participants.add(participant); } } long start = -1, end = -1; if (object.containsField("start")) start = getTime(object, "start"); if (object.containsField("end")) end = getTime(object, "end"); if (start == -1 || end == -1) throw new RuntimeException("Did not find dates" + start + " " + end + " " + object); cal.time = Time.createFromInterval(start, end); calendarObjs.add(cal); } logger.info("Loaded " + calendarObjs.size() + " calendar objects."); close(); return calendarObjs; } private long getTime(BasicDBObject object, String label) { BasicDBObject o = (BasicDBObject) object.get(label); Date d; if ( o.containsField("date") ) { try { d = dateFormat.parse(o.getString("date")); return d.getTime(); } catch (ParseException e) { e.printStackTrace(); } } else { try { d = dateTimeFormat.parse(o.getString("dateTime")); return d.getTime(); } catch (Exception e) { e.printStackTrace(); } } return -1; } } }