/* * Copyright 2012 McEvoy Software Ltd. * */ package io.milton.http.caldav; import io.milton.http.annotated.scheduling.SchedulingOutboxResource; import io.milton.http.annotated.scheduling.SchedulingInboxResource; import io.milton.http.webdav.ResourceTypeHelper; import io.milton.resource.CalendarResource; import io.milton.resource.ICalResource; import io.milton.resource.CollectionResource; import io.milton.resource.Resource; import io.milton.webdav.utils.LockUtils; import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author brad */ public class CalendarResourceTypeHelper implements ResourceTypeHelper { private static final Logger log = LoggerFactory.getLogger(CalendarResourceTypeHelper.class); private final ResourceTypeHelper wrapped; public CalendarResourceTypeHelper(ResourceTypeHelper wrapped) { log.debug("CalendarResourceTypeHelper constructed :" + wrapped.getClass().getSimpleName()); this.wrapped = wrapped; } @Override public List<QName> getResourceTypes(Resource r) { if (log.isTraceEnabled()) { log.trace("getResourceTypes:" + r.getClass().getCanonicalName()); } // Debugging checks.. if (r instanceof ICalResource && r instanceof CollectionResource) { log.warn("ICal Resource is a collection, this might cause issues with some caldav clients"); } if (r instanceof ICalResource && r instanceof CalendarResource) { log.error("EEK!! Resource is both an ical resource (eg an event) and a calendar. Don't implement CalendarResource on events!"); } QName qn; List<QName> list = wrapped.getResourceTypes(r); if (r instanceof CalendarResource) { // http://greenbytes.de/tech/webdav/draft-dusseault-caldav-04.html#new-resources log.trace("getResourceTypes: is a calendar"); qn = new QName(CalDavProtocol.CALDAV_NS, "calendar"); if (list == null) { list = new ArrayList<QName>(); } list.add(qn); } if (r instanceof SchedulingInboxResource) { log.trace("getResourceTypes: is a schedule-inbox"); qn = new QName(CalDavProtocol.CALDAV_NS, "schedule-inbox"); if (list == null) { list = new ArrayList<QName>(); } list.add(qn); } if (r instanceof SchedulingOutboxResource) { log.trace("getResourceTypes: is a schedule-outbox"); qn = new QName(CalDavProtocol.CALDAV_NS, "schedule-outbox"); if (list == null) { list = new ArrayList<QName>(); } list.add(qn); } return list; } /** * * * @param r * @return */ @Override public List<String> getSupportedLevels(Resource r) { log.debug("getSupportedLevels"); List<String> list = wrapped.getSupportedLevels(r); // if (r instanceof CalendarResource) { LockUtils.add(list, "3"); LockUtils.add(list, "calendar-access"); LockUtils.add(list, "calendarserver-principal-property-search"); // if present (but not actually implemented) causes problems with thunderbird LockUtils.add(list, "calendar-schedule"); LockUtils.add(list, "extended-mkcol"); LockUtils.add(list, "extended-mkcol"); LockUtils.add(list, "calendar-proxy"); // } // not sure if should be at this level // thunderbird doesnt poll inbox if we have calendar-auto-schedule LockUtils.add(list, "calendar-auto-schedule"); // if (r instanceof SchedulingInboxResource) { LockUtils.add(list, "schedule-inbox"); // LockUtils.add(list, "calendar-auto-schedule"); // } // if (r instanceof SchedulingOutboxResource) { LockUtils.add(list, "schedule-outbox"); // LockUtils.add(list, "calendar-auto-schedule"); // } return list; } }