package com.renaghan.notes2cloud;
import java.io.Serializable;
import java.security.MessageDigest;
import java.util.Calendar;
import java.util.Date;
import java.util.Formatter;
/**
* A calendar event
*
* @author prenagha
*/
public class Event implements Serializable, Comparable<Event> {
private final String uniqueId;
private final String url;
private final String name;
private final String location;
private final String owner;
private final Date start;
private final Date end;
private final boolean allDay;
public Event(String uniqueId, String name, String location, Date start, Date end, Date day, String owner) {
this.url = null;
this.uniqueId = uniqueId;
this.name = name;
this.location = location;
this.owner = owner;
if (end == null) {
Calendar d = Calendar.getInstance();
d.setTime(day);
d.set(Calendar.HOUR_OF_DAY, 0);
d.set(Calendar.MINUTE, 0);
d.set(Calendar.SECOND, 0);
d.set(Calendar.MILLISECOND, 0);
this.start = d.getTime();
d.add(Calendar.DATE, 1);
this.end = d.getTime();
this.allDay = true;
} else {
this.start = start;
this.end = end;
this.allDay = false;
}
}
public Event(String url, String uniqueId, String name, String location, Date start, Date end, boolean allDay) {
this.url = url;
this.uniqueId = uniqueId;
this.name = name;
this.location = location;
this.start = start;
this.end = end;
this.allDay = allDay;
this.owner = null;
}
public String getUrl() {
return url;
}
public String getOwner() {
return owner;
}
public String getUniqueId() {
return uniqueId;
}
public String getName() {
return name;
}
public String getLocation() {
return location;
}
public Date getStart() {
return start;
}
public Date getEnd() {
return end;
}
public boolean isAllDayEvent() {
return allDay;
}
public String getUID() {
String input = getName() + getLocation()
+ String.valueOf(start.getTime()) + String.valueOf(end.getTime())
+ String.valueOf(isAllDayEvent());
try {
byte[] bytesToBeEncrypted = input.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] theDigest = md.digest(bytesToBeEncrypted);
// convert each byte to a hexadecimal digit
Formatter formatter = new Formatter();
for (byte b : theDigest) {
formatter.format("%02x", b);
}
return formatter.toString().toUpperCase();
} catch (Exception e) {
throw new RuntimeException("Unable to get UID hash " + toString(), e);
}
}
@Override
public int compareTo(Event o) {
int cmp = start.compareTo(o.start);
if (cmp != 0) return cmp;
cmp = end.compareTo(o.end);
if (cmp != 0) return cmp;
cmp = name.compareTo(o.name);
if (cmp != 0) return cmp;
return uniqueId.compareTo(o.uniqueId);
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof Event))
return false;
Event event = (Event) o;
if (!end.equals(event.end))
return false;
if (allDay != event.allDay)
return false;
if (location != null ? !location.equals(event.location) : event.location != null)
return false;
if (!name.equals(event.name))
return false;
return start.equals(event.start);
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + (location != null ? location.hashCode() : 0);
result = 31 * result + start.hashCode();
result = 31 * result + end.hashCode();
result = 31 * result + Boolean.valueOf(allDay).hashCode();
return result;
}
/**
* @return string representation of object
* @see Object#toString()
*/
@Override
public String toString() {
final StringBuilder sb = new StringBuilder(200);
sb.append("Event{");
sb.append(name);
sb.append(", ").append(start);
if (!isAllDayEvent()) {
sb.append(" to ").append(end);
}
if (location != null)
sb.append(", @ ").append(location);
sb.append("}");
return sb.toString();
}
}