package com.renaghan.notes2cloud;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import java.util.TimeZone;
/**
* TODO
*
* @author prenagha
*/
public class CloudSynchronize {
private static final Logger LOG = Logger.getLogger(CloudSynchronize.class);
private final Utils utils = Notes2Cloud.getUtils();
private final Set<Event> deleteFromCloud;
private final Set<Event> addToCloud;
private final SimpleDateFormat utc = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
private final SimpleDateFormat shortFormat = new SimpleDateFormat("yyyyMMdd");
public CloudSynchronize(Set<Event> deleteFromCloud, Set<Event> addToCloud) {
this.deleteFromCloud = deleteFromCloud;
this.addToCloud = addToCloud;
this.utc.setTimeZone(TimeZone.getTimeZone("UTC"));
}
public void go() {
delete();
add();
}
private void delete() {
if (deleteFromCloud.isEmpty())
LOG.info("Nothing to delete from cloud");
String calBaseUrl = utils.getProperty("cloud.baseUrl");
for (Event event : deleteFromCloud) {
try {
String url = calBaseUrl + event.getUrl();
HttpDelete delete = new HttpDelete(url);
HttpClient http = utils.getHttpClient();
HttpResponse response = http.execute(delete);
EntityUtils.consume(response.getEntity());
LOG.info("Cloud Delete: " + response.getStatusLine().getStatusCode() + " " + event);
} catch (Exception e) {
LOG.error("Error deleting event " + event, e);
}
}
}
private void add() {
if (addToCloud.isEmpty())
LOG.info("Nothing to add to cloud");
String calUrl = utils.getProperty("cloud.baseUrl") + utils.getProperty("cloud.calendarUrl");
for (Event event : addToCloud) {
try {
String uid = event.getUID();
String url = calUrl + uid + ".ics";
String req = "BEGIN:VCALENDAR";
req += "\nVERSION:2.0\nPRODID:-//Notes2Cloud//CalDAV Client//EN\n";
req += "CALSCALE:GREGORIAN";
req += "\nBEGIN:VEVENT";
req += "\nUID:" + uid;
req += "\nSUMMARY:" + escape(event.getName());
req += "\nDTSTART" + toString(event, event.getStart());
req += "\nDTEND" + toString(event, event.getEnd());
if (event.getLocation() != null)
req += "\nLOCATION:" + escape(event.getLocation());
if (event.getOwner() != null)
req += "\nDESCRIPTION:" + escape(event.getOwner());
req += "\nEND:VEVENT\nEND:VCALENDAR\n";
HttpPut put = new HttpPut(url);
put.setHeader("Content-Type", "text/calendar");
put.setEntity(new StringEntity(req));
HttpClient http = utils.getHttpClient();
HttpResponse response = http.execute(put);
String output = response.getEntity() == null ? "" : EntityUtils.toString(response.getEntity());
LOG.info("Cloud Add: " + response.getStatusLine().getStatusCode() + " " + event);
if (response.getStatusLine().getStatusCode() < 200 || response.getStatusLine().getStatusCode() > 299) {
LOG.error("A: " + event + "\n" + url + "\n" + req);
LOG.error(response.getStatusLine());
for (Header hdr : response.getAllHeaders()) {
LOG.error(hdr);
}
LOG.error(output);
LOG.error("Error adding event " + event);
}
} catch (Exception e) {
LOG.error("Error adding event " + event, e);
}
}
}
private String toString(Event event, Date dt) {
if (event.isAllDayEvent()) {
return ";VALUE=DATE:" + shortFormat.format(dt);
}
return toString(dt);
}
private String toString(Date dt) {
return ":" + utc.format(dt) + "Z";
}
private String escape(String input) {
return input == null ? null : input.replace(",","\\,").replace(";","\\;");
}
}