package org.openntf.conference.graph;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.TimeZone;
import org.openntf.conference.graph.Group.Type;
import org.openntf.domino.Database;
import org.openntf.domino.Document;
import org.openntf.domino.View;
import org.openntf.domino.graph2.impl.DFramedTransactionalGraph;
import org.openntf.domino.graph2.impl.DGraph;
import org.openntf.domino.junit.TestRunnerUtil;
import org.openntf.domino.utils.Strings;
import com.tinkerpop.frames.FramedTransactionalGraph;
@SuppressWarnings("unused")
public class DataDumper implements Runnable {
private long marktime;
private static final String SRC_DATA_PATH = "OpenNTF Downloads/sphere2015.nsf";
public DataDumper() {
}
@Override
public void run() {
long testStartTime = System.nanoTime();
marktime = System.nanoTime();
ConferenceGraph graph = new ConferenceGraph();
DFramedTransactionalGraph<DGraph> framedGraph = graph.getFramedGraph();
DGraph baseGraph = framedGraph.getBaseGraph();
// Iterable<Vertex> vertices = baseGraph.getVertices("@", "Form=\"Presentation\"");
// //NTF There's no specific need to do it this way. I just wanted to test the TypeField-based framing
//
// for (Vertex vertex : vertices) {
// VertexFrame frame = framedGraph.frame(vertex, DVertexFrame.class);
// if (frame instanceof Presentation) {
// StringBuilder sb = new StringBuilder();
// Map<String, Object> jsonMap = framedGraph.toJsonableMap(frame);
// for (String key : jsonMap.keySet()) {
// sb.append(key + ": \"" + String.valueOf(jsonMap.get(key)) + "\", ");
// }
// System.out.println("{" + sb.toString() + "}");
// }
// }
long testEndTime = System.nanoTime();
SimpleDateFormat DATE_FORMAT_UK = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
DATE_FORMAT_UK.setTimeZone(TimeZone.getDefault());
SimpleDateFormat DATE_FORMAT_EST = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
DATE_FORMAT_EST.setTimeZone(TimeZone.getTimeZone("EST"));
Presentation pres = framedGraph.getVertex("ID114", Presentation.class);
Iterable<TimeSlot> times = pres.getTimes();
for (TimeSlot ts : times) {
Calendar sTime = ts.getStartTime();
Calendar eTime = ts.getEndTime();
System.out.println("GMT Time: " + DATE_FORMAT_UK.format(sTime.getTime()) + " - " + DATE_FORMAT_UK.format(eTime.getTime()));
System.out.println("EST Time: " + DATE_FORMAT_EST.format(sTime.getTime()) + " - " + DATE_FORMAT_EST.format(eTime.getTime()));
}
System.out.println("Completed " + getClass().getSimpleName() + " run in " + ((testEndTime - testStartTime) / 1000000) + " ms");
}
@SuppressWarnings({ "deprecation" })
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>();
try {
Database srcDb = s.getDatabase(s.getServerName(), SRC_DATA_PATH);
if (null == srcDb) {
throw new Exception("Source database not found on this Domino server at " + SRC_DATA_PATH);
}
// Create Group vertexes
Group ibm_champion = framedGraph.addVertex("IBM Champions", Group.class);
ibm_champion.setType(Group.Type.PROGRAM);
SimpleDateFormat sdf = new SimpleDateFormat();
View sessions = srcDb.getView("Sessions");
for (Document doc : sessions.getAllDocuments()) {
if (!doc.hasItem("$Conflict")) { // ignore conflicts
String locKey = doc.getItemValueString("Location");
Location loc = framedGraph.addVertex(locKey, Location.class);
if (Strings.isBlankString(loc.getName())) {
loc.setName(doc.getItemValueString("Location"));
}
String trackKey = doc.getItemValueString("Categories");
Track track = framedGraph.addVertex(trackKey, Track.class);
if (Strings.isBlankString(track.getTitle())) {
track.setTitle(doc.getItemValueString("Categories"));
track.setDescription(doc.getItemValueString("Categories"));
}
Date startDate = doc.getItemValue("StartDate", Date.class);
Date startDateTime = doc.getItemValue("StartDateTime", Date.class);
Date endDate = doc.getItemValue("EndDate", Date.class);
Date endDateTime = doc.getItemValue("EndDateTime", Date.class);
Calendar startCal = new GregorianCalendar(TimeZone.getTimeZone("EST"));
startCal.setTime(startDate);
startCal.set(Calendar.HOUR, startDateTime.getHours());
startCal.set(Calendar.MINUTE, startDateTime.getMinutes());
startCal.set(Calendar.SECOND, startDateTime.getSeconds());
Calendar endCal = new GregorianCalendar(TimeZone.getTimeZone("EST"));
endCal.setTime(endDate);
endCal.set(Calendar.HOUR, endDateTime.getHours());
endCal.set(Calendar.MINUTE, endDateTime.getMinutes());
endCal.set(Calendar.SECOND, endDateTime.getSeconds());
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 = doc.getItemValueString("SessionID");
// Not sure if I can combine these, that's for later
Presentation sess = framedGraph.addVertex(code, Presentation.class);
sess.setTitle(doc.getItemValueString("Subject"));
sess.setDescription(doc.getItemValueString("Abstract"));
sess.setStatus(Event.Status.CONFIRMED);
sess.setSessionId(doc.getItemValueString("SessionID"));
sess.setLevel(doc.getItemValueString("Level"));
System.out.println("Assigning location - " + locKey + " to session " + doc.getItemValueString("Subject"));
sess.addLocation(loc);
track.addIncludesSession(sess);
ts.addEvent(sess);
for (int i = 1; i < 6; i++) {
String speaker = doc.getItemValueString("Speaker" + String.valueOf(i));
if ("".equals(speaker)) {
break;
}
String speakerName = speaker;
String organization = "";
if (speaker.contains(" - ")) {
int splitPos = speaker.indexOf(" - ");
speakerName = speaker.substring(0, splitPos);
organization = speaker.substring(splitPos + 3, speaker.length());
}
Attendee att = framedGraph.addVertex(null, Attendee.class);
int sep = speakerName.indexOf(" ");
String firstName = speakerName.substring(0, sep);
String lastName = speakerName.substring(sep + 1, speakerName.length());
att.setFirstName(firstName);
att.setLastName(lastName);
if (!"".equals(organization)) {
Group org = framedGraph.addVertex(organization, Group.class);
org.setName(organization);
org.setType(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 DataDumper(), 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);
}
}