package com.renaghan.notes2cloud; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.util.EntityUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.FileWriter; import java.io.StringReader; import java.text.SimpleDateFormat; import java.util.Date; import java.util.LinkedHashSet; import java.util.Set; /** * Download entries from notes calendar * * @author prenagha */ public class NotesCalendarDownload { private static final SimpleDateFormat YYYYMMDD = new SimpleDateFormat("yyyyMMdd"); private final Utils utils = Notes2Cloud.getUtils(); private final Set<Event> events = new LinkedHashSet<Event>(200); private final SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); private final Date minDate; private final Date maxDate; public NotesCalendarDownload(Date minDate, Date maxDate) { this.minDate = minDate; this.maxDate = maxDate; login(); events(); } public Set<Event> getEvents() { return events; } protected void login() { new NotesLogin().login(); } protected void events() { String minDateStr = YYYYMMDD.format(minDate); String calUrl = utils.getProperty("notes.url") + utils.getProperty("notes.calendarUrl") + "&StartKey=" + minDateStr + "T000001,00Z"; try { HttpGet calendar = new HttpGet(calUrl); HttpResponse response = utils.getHttpClient().execute(calendar); String xml = response.getEntity() == null ? "" : EntityUtils.toString(response.getEntity()); if ("true".equals(Notes2Cloud.getUtils().getProperty("debug"))) { FileWriter fw = new FileWriter("notes-calendar-response.xml"); fw.write(xml); fw.close(); } parse(xml); } catch (Exception e) { throw new RuntimeException("Error getting notes calendar " + calUrl, e); } } protected void parse(String xml) { String startTimeFieldName = utils.getProperty("notes.startTimeFieldName"); String endTimeFieldName = utils.getProperty("notes.endTimeFieldName"); String dayTimeFieldName = utils.getProperty("notes.dayTimeFieldName"); String subjectFieldName = utils.getProperty("notes.subjectFieldName"); String excludeWithPrefix = utils.getProperty("excludeWithPrefix"); String excludeContains = utils.getProperty("excludeContains"); String excludeContains2 = utils.getProperty("excludeContains2"); String current = ""; try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(new InputSource(new StringReader(xml))); NodeList viewentries = doc.getElementsByTagName("viewentry"); for (int i = 0; i < viewentries.getLength(); i++) { Element viewentry = (Element) viewentries.item(i); String uniqueId = viewentry.getAttribute("unid"); current = uniqueId; String name = null; Date start = null; Date end = null; Date day = null; String location = null; String owner = null; NodeList entrydatas = viewentry.getElementsByTagName("entrydata"); for (int j = 0; j < entrydatas.getLength(); j++) { Element entrydata = (Element) entrydatas.item(j); String fieldName = entrydata.getAttribute("name"); if (startTimeFieldName.equals(fieldName)) { start = getDateTime(entrydata); } else if (endTimeFieldName.equals(fieldName)) { end = getDateTime(entrydata); } else if (dayTimeFieldName.equals(fieldName)) { day = getDateTime(entrydata); } else if (subjectFieldName.equals(fieldName)) { NodeList textlists = entrydata.getElementsByTagName("textlist"); if (textlists.getLength() >= 1) { NodeList texts = textlists.item(0).getChildNodes(); name = texts.item(0).getTextContent(); if (texts.getLength() >= 2) { String o = texts.item(texts.getLength() - 1).getTextContent(); String parts[] = o.split(" "); if (parts.length == 3) { owner = parts[0] + " " + parts[2]; } else { owner = o; } } if (texts.getLength() >= 3) location = texts.item(1).getTextContent(); } else { name = entrydata.getElementsByTagName("text").item(0).getTextContent(); } } } Date when = start == null ? day : start; if (uniqueId != null && name != null && when != null && !name.startsWith(excludeWithPrefix) && !name.contains(excludeContains) && !name.contains(excludeContains2) && !when.after(maxDate) && !when.before(minDate)) { events.add(new Event(uniqueId, name, location, start, end, day, owner)); } } } catch (Exception e) { throw new RuntimeException("Error parsing notes calendar xml -- " + current, e); } } private Date getDateTime(Element entrydata) throws Exception { Element datetime; NodeList dateTimes = entrydata.getElementsByTagName("datetimelist"); if (dateTimes.getLength() > 0) { datetime = (Element) dateTimes.item(0).getChildNodes().item(0); } else { datetime = (Element) entrydata.getElementsByTagName("datetime").item(0); } return datetime == null ? null : toDate(datetime.getTextContent()); } private Date toDate(String dt) throws Exception { if (dt == null) return null; if (dt.length() < 18) throw new IllegalArgumentException("Notes time too short " + dt); String year, month, day, hour, minute, second, timezone1, timezone2, timezone; year = dt.substring(0, 4); month = dt.substring(4, 6); day = dt.substring(6, 8); hour = dt.substring(9, 11); minute = dt.substring(11, 13); second = dt.substring(13, 15); timezone1 = dt.substring(18, 21); timezone2 = dt.substring(16, 18); timezone = timezone1 + timezone2; String fullDt = year + "-" + month + "-" + day + "T" + hour + ":" + minute + ":" + second + timezone; return parser.parse(fullDt); } }