예제 #1
1
파일: Util.java 프로젝트: ptrvif/openhab
  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;
  }
  /**
   * Fügt einem iCal-Event das Enddatum aus dem übergebenen Appointment-Objekt hinzu.
   *
   * @param appointment
   */
  private void addEndDateToEvent(
      Appointment appointment, PropertyList properties, boolean isAllDayEvent) {

    Date endDate = appointment.getEnd();
    java.util.Calendar calendar = java.util.Calendar.getInstance();

    if (isAllDayEvent) {
      DtEnd end = getDtEndFromAllDayEvent(endDate, calendar);
      properties.add(end);
    } else {
      if (appointment.getRepeating() == null) {
        DtEnd end = new DtEnd(convertRaplaLocaleToUTC(endDate));
        end.setUtc(true);
        properties.add(end);
      } else {
        DtEnd end = getEndDateProperty(endDate);
        properties.add(end);
      }
    }
  }
예제 #3
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;
  }
예제 #4
0
 public long getDtEndInMillis() {
   return dtEnd.getDate().getTime();
 }
예제 #5
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();
  }