Exemple #1
1
  public static Calendar createCalendar(CalDavEvent calDavEvent, DateTimeZone timeZone) {
    TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
    TimeZone timezone = registry.getTimeZone(timeZone.getID());

    Calendar calendar = new Calendar();
    calendar.getProperties().add(Version.VERSION_2_0);
    calendar.getProperties().add(new ProdId("openHAB"));
    VEvent vEvent = new VEvent();
    vEvent.getProperties().add(new Summary(calDavEvent.getName()));
    vEvent.getProperties().add(new Description(calDavEvent.getContent()));
    final DtStart dtStart =
        new DtStart(new net.fortuna.ical4j.model.DateTime(calDavEvent.getStart().toDate()));
    dtStart.setTimeZone(timezone);
    vEvent.getProperties().add(dtStart);
    final DtEnd dtEnd =
        new DtEnd(new net.fortuna.ical4j.model.DateTime(calDavEvent.getEnd().toDate()));
    dtEnd.setTimeZone(timezone);
    vEvent.getProperties().add(dtEnd);
    vEvent.getProperties().add(new Uid(calDavEvent.getId()));
    vEvent.getProperties().add(Clazz.PUBLIC);
    vEvent
        .getProperties()
        .add(
            new LastModified(
                new net.fortuna.ical4j.model.DateTime(calDavEvent.getLastChanged().toDate())));
    calendar.getComponents().add(vEvent);

    return calendar;
  }
Exemple #2
0
  /**
   * main method to interact with {@link AvailableApplicationTool}.
   *
   * @param args
   * @throws SchedulingException
   * @throws NotAVisitorException
   * @throws CalendarAccountNotFoundException
   */
  public static void main(String[] args)
      throws CalendarAccountNotFoundException, NotAVisitorException, SchedulingException {
    // scan the arguments
    if (args.length == 0) {
      System.err.println(
          "Usage: AppointmentTool create [-owner username] [-visitor username] [-start YYYYmmdd-hhmm] [-duration minutes]");
      System.exit(1);
    }

    if (CREATE.equals(args[0])) {
      String visitorUsername = null;
      String ownerUsername = null;
      Date startTime = null;
      int duration = 30;

      for (int i = 1; i < args.length; i++) {
        if (OWNER_ARG.equalsIgnoreCase(args[i])) {
          ownerUsername = args[++i];
        } else if (VISITOR_ARG.equalsIgnoreCase(args[i])) {
          visitorUsername = args[++i];
        } else if (START_ARG.equalsIgnoreCase(args[i])) {
          String start = args[++i];
          SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT);
          try {
            startTime = df.parse(start);
          } catch (ParseException e) {
            System.err.println("Invalid format for start parameter, must match: " + DATE_FORMAT);
            System.exit(1);
          }
        } else if (DURATION_ARG.equalsIgnoreCase(args[i])) {
          String dur = args[++i];
          duration = Integer.parseInt(dur);
        }
      }

      Validate.notEmpty(ownerUsername, "owner argument cannot be empty");
      Validate.notEmpty(visitorUsername, "visitor argument cannot be empty");
      Validate.notNull(startTime, "start argument cannot be empty");

      ApplicationContext applicationContext = new ClassPathXmlApplicationContext(CONFIG);

      AppointmentTool tool =
          new AppointmentTool(
              (SchedulingAssistantService) applicationContext.getBean("schedulingAssistantService"),
              (ICalendarAccountDao) applicationContext.getBean("calendarAccountDao"),
              (OwnerDao) applicationContext.getBean("ownerDao"),
              (VisitorDao) applicationContext.getBean("visitorDao"),
              (AvailableScheduleDao) applicationContext.getBean("availableScheduleDao"));

      Date endDate = DateUtils.addMinutes(startTime, duration);
      VEvent event =
          tool.createAvailableAppointment(visitorUsername, ownerUsername, startTime, endDate);
      System.out.println("Event successfully created: ");
      System.out.println(event.toString());
    } else {
      System.err.println("Unrecognized command: " + args[0]);
      System.exit(1);
    }
  }
  public boolean isValid(Object value) {

    Calendar calendar = null;
    try {
      calendar = (Calendar) value;

      // validate entire icalendar object
      calendar.validate(true);

      // additional check to prevent bad .ics
      CalendarUtils.parseCalendar(calendar.toString());

      // make sure we have a VEVENT with a recurrenceid
      ComponentList comps = calendar.getComponents();
      if (comps == null) {
        log.warn("error validating event exception: " + calendar.toString());
        return false;
      }

      comps = comps.getComponents(Component.VEVENT);
      if (comps == null || comps.size() == 0) {
        log.warn("error validating event exception: " + calendar.toString());
        return false;
      }

      VEvent event = (VEvent) comps.get(0);
      if (event == null) {
        log.warn("error validating event exception: " + calendar.toString());
        return false;
      }

      RecurrenceId recurrenceId = event.getRecurrenceId();

      if (recurrenceId == null
          || recurrenceId.getValue() == null
          || "".equals(recurrenceId.getValue())) {
        log.warn("error validating event exception: " + calendar.toString());
        return false;
      }

      return true;
    } catch (ValidationException ve) {
      log.warn("event validation error", ve);
      if (calendar != null) {
        log.warn("error validating event: " + calendar.toString());
      }
      return false;
    } catch (RuntimeException e) {
      return false;
    } catch (IOException e) {
      return false;
    } catch (ParserException e) {
      log.warn("parse error", e);
      if (calendar != null) {
        log.warn("error parsing event: " + calendar.toString());
      }
      return false;
    }
  }
Exemple #4
0
  @Override
  @SuppressWarnings("unchecked")
  public ByteArrayOutputStream toEntity() throws IOException {
    net.fortuna.ical4j.model.Calendar ical = new net.fortuna.ical4j.model.Calendar();
    ical.getProperties().add(Version.VERSION_2_0);
    ical.getProperties()
        .add(new ProdId("-//bitfire web engineering//DAVdroid " + Constants.APP_VERSION + "//EN"));

    VEvent event = new VEvent();
    PropertyList props = event.getProperties();

    if (uid != null) props.add(new Uid(uid));

    props.add(dtStart);
    if (dtEnd != null) props.add(dtEnd);
    if (duration != null) props.add(duration);

    if (rrule != null) props.add(rrule);
    if (rdate != null) props.add(rdate);
    if (exrule != null) props.add(exrule);
    if (exdate != null) props.add(exdate);

    if (summary != null && !summary.isEmpty()) props.add(new Summary(summary));
    if (location != null && !location.isEmpty()) props.add(new Location(location));
    if (description != null && !description.isEmpty()) props.add(new Description(description));

    if (status != null) props.add(status);
    if (!opaque) props.add(Transp.TRANSPARENT);

    if (organizer != null) props.add(organizer);
    props.addAll(attendees);

    if (forPublic != null) event.getProperties().add(forPublic ? Clazz.PUBLIC : Clazz.PRIVATE);

    event.getAlarms().addAll(alarms);

    props.add(new LastModified());
    ical.getComponents().add(event);

    // add VTIMEZONE components
    net.fortuna.ical4j.model.TimeZone tzStart = (dtStart == null ? null : dtStart.getTimeZone()),
        tzEnd = (dtEnd == null ? null : dtEnd.getTimeZone());
    if (tzStart != null) ical.getComponents().add(tzStart.getVTimeZone());
    if (tzEnd != null && tzEnd != tzStart) ical.getComponents().add(tzEnd.getVTimeZone());

    CalendarOutputter output = new CalendarOutputter(false);
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    try {
      output.output(ical, os);
    } catch (ValidationException e) {
      Log.e(TAG, "Generated invalid iCalendar");
    }
    return os;
  }
  /**
   * @param newUid
   * @param newEvent
   * @return
   */
  public VEvent newEvent(String newUid, String newEvent) {
    VEvent ve = new VEvent();

    DtStart dtStart = new DtStart(new DateTime());
    Summary summary = new Summary(newEvent);
    Uid uid = new Uid(newUid);

    ve.getProperties().add(dtStart);
    ve.getProperties().add(summary);
    ve.getProperties().add(uid);
    return ve;
  }
  /**
   * Adds attendees to an existing event with a given role Common logic for addAttendeesToEvent and
   * addChairAttendeestoEvent
   *
   * @param vevent the VEvent to add the attendess too
   * @param attendees list of Users that have been invited to the event
   * @param role the role with which to add each user
   * @return the VEvent for the given event or null if there was an error
   */
  protected VEvent addAttendeesToEventWithRole(VEvent vevent, List<User> attendees, Role role) {

    if (!isIcsEnabled()) {
      log.debug(
          "ExternalCalendaringService is disabled. Enable via calendar.ics.generation.enabled=true in sakai.properties");
      return null;
    }

    // add attendees to event with 'required participant' role
    if (attendees != null) {
      for (User u : attendees) {
        Attendee a = new Attendee(createMailURI(u.getEmail()));
        a.getParameters().add(role);
        a.getParameters().add(new Cn(u.getDisplayName()));
        a.getParameters().add(PartStat.ACCEPTED);
        a.getParameters().add(Rsvp.FALSE);

        vevent.getProperties().add(a);
      }
    }

    if (log.isDebugEnabled()) {
      log.debug("VEvent with attendees:" + vevent);
    }

    return vevent;
  }
Exemple #7
0
 private static VEvent generateAllDayEventForScheduleActivity(
     final Date date,
     final ScheduledActivity scheduledActivity,
     String baseUrl,
     Boolean includeSubject) {
   if (scheduledActivity.getCurrentState().getMode().equals(ScheduledActivityMode.SCHEDULED)
       || scheduledActivity
           .getCurrentState()
           .getMode()
           .equals(ScheduledActivityMode.CONDITIONAL)) {
     try {
       VEvent vEvent =
           new VEvent(
               new net.fortuna.ical4j.model.Date(date.getTime()),
               createEventSummary(scheduledActivity, includeSubject));
       vEvent.getProperties().add(new Uid(scheduledActivity.getGridId()));
       vEvent.getProperties().add(new Transp(Property.TRANSP));
       vEvent.getProperty(Property.TRANSP).setValue("TRANSPARENT");
       Description description = new Description(createEventDescription(scheduledActivity));
       vEvent.getProperties().add(description);
       vEvent.getProperties().add(new Url());
       vEvent.getProperty(Property.URL).setValue(createActivityURL(scheduledActivity, baseUrl));
       vEvent.getProperties().add(new DtEnd());
       return vEvent;
     } catch (URISyntaxException use) {
       throw new StudyCalendarSystemException("Error while creating ics calendar", use);
     } catch (IOException e) {
       throw new StudyCalendarSystemException("Error while creating ics calendar", e);
     } catch (ParseException pe) {
       throw new StudyCalendarSystemException("Error while creating ics calendar", pe);
     }
   }
   return null;
 }
  /** {@inheritDoc} */
  public VEvent cancelEvent(VEvent vevent) {

    if (!isIcsEnabled()) {
      log.debug(
          "ExternalCalendaringService is disabled. Enable via calendar.ics.generation.enabled=true in sakai.properties");
      return null;
    }
    // You can only have one status so make sure we remove any previous ones.
    vevent.getProperties().removeAll(vevent.getProperties(Property.STATUS));
    vevent.getProperties().add(Status.VEVENT_CANCELLED);

    // Must define a sequence for cancellations. If one was not defined when the event was created
    // use 1
    if (vevent.getProperties().getProperty(Property.SEQUENCE) == null) {
      vevent.getProperties().add(new Sequence("1"));
    }

    if (log.isDebugEnabled()) {
      log.debug("VEvent cancelled:" + vevent);
    }

    return vevent;
  }
  @Override
  @SuppressWarnings("unchecked")
  public String encode(List<CalendarEvent> events) {

    if (events == null || events.isEmpty()) {
      throw new IllegalArgumentException("The calendar events must be defined to encode them");
    }
    Calendar calendarIcs = new Calendar();
    calendarIcs.getProperties().add(new ProdId("-//Silverpeas//iCal4j 1.1//FR"));
    calendarIcs.getProperties().add(Version.VERSION_2_0);
    calendarIcs.getProperties().add(CalScale.GREGORIAN);
    List<VEvent> iCalEvents = new ArrayList<VEvent>();
    ByteArrayOutputStream output = new ByteArrayOutputStream(10240);
    for (CalendarEvent event : events) {
      Date startDate = anICal4JDateCodec().encode(event.getStartDate());
      Date endDate = anICal4JDateCodec().encode(event.getEndDate());
      VEvent iCalEvent;
      if (event.isOnAllDay() && startDate.equals(endDate)) {
        iCalEvent = new VEvent(startDate, event.getTitle());
      } else {
        iCalEvent = new VEvent(startDate, endDate, event.getTitle());
      }

      // Generate UID
      iCalEvent.getProperties().add(generator.generateUid());

      // Add recurring data if any
      if (event.isRecurring()) {
        CalendarEventRecurrence eventRecurrence = event.getRecurrence();
        Recur recur = anICal4JRecurrenceCodec().encode(eventRecurrence);
        iCalEvent.getProperties().add(new RRule(recur));
        iCalEvent.getProperties().add(exceptionDatesFrom(eventRecurrence));
      }
      // Add Description
      iCalEvent.getProperties().add(new Description(event.getDescription()));
      // Add Classification
      iCalEvent.getProperties().add(new Clazz(event.getAccessLevel()));
      // Add Priority
      iCalEvent.getProperties().add(new Priority(event.getPriority()));

      // Add location if any
      if (!event.getLocation().isEmpty()) {
        iCalEvent.getProperties().add(new Location(event.getLocation()));
      }

      // Add event URL if any
      if (event.getUrl() != null) {
        try {
          iCalEvent.getProperties().add(new Url(event.getUrl().toURI()));
        } catch (URISyntaxException ex) {
          throw new EncodingException(ex.getMessage(), ex);
        }
      }

      // Add Categories
      TextList categoryList = new TextList(event.getCategories().asArray());
      if (!categoryList.isEmpty()) {
        iCalEvent.getProperties().add(new Categories(categoryList));
      }
      // Add attendees
      for (String attendee : event.getAttendees().asList()) {
        try {
          iCalEvent.getProperties().add(new Attendee(attendee));
        } catch (URISyntaxException ex) {
          throw new EncodingException("Malformed attendee URI: " + attendee, ex);
        }
      }

      iCalEvents.add(iCalEvent);
    }
    calendarIcs.getComponents().addAll(iCalEvents);
    CalendarOutputter outputter = new CalendarOutputter();
    try {
      outputter.output(calendarIcs, output);
      return output.toString(CharEncoding.UTF_8);
    } catch (Exception ex) {
      throw new EncodingException(
          "The encoding of the events in iCal formatted text has failed!", ex);
    } finally {
      IOUtils.closeQuietly(output);
    }
  }
Exemple #10
0
  /** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String[] courseids = request.getParameterValues("courses");
    // Saving the course ids as a session attribute (not necessary, might be better for saving)

    HttpSession session = request.getSession(true);
    session.setAttribute("courses", courseids);

    // Get course and time info for each id
    if (courseids == null) {

    } else {
      try {
        for (String id : courseids) {
          Integer courseid = Integer.parseInt(id);
          PreparedStatement getCourse =
              con.prepareStatement(
                  "SELECT title, department, number, section " + "FROM courses WHERE id=?;");
          getCourse.setInt(1, courseid);
          PreparedStatement getTime =
              con.prepareStatement(
                  "SELECT day, starttime, endtime FROM times " + "WHERE course_id=?;");
          getTime.setInt(1, courseid);
          ResultSet courseResult = getCourse.executeQuery();
          ResultSet timesResult = getTime.executeQuery();
          while (courseResult.next()) {
            // Generating the course from the DB, lets us utilize timeblocks
            Course course = new Course();
            course.setTitle(courseResult.getString("title"));
            course.setDepartment(courseResult.getString("department"));
            course.setNumber(courseResult.getString("number"));
            course.setSection(courseResult.getString("section"));
            String courseTitle =
                course.getDepartment()
                    + course.getNumber()
                    + "-"
                    + course.getSection()
                    + ": "
                    + course.getTitle();
            while (timesResult.next()) {
              course.addTime(
                  timesResult.getString("day").charAt(0),
                  timesResult.getInt("starttime"),
                  timesResult.getInt("endtime"));
            }

            // Now parse the timeshttp://ical4j.sourceforge.net/introduction.html for the timeblocks
            Map<String, Set<Character>> timeblocks = course.getTimeBlocks();
            for (String startend : timeblocks.keySet()) {
              String[] StartEnd = startend.split("-");
              Integer startInt = Integer.parseInt(StartEnd[0]);
              Integer endInt = Integer.parseInt(StartEnd[1]);
              java.util.Calendar startDate = this.getTimeCalendar(startInt);
              java.util.Calendar endDate = this.getTimeCalendar(endInt);
              DateTime startTime = new DateTime(startDate.getTime());
              DateTime endTime = new DateTime(endDate.getTime());

              VEvent courseEvent = new VEvent(startTime, endTime, courseTitle);
              Recur recur = new Recur(Recur.WEEKLY, null);
              // add the proper days to the recurrence
              for (char day : timeblocks.get(startend)) {
                recur.getDayList().add(dayMap.get(day));
              }
              courseEvent.getProperties().add(new RRule(recur));
              // Get unique identifier
              UidGenerator ug = new UidGenerator("uidGen");
              Uid uid = ug.generateUid();
              courseEvent.getProperties().add(uid);
              // Finally, add the time block to the calendar
              this.ical.getComponents().add(courseEvent);
            }
          }
        }
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    // Time to handle file download
    try {
      // making the file and outputting the calendar info
      File file = new File("mycalendar.ics");
      int length = 0;
      FileOutputStream fout = new FileOutputStream(file);
      CalendarOutputter outputter = new CalendarOutputter();
      outputter.output(ical, fout);
      ServletOutputStream outStream = response.getOutputStream();
      response.setContentType("text/calendar");
      response.setContentLength((int) file.length());
      // sets HTTP header
      response.setHeader("Content-Disposition", "attachment; filename=calendar.ics");
      byte[] byteBuffer = new byte[BUFSIZE];
      DataInputStream in = new DataInputStream(new FileInputStream(file));

      // reads the file's bytes and writes them to the response stream
      while ((in != null) && ((length = in.read(byteBuffer)) != -1)) {
        outStream.write(byteBuffer, 0, length);
      }

      in.close();
      outStream.close();
    } catch (ValidationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
Exemple #11
0
  @Override
  @SuppressWarnings("unchecked")
  public void parseEntity(@NonNull InputStream entity)
      throws IOException, InvalidResourceException {
    net.fortuna.ical4j.model.Calendar ical;
    try {
      CalendarBuilder builder = new CalendarBuilder();
      ical = builder.build(entity);

      if (ical == null) throw new InvalidResourceException("No iCalendar found");
    } catch (ParserException e) {
      throw new InvalidResourceException(e);
    }

    // event
    ComponentList events = ical.getComponents(Component.VEVENT);
    if (events == null || events.isEmpty()) throw new InvalidResourceException("No VEVENT found");
    VEvent event = (VEvent) events.get(0);

    if (event.getUid() != null) uid = event.getUid().getValue();
    else {
      Log.w(TAG, "Received VEVENT without UID, generating new one");
      generateUID();
    }

    if ((dtStart = event.getStartDate()) == null || (dtEnd = event.getEndDate()) == null)
      throw new InvalidResourceException("Invalid start time/end time/duration");

    if (hasTime(dtStart)) {
      validateTimeZone(dtStart);
      validateTimeZone(dtEnd);
    }

    // all-day events and "events on that day":
    // * related UNIX times must be in UTC
    // * must have a duration (set to one day if missing)
    if (!hasTime(dtStart) && !dtEnd.getDate().after(dtStart.getDate())) {
      Log.i(TAG, "Repairing iCal: DTEND := DTSTART+1");
      Calendar c = Calendar.getInstance(TimeZone.getTimeZone(Time.TIMEZONE_UTC));
      c.setTime(dtStart.getDate());
      c.add(Calendar.DATE, 1);
      dtEnd.setDate(new Date(c.getTimeInMillis()));
    }

    rrule = (RRule) event.getProperty(Property.RRULE);
    rdate = (RDate) event.getProperty(Property.RDATE);
    exrule = (ExRule) event.getProperty(Property.EXRULE);
    exdate = (ExDate) event.getProperty(Property.EXDATE);

    if (event.getSummary() != null) summary = event.getSummary().getValue();
    if (event.getLocation() != null) location = event.getLocation().getValue();
    if (event.getDescription() != null) description = event.getDescription().getValue();

    status = event.getStatus();

    opaque = true;
    if (event.getTransparency() == Transp.TRANSPARENT) opaque = false;

    organizer = event.getOrganizer();
    for (Object o : event.getProperties(Property.ATTENDEE)) attendees.add((Attendee) o);

    Clazz classification = event.getClassification();
    if (classification != null) {
      if (classification == Clazz.PUBLIC) forPublic = true;
      else if (classification == Clazz.CONFIDENTIAL || classification == Clazz.PRIVATE)
        forPublic = false;
    }

    this.alarms = event.getAlarms();
  }
  private void applyEvent(NoteItem item, VEvent event) throws ValidationException {
    if (event.getSummary() == null) throw new ValidationException("Event summary is required");
    if (event.getStartDate() == null) throw new ValidationException("Event start date is required");

    if (event.getEndDate() == null && event.getDuration() == null)
      ICalendarUtils.setDuration(event, new Dur(0, 0, 0, 0));

    item.setDisplayName(event.getSummary().getValue());

    if (item.getIcalUid() == null) {
      if (event.getUid() != null) item.setIcalUid(event.getUid().getValue());
      else item.setIcalUid(item.getUid());
    }

    if (event.getDescription() != null) item.setBody(event.getDescription().getValue());

    java.util.Calendar now = java.util.Calendar.getInstance();
    if (event.getStartDate().getDate().before(now.getTime()))
      item.getTriageStatus().setCode(TriageStatus.CODE_DONE);
    else {
      java.util.Calendar later = java.util.Calendar.getInstance();
      later.add(java.util.Calendar.DAY_OF_MONTH, 2);
      if (event.getStartDate().getDate().after(later.getTime()))
        item.getTriageStatus().setCode(TriageStatus.CODE_LATER);
    }

    EventStamp es = StampUtils.getEventStamp(item);
    if (es == null) {
      es = entityFactory.createEventStamp(item);
      item.addStamp(es);
    }

    es.setEventCalendar(ICalendarUtils.createBaseCalendar(event));
  }
  /** {@inheritDoc} */
  public VEvent createEvent(CalendarEvent event, List<User> attendees) {

    if (!isIcsEnabled()) {
      log.debug(
          "ExternalCalendaringService is disabled. Enable via calendar.ics.generation.enabled=true in sakai.properties");
      return null;
    }

    // timezone. All dates are in GMT so we need to explicitly set that
    TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
    TimeZone timezone = registry.getTimeZone("GMT");
    VTimeZone tz = timezone.getVTimeZone();

    // start and end date
    DateTime start = new DateTime(getStartDate(event.getRange()).getTime());
    DateTime end = new DateTime(getEndDate(event.getRange()).getTime());

    // create event incl title/summary
    VEvent vevent = new VEvent(start, end, event.getDisplayName());

    // add timezone
    vevent.getProperties().add(tz.getTimeZoneId());

    // add uid to event
    // could come from the vevent_uuid field in the calendar event, otherwise from event ID.
    String uuid = null;
    if (StringUtils.isNotBlank(event.getField("vevent_uuid"))) {
      uuid = event.getField("vevent_uuid");
    } else {
      uuid = event.getId();
    }
    vevent.getProperties().add(new Uid(uuid));

    // add sequence to event
    // will come from the vevent_sequnece field in the calendar event, otherwise skip it
    String sequence = null;
    if (StringUtils.isNotBlank(event.getField("vevent_sequence"))) {
      sequence = event.getField("vevent_sequence");
      vevent.getProperties().add(new Sequence(sequence));
    }

    // add description to event
    vevent.getProperties().add(new Description(event.getDescription()));

    // add location to event
    vevent.getProperties().add(new Location(event.getLocation()));

    // add organiser to event
    if (StringUtils.isNotBlank(event.getCreator())) {

      String creatorEmail = sakaiProxy.getUserEmail(event.getCreator());

      URI mailURI = createMailURI(creatorEmail);
      Cn commonName = new Cn(sakaiProxy.getUserDisplayName(event.getCreator()));

      Organizer organizer = new Organizer(mailURI);
      organizer.getParameters().add(commonName);
      vevent.getProperties().add(organizer);
    }

    // add attendees to event with 'required participant' role
    vevent = addAttendeesToEvent(vevent, attendees);

    // add URL to event, if present
    String url = null;
    if (StringUtils.isNotBlank(event.getField("vevent_url"))) {
      url = event.getField("vevent_url");
      Url u = new Url();
      try {
        u.setValue(url);
        vevent.getProperties().add(u);
      } catch (URISyntaxException e) {
        // it doesnt matter, ignore it
      }
    }

    if (log.isDebugEnabled()) {
      log.debug("VEvent:" + vevent);
    }

    return vevent;
  }