/** * This class is an helper for managing events following * the iTIP protocol RFC2446 http://tools.ietf.org/html/rfc2446 * (c) Roberto Polli rpolli@babel.it */ package org.osaf.caldav4j.scheduling.util; import java.io.IOException; import java.net.URISyntaxException; import java.text.ParseException; import java.util.TimeZone; import net.fortuna.ical4j.model.Calendar; import net.fortuna.ical4j.model.Parameter; import net.fortuna.ical4j.model.Property; import net.fortuna.ical4j.model.PropertyList; import net.fortuna.ical4j.model.component.CalendarComponent; import net.fortuna.ical4j.model.component.VTimeZone; import net.fortuna.ical4j.model.parameter.PartStat; import net.fortuna.ical4j.model.property.Attendee; import net.fortuna.ical4j.model.property.Method; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.osaf.caldav4j.exceptions.CalDAV4JException; public class ITipUtils { private static final Log log = LogFactory.getLog(ITipUtils.class); private static java.util.TimeZone J_TZ_GMT = TimeZone.getTimeZone("GMT"); public static Calendar ReplyInvitation(Calendar invite, Attendee mySelf, PartStat replyPartStat ) throws CalDAV4JException { return ManageInvitation( invite, mySelf, Method.REPLY, replyPartStat); } /** * Manage an invitation to a meeting (VCOMPONENT), setting * METHOD:REPLY * ATTENDEE:PARTSTAT... * * @param invite * @return * @throws URISyntaxException * @throws IOException * @throws ParseException * @throws CalDAV4JException */ public static Calendar ManageInvitation(Calendar invite, Attendee mySelf, Method responseMethod, PartStat responsePartStat) throws CalDAV4JException { Calendar reply; try { reply = new Calendar(invite); // if it's not a REQUEST, throw Exception if (reply.getProperty(Property.METHOD) != null ) { if (compareMethod(Method.REQUEST,reply.getMethod()) ) { // if REPLY if (compareMethod(Method.REPLY, responseMethod)) { // use REPLY to event reply.getProperties().remove(Method.REQUEST); reply.getProperties().add(Method.REPLY); processAttendees(reply, mySelf, responsePartStat); } } } return reply; } catch (Exception e) { log.warn("Calendar " + invite + "malformed"); throw new CalDAV4JException("Calendar " + invite + "malformed", new Throwable("Bad calendar REQUEST")); } } // check if Calendar contains the given method, in a faster way (string comparison) private static boolean compareMethod(Method m, Method n) { try { return m.getValue().equals(n.getValue()); } catch (NullPointerException e) { return false; } } // remove attendees, returning number of attendees matching user private static void processAttendees(Calendar c, Attendee user, PartStat action) throws CalDAV4JException { int numAttendees=0; for (Object o : c.getComponents()) { if (! (o instanceof VTimeZone)) { CalendarComponent cc = (CalendarComponent) o; PropertyList attendees = cc.getProperties(Property.ATTENDEE); cc.getProperties().removeAll(attendees); //remove attendees unmatching user while (attendees.size()>numAttendees) { Attendee a = (Attendee) attendees.get(numAttendees); if (! a.getValue().equals(user.getValue())) { attendees.remove(numAttendees); } else { a.getParameters().remove(a.getParameter(Parameter.PARTSTAT)); a.getParameters().add(action); numAttendees++; } } // attendees cc.getProperties().addAll(attendees); } } // for if (numAttendees<1) throw new CalDAV4JException("Attendee " + user + "not invited to event", new Throwable("Missing attendee")); } }