package org.openntf.conference.graph;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import org.openntf.domino.Database;
import org.openntf.domino.Session;
import org.openntf.domino.graph2.impl.DGraph;
import org.openntf.domino.junit.TestRunnerUtil;
import org.openntf.domino.utils.Factory;
import org.openntf.domino.utils.Factory.SessionType;
import org.openntf.domino.utils.Strings;
import com.ibm.commons.util.io.json.JsonJavaFactory;
import com.ibm.commons.util.io.json.JsonJavaObject;
import com.ibm.commons.util.io.json.JsonParser;
import com.tinkerpop.frames.FramedTransactionalGraph;
public class EngageDataInitializer implements Runnable {
private long marktime;
private SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public EngageDataInitializer() {
}
@Override
public void run() {
long testStartTime = System.nanoTime();
marktime = System.nanoTime();
try {
timelog("Beginning dataInitializer...");
// Get / create databases
Session s = Factory.getSession(SessionType.NATIVE);
Database attendees = s.getDatabase(s.getServerName(), ConferenceGraph.ATTENDEE_PATH, true);
attendees.getAllDocuments().removeAll(true);
Database events = s.getDatabase(s.getServerName(), ConferenceGraph.EVENT_PATH, true);
events.getAllDocuments().removeAll(true);
Database groups = s.getDatabase(s.getServerName(), ConferenceGraph.GROUP_PATH, true);
groups.getAllDocuments().removeAll(true);
Database invites = s.getDatabase(s.getServerName(), ConferenceGraph.INVITE_PATH, true);
invites.getAllDocuments().removeAll(true);
Database location = s.getDatabase(s.getServerName(), ConferenceGraph.LOCATION_PATH, true);
location.getAllDocuments().removeAll(true);
Database times = s.getDatabase(s.getServerName(), ConferenceGraph.TIMES_PATH, true);
times.getAllDocuments().removeAll(true);
Database defaults = s.getDatabase(s.getServerName(), ConferenceGraph.DEFAULT_PATH, true);
defaults.getAllDocuments().removeAll(true);
// Initialize the graph
ConferenceGraph graph = new ConferenceGraph();
FramedTransactionalGraph<DGraph> framedGraph = graph.getFramedGraph();
loadData(s, framedGraph);
Iterable<Presentation> pres = framedGraph.getVertices(null, null, Presentation.class);
for (Presentation presentation : pres) {
System.out.println(presentation.getTitle());
}
} catch (Throwable t) {
t.printStackTrace();
}
long testEndTime = System.nanoTime();
System.out.println("Completed " + getClass().getSimpleName() + " run in " + ((testEndTime - testStartTime) / 1000000) + " ms");
}
private static String readUrl(final String urlString) throws Exception {
BufferedReader reader = null;
try {
URL url = new URL(urlString);
reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuffer buffer = new StringBuffer();
int read;
char[] chars = new char[1024];
while ((read = reader.read(chars)) != -1)
buffer.append(chars, 0, read);
return buffer.toString();
} finally {
if (reader != null)
reader.close();
}
}
@SuppressWarnings({ "unchecked", "unused" })
public void loadData(final org.openntf.domino.Session s, final FramedTransactionalGraph<DGraph> framedGraph) {
HashMap<String, Location> locs = new HashMap<String, Location>();
HashMap<String, Track> tracks = new HashMap<String, Track>();
HashMap<String, String> trackLkup = new HashMap<String, String>();
trackLkup.put("Special", "Sp");
trackLkup.put("Strategy/Deployment", "Str");
trackLkup.put("Administration", "Adm");
trackLkup.put("Development", "Dev");
trackLkup.put("Business", "Bus");
trackLkup.put("Commercial", "Comm");
try {
String urlData = readUrl("http://xceed.be/engage.nsf/api/data/collections/name/BLUG_ViewSessions?start=0&count=100");
JsonJavaFactory factory = JsonJavaFactory.instanceEx;
ArrayList<JsonJavaObject> jsonData = (ArrayList<JsonJavaObject>) JsonParser.fromJson(factory, urlData);
SimpleDateFormat sdf = new SimpleDateFormat();
for (JsonJavaObject obj : jsonData) {
String locKey = obj.getAsString("session_room");
Location loc = framedGraph.addVertex(locKey, Location.class);
if (Strings.isBlankString(loc.getName())) {
loc.setName(locKey);
}
String trackKey = obj.getAsString("session_track");
Track track = framedGraph.addVertex(trackLkup.get(trackKey), Track.class);
if (Strings.isBlankString(track.getTitle())) {
track.setTitle(trackLkup.get(trackKey));
track.setDescription(trackKey);
}
// DO DATES
String actualDate = obj.getAsString("session_date");
String manipulated = actualDate.substring(0, 10) + " " + actualDate.substring(11, 19);
Date startDate = DATE_FORMAT.parse(manipulated);
String startTime = obj.getAsString("session_time1");
String endTime = obj.getAsString("session_time2");
Calendar startCal = Calendar.getInstance();
startCal.setTime(startDate);
startCal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startTime.substring(0, 2)));
startCal.set(Calendar.MINUTE, Integer.parseInt(startTime.substring(3, 5)));
startCal.set(Calendar.SECOND, 0);
startCal.set(Calendar.MILLISECOND, 0);
Calendar endCal = Calendar.getInstance();
endCal.setTime(startDate);
endCal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(endTime.substring(0, 2)));
endCal.set(Calendar.MINUTE, Integer.parseInt(endTime.substring(3, 5)));
endCal.set(Calendar.SECOND, 0);
endCal.set(Calendar.MILLISECOND, 0);
String tsKey = sdf.format(startCal.getTime()) + " - " + sdf.format(endCal.getTime());
TimeSlot ts = framedGraph.addVertex(tsKey, TimeSlot.class);
ts.setStartTime(startCal);
ts.setEndTime(endCal);
String code = obj.getAsString("session_nr");
Presentation sess = framedGraph.addVertex(code, Presentation.class);
sess.setTitle(obj.getAsString("session_title"));
sess.setDescription(obj.getAsString("session_abstract"));
sess.setStatus(Event.Status.CONFIRMED);
sess.setSessionId(code);
System.out.println("Assigning location - " + locKey + " to session " + obj.getAsString("session_title"));
sess.addLocation(loc);
track.addIncludesSession(sess);
ts.addEvent(sess);
for (int i = 1; i < 6; i++) {
String suffix = "";
if (i > 1) {
suffix = Integer.toString(i);
}
String speaker = obj.getAsString("speaker_name" + suffix);
if ("".equals(speaker)) {
break;
}
String speakerName = speaker;
String organization = obj.getAsString("speaker_org" + suffix);
Attendee att = framedGraph.addVertex(null, Attendee.class);
System.out.println(speaker);
int sep = speakerName.indexOf(" ");
if (sep > -1) {
String firstName = speakerName.substring(0, sep);
String lastName = speakerName.substring(sep + 1, speakerName.length());
att.setFirstName(firstName);
att.setLastName(lastName);
} else {
att.setFirstName(speakerName);
}
att.setTwitterId(obj.getAsString("speaker_twitter" + suffix));
att.setUrl(obj.getAsString("speaker_photourl" + suffix));
if (!"".equals(organization)) {
Group org = framedGraph.addVertex(organization, Group.class);
org.setName(organization);
org.setType(Group.Type.COMPANY);
org.addMember(att);
}
sess.addPresentedBy(att);
sess.addAttendingAttendee(att);
sess.addPlansToAttend(att);
}
}
framedGraph.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(final String[] args) {
TestRunnerUtil.runAsDominoThread(new EngageDataInitializer(), TestRunnerUtil.NATIVE_SESSION);
}
public void timelog(final String message) {
long curtime = System.nanoTime();
long elapsed = curtime - marktime;
marktime = curtime;
System.out.println(elapsed / 1000000 + " ms: " + message);
}
}