package org.sakaiproject.calendar.impl;
import org.apache.commons.codec.binary.Base64;
import org.sakaiproject.calendar.api.Calendar;
import org.sakaiproject.calendar.api.CalendarService;
import org.sakaiproject.calendar.api.ExternalSubscription;
import org.sakaiproject.calendar.impl.BaseExternalCalendarSubscriptionService.ExternalCalendarSubscription;
import org.sakaiproject.entity.api.Entity;
public class BaseExternalSubscription implements ExternalSubscription {
private String subscriptionName;
private String subscriptionUrl;
private String context;
private Calendar calendar;
private boolean isInstitutional;
public BaseExternalSubscription() {
}
public BaseExternalSubscription(String subscriptionName,
String subscriptionUrl, String context, Calendar calendar,
boolean isInstitutional) {
setSubscriptionName(subscriptionName);
setSubscriptionUrl(subscriptionUrl);
setCalendar(calendar);
setContext(context);
setInstitutional(isInstitutional);
}
public String getSubscriptionName() {
return subscriptionName;
}
public void setSubscriptionName(String subscriptionName) {
this.subscriptionName = subscriptionName;
}
public String getSubscriptionUrl() {
return subscriptionUrl;
}
public void setSubscriptionUrl(String subscriptionUrl) {
this.subscriptionUrl = subscriptionUrl;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
if (calendar != null)
((ExternalCalendarSubscription) calendar).setContext(context);
}
public String getReference() {
if (calendar != null)
return calendar.getReference();
else
return calendarSubscriptionReference(context,
getIdFromSubscriptionUrl(subscriptionUrl));
}
public Calendar getCalendar() {
return calendar;
}
public void setCalendar(Calendar calendar) {
this.calendar = calendar;
}
public boolean isInstitutional() {
return isInstitutional;
}
public void setInstitutional(boolean isInstitutional) {
this.isInstitutional = isInstitutional;
}
@Override
public boolean equals(Object o) {
if (o instanceof BaseExternalSubscription)
return getReference().equals(
((BaseExternalSubscription) o).getReference());
return false;
}
@Override
public int hashCode() {
int hashCode = super.hashCode();
if (getReference() != null) {
hashCode += getReference().hashCode();
}
;
return hashCode;
}
@Override
public String toString() {
StringBuilder buff = new StringBuilder();
buff.append(getSubscriptionName() != null ? getSubscriptionName() : "");
buff.append('|');
buff.append(getSubscriptionUrl());
buff.append('|');
buff.append(getReference());
return buff.toString();
}
public static String getIdFromSubscriptionUrl(String url)
{
// use Base64
byte[] encoded = Base64.encodeBase64(url.getBytes());
// '/' cannot be used in Reference => use '.' instead (not part of
// Base64 alphabet)
String encStr = new String(encoded).replaceAll("/", "\\.");
return encStr;
}
public static String getSubscriptionUrlFromId(String id) {
// use Base64
byte[] decoded = Base64.decodeBase64(id.replaceAll("\\.", "/")
.getBytes());
return new String(decoded);
}
public static String calendarSubscriptionReference(String context, String id)
{
return CalendarService.REFERENCE_ROOT + Entity.SEPARATOR
+ CalendarService.REF_TYPE_CALENDAR_SUBSCRIPTION + Entity.SEPARATOR
+ context + Entity.SEPARATOR + id;
}
}