protected void setClientAllday(VProperty property) {
   if (property != null) {
     // set VALUE=DATE param
     if (!property.hasParam("VALUE")) {
       property.addParam("VALUE", "DATE");
     }
     // remove TZID
     property.removeParam("TZID");
     String value = property.getValue();
     if (value.length() != 8) {
       // try to convert datetime value to date value
       try {
         Calendar calendar = Calendar.getInstance();
         SimpleDateFormat dateParser = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
         calendar.setTime(dateParser.parse(value));
         calendar.add(Calendar.HOUR_OF_DAY, 12);
         SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyyMMdd");
         value = dateFormatter.format(calendar.getTime());
       } catch (ParseException e) {
         LOGGER.warn("Invalid date value in allday event: " + value);
       }
     }
     property.setValue(value);
   }
 }
 protected String getAttendeeStatus() {
   String status = null;
   List<VProperty> attendeeProperties = getFirstVeventProperties("ATTENDEE");
   if (attendeeProperties != null) {
     for (VProperty property : attendeeProperties) {
       String attendeeEmail = getEmailValue(property);
       if (email.equalsIgnoreCase(attendeeEmail) && property.hasParam("PARTSTAT")) {
         // found current user attendee line
         status = property.getParam("PARTSTAT").getValue();
         break;
       }
     }
   }
   return status;
 }
 protected void setServerAllday(VProperty property) {
   if (vTimezone != null) {
     // set TZID param
     if (!property.hasParam("TZID")) {
       property.addParam("TZID", vTimezone.getPropertyValue("TZID"));
     }
     // remove VALUE
     property.removeParam("VALUE");
     String value = property.getValue();
     if (value.length() != 8) {
       LOGGER.warn("Invalid date value in allday event: " + value);
     }
     property.setValue(property.getValue() + "T000000");
   }
 }
 private void fixAttendees(VObject vObject, boolean fromServer) {
   if (vObject.properties != null) {
     for (VProperty property : vObject.properties) {
       if ("ATTENDEE".equalsIgnoreCase(property.getKey())) {
         if (fromServer) {
           // If this is coming from the server, strip out RSVP for this
           // user as an attendee where the partstat is something other
           // than PARTSTAT=NEEDS-ACTION since the RSVP confuses iCal4 into
           // thinking the attendee has not replied
           if (isCurrentUser(property) && property.hasParam("RSVP", "TRUE")) {
             VProperty.Param partstat = property.getParam("PARTSTAT");
             if (partstat == null || !"NEEDS-ACTION".equals(partstat.getValue())) {
               property.removeParam("RSVP");
             }
           }
         } else {
           property.setValue(replaceIcal4Principal(property.getValue()));
         }
       }
     }
   }
 }
  /**
   * Build recipients value for VCalendar.
   *
   * @param isNotification if true, filter recipients that should receive meeting notifications
   * @return notification/event recipients
   */
  public Recipients getRecipients(boolean isNotification) {

    HashSet<String> attendees = new HashSet<String>();
    HashSet<String> optionalAttendees = new HashSet<String>();

    // get recipients from first VEVENT
    List<VProperty> attendeeProperties = getFirstVeventProperties("ATTENDEE");
    if (attendeeProperties != null) {
      for (VProperty property : attendeeProperties) {
        // exclude current user and invalid values from recipients
        // also exclude no action attendees
        String attendeeEmail = getEmailValue(property);
        if (!email.equalsIgnoreCase(attendeeEmail)
            && attendeeEmail != null
            && attendeeEmail.indexOf('@') >= 0
            // return all attendees for user calendar folder, filter for notifications
            && (!isNotification
                // notify attendee if reply explicitly requested
                || (property.hasParam("RSVP", "TRUE"))
                || (
                // workaround for iCal bug: do not notify if reply explicitly not requested
                !(property.hasParam("RSVP", "FALSE"))
                    && ((property.hasParam("PARTSTAT", "NEEDS-ACTION")
                        // need to include other PARTSTATs participants for CANCEL notifications
                        || property.hasParam("PARTSTAT", "ACCEPTED")
                        || property.hasParam("PARTSTAT", "DECLINED")
                        || property.hasParam("PARTSTAT", "TENTATIVE")))))) {
          if (property.hasParam("ROLE", "OPT-PARTICIPANT")) {
            optionalAttendees.add(attendeeEmail);
          } else {
            attendees.add(attendeeEmail);
          }
        }
      }
    }
    Recipients recipients = new Recipients();
    recipients.organizer = getEmailValue(getFirstVeventProperty("ORGANIZER"));
    recipients.attendees = StringUtil.join(attendees, ", ");
    recipients.optionalAttendees = StringUtil.join(optionalAttendees, ", ");
    return recipients;
  }
 private void fixTzid(VProperty property) {
   if (property != null && !property.hasParam("TZID")) {
     property.addParam("TZID", vTimezone.getPropertyValue("TZID"));
   }
 }
 protected boolean isAllDay(VObject vObject) {
   VProperty dtstart = vObject.getProperty("DTSTART");
   return dtstart != null && dtstart.hasParam("VALUE", "DATE");
 }