Search in sources :

Example 11 with RecurrenceId

use of net.fortuna.ical4j.model.property.RecurrenceId in project openolat by klemens.

the class CalendarImportTest method testImportRecurringCal.

@Test
public void testImportRecurringCal() throws IOException, ParserException {
    InputStream in = CalendarImportTest.class.getResourceAsStream("RecurringEvent.ics");
    CalendarBuilder builder = new CalendarBuilder();
    Calendar calendar = builder.build(in);
    assertNotNull(calendar);
    VEvent rootEvent = null;
    VEvent exceptionEvent = null;
    for (Iterator<?> iter = calendar.getComponents().iterator(); iter.hasNext(); ) {
        Object comp = iter.next();
        if (comp instanceof VEvent) {
            VEvent vevent = (VEvent) comp;
            if (vevent.getRecurrenceId() == null) {
                rootEvent = vevent;
            } else {
                exceptionEvent = vevent;
            }
        }
    }
    assertNotNull(rootEvent);
    assertNotNull(exceptionEvent);
    java.util.Date startDate = CalendarUtils.getDate(2016, java.util.Calendar.OCTOBER, 10);
    DateTime start = new DateTime(startDate);
    java.util.Date endDate = CalendarUtils.getDate(2016, java.util.Calendar.NOVEMBER, 10);
    DateTime end = new DateTime(endDate);
    Period period = new Period(start, end);
    PeriodList pList = rootEvent.calculateRecurrenceSet(period);
    for (Object obj : pList) {
        Period p = (Period) obj;
        System.out.println("Period: " + p.getStart());
    }
    RecurrenceId recurrenceId = exceptionEvent.getRecurrenceId();
    Date recurrenceDate = recurrenceId.getDate();
    System.out.println("Recurrence: " + recurrenceDate);
    exceptionEvent.getSequence();
}
Also used : VEvent(net.fortuna.ical4j.model.component.VEvent) CalendarBuilder(net.fortuna.ical4j.data.CalendarBuilder) InputStream(java.io.InputStream) Date(java.util.Date) Calendar(net.fortuna.ical4j.model.Calendar) Period(net.fortuna.ical4j.model.Period) PeriodList(net.fortuna.ical4j.model.PeriodList) DateTime(net.fortuna.ical4j.model.DateTime) Date(java.util.Date) RecurrenceId(net.fortuna.ical4j.model.property.RecurrenceId) Test(org.junit.Test)

Example 12 with RecurrenceId

use of net.fortuna.ical4j.model.property.RecurrenceId in project openolat by klemens.

the class ICalFileCalendarManager method updateEventAlreadyInSync.

/**
 * @see org.olat.commons.calendar.CalendarManager#updateEventFrom(org.olat.commons.calendar.model.Kalendar, org.olat.commons.calendar.model.KalendarEvent)
 */
@Override
public boolean updateEventAlreadyInSync(final Kalendar cal, final KalendarEvent kalendarEvent) {
    OLATResourceable calOres = getOresHelperFor(cal);
    CoordinatorManager.getInstance().getCoordinator().getSyncer().assertAlreadyDoInSyncFor(calOres);
    Kalendar reloadedCal = getCalendarFromCache(cal.getType(), cal.getCalendarID());
    if (StringHelper.containsNonWhitespace(kalendarEvent.getRecurrenceRule())) {
        Date oldBegin = kalendarEvent.getImmutableBegin();
        Date oldEnd = kalendarEvent.getImmutableEnd();
        KalendarEvent originalEvent = reloadedCal.getEvent(kalendarEvent.getID(), null);
        Date newBegin = kalendarEvent.getBegin();
        Date newEnd = kalendarEvent.getEnd();
        long beginDiff = newBegin.getTime() - oldBegin.getTime();
        long endDiff = newEnd.getTime() - oldEnd.getTime();
        java.util.Calendar cl = java.util.Calendar.getInstance();
        cl.setTime(originalEvent.getBegin());
        cl.add(java.util.Calendar.MILLISECOND, (int) beginDiff);
        kalendarEvent.setBegin(cl.getTime());
        cl.setTime(originalEvent.getEnd());
        cl.add(java.util.Calendar.MILLISECOND, (int) endDiff);
        kalendarEvent.setEnd(cl.getTime());
        List<KalendarEvent> exEvents = new ArrayList<>();
        List<KalendarEvent> allEvents = reloadedCal.getEvents();
        for (KalendarEvent event : allEvents) {
            if (event.getID().equals(kalendarEvent.getID()) && StringHelper.containsNonWhitespace(event.getRecurrenceID())) {
                exEvents.add(event);
            }
        }
        if (exEvents.size() > 0) {
            for (KalendarEvent exEvent : exEvents) {
                try {
                    reloadedCal.removeEvent(exEvent);
                    String recurrenceId = exEvent.getRecurrenceID();
                    RecurrenceId recurId = new RecurrenceId(recurrenceId, tz);
                    Date currentRecurrence = recurId.getDate();
                    java.util.Calendar calc = java.util.Calendar.getInstance();
                    calc.clear();
                    calc.setTime(currentRecurrence);
                    if (beginDiff > 0) {
                        calc.add(java.util.Calendar.MILLISECOND, (int) beginDiff);
                    }
                    Date newRecurrenceDate = calc.getTime();
                    boolean allDay = kalendarEvent.isAllDayEvent();
                    RecurrenceId newRecurId;
                    if (allDay) {
                        newRecurId = new RecurrenceId(tz);
                        newRecurId.setDate(CalendarUtils.createDate(newRecurrenceDate));
                    } else {
                        String startString = CalendarUtils.formatRecurrenceDate(newRecurrenceDate, false);
                        newRecurId = new RecurrenceId(startString, tz);
                    }
                    exEvent.setRecurrenceID(newRecurId.getValue());
                    reloadedCal.addEvent(exEvent);
                } catch (ParseException e) {
                    log.error("", e);
                }
            }
        }
    }
    // remove old event
    reloadedCal.removeEvent(kalendarEvent);
    kalendarEvent.resetImmutableDates();
    // add changed event
    reloadedCal.addEvent(kalendarEvent);
    boolean successfullyPersist = persistCalendar(reloadedCal);
    // inform all controller about calendar change for reload
    CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(new CalendarGUIModifiedEvent(cal), OresHelper.lookupType(CalendarManager.class));
    return successfullyPersist;
}
Also used : OLATResourceable(org.olat.core.id.OLATResourceable) ArrayList(java.util.ArrayList) KalendarEvent(org.olat.commons.calendar.model.KalendarEvent) Date(java.util.Date) ExDate(net.fortuna.ical4j.model.property.ExDate) CalendarManager(org.olat.commons.calendar.CalendarManager) Kalendar(org.olat.commons.calendar.model.Kalendar) RecurrenceId(net.fortuna.ical4j.model.property.RecurrenceId) ParseException(java.text.ParseException) CalendarGUIModifiedEvent(org.olat.commons.calendar.ui.events.CalendarGUIModifiedEvent)

Example 13 with RecurrenceId

use of net.fortuna.ical4j.model.property.RecurrenceId in project openolat by klemens.

the class ICalFileCalendarManager method getKalendarEvent.

/**
 * Build a KalendarEvent out of a source VEvent.
 * @param event
 * @return
 */
private KalendarEvent getKalendarEvent(VEvent event) {
    // subject
    Summary eventsummary = event.getSummary();
    String subject = "";
    if (eventsummary != null)
        subject = eventsummary.getValue();
    // start
    DtStart dtStart = event.getStartDate();
    Date start = dtStart.getDate();
    Duration dur = event.getDuration();
    // end
    Date end = null;
    if (dur != null) {
        end = dur.getDuration().getTime(start);
    } else if (event.getEndDate() != null) {
        end = event.getEndDate().getDate();
    }
    // check all day event first
    boolean isAllDay = false;
    Parameter dateParameter = event.getProperties().getProperty(Property.DTSTART).getParameters().getParameter(Value.DATE.getName());
    if (dateParameter != null) {
        isAllDay = true;
        // Make sure the time of the dates are 00:00 localtime because DATE fields in iCal are GMT 00:00
        // Note that start date and end date can have different offset because of daylight saving switch
        java.util.TimeZone timezone = java.util.GregorianCalendar.getInstance().getTimeZone();
        start = new Date(start.getTime() - timezone.getOffset(start.getTime()));
        end = new Date(end.getTime() - timezone.getOffset(end.getTime()));
        // adjust end date: ICal sets end dates to the next day
        end = new Date(end.getTime() - (1000 * 60 * 60 * 24));
    } else if (start != null && end != null && (end.getTime() - start.getTime()) == (24 * 60 * 60 * 1000)) {
        // check that start has no hour, no minute and no second
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.setTime(start);
        isAllDay = cal.get(java.util.Calendar.HOUR_OF_DAY) == 0 && cal.get(java.util.Calendar.MINUTE) == 0 && cal.get(java.util.Calendar.SECOND) == 0 && cal.get(java.util.Calendar.MILLISECOND) == 0;
        // adjust end date: ICal sets end dates to the next day
        end = new Date(end.getTime() - (1000 * 60 * 60 * 24));
    }
    Uid eventuid = event.getUid();
    String uid;
    if (eventuid != null) {
        uid = eventuid.getValue();
    } else {
        uid = CodeHelper.getGlobalForeverUniqueID();
    }
    RecurrenceId eventRecurenceId = event.getRecurrenceId();
    String recurrenceId = null;
    if (eventRecurenceId != null) {
        recurrenceId = eventRecurenceId.getValue();
    }
    KalendarEvent calEvent = new KalendarEvent(uid, recurrenceId, subject, start, end);
    calEvent.setAllDayEvent(isAllDay);
    // classification
    Clazz classification = event.getClassification();
    if (classification != null) {
        String sClass = classification.getValue();
        int iClassification = KalendarEvent.CLASS_PRIVATE;
        if (sClass.equals(ICAL_CLASS_PRIVATE.getValue()))
            iClassification = KalendarEvent.CLASS_PRIVATE;
        else if (sClass.equals(ICAL_CLASS_X_FREEBUSY.getValue()))
            iClassification = KalendarEvent.CLASS_X_FREEBUSY;
        else if (sClass.equals(ICAL_CLASS_PUBLIC.getValue()))
            iClassification = KalendarEvent.CLASS_PUBLIC;
        calEvent.setClassification(iClassification);
    }
    // created/last modified
    Created created = event.getCreated();
    if (created != null) {
        calEvent.setCreated(created.getDate().getTime());
    }
    // created/last modified
    Contact contact = (Contact) event.getProperty(Property.CONTACT);
    if (contact != null) {
        calEvent.setCreatedBy(contact.getValue());
    }
    LastModified lastModified = event.getLastModified();
    if (lastModified != null) {
        calEvent.setLastModified(lastModified.getDate().getTime());
    }
    Description description = event.getDescription();
    if (description != null) {
        calEvent.setDescription(description.getValue());
    }
    // location
    Location location = event.getLocation();
    if (location != null) {
        calEvent.setLocation(location.getValue());
    }
    // links if any
    PropertyList linkProperties = event.getProperties(ICAL_X_OLAT_LINK);
    List<KalendarEventLink> kalendarEventLinks = new ArrayList<KalendarEventLink>();
    for (Iterator<?> iter = linkProperties.iterator(); iter.hasNext(); ) {
        XProperty linkProperty = (XProperty) iter.next();
        if (linkProperty != null) {
            String encodedLink = linkProperty.getValue();
            StringTokenizer st = new StringTokenizer(encodedLink, "§", false);
            if (st.countTokens() >= 4) {
                String provider = st.nextToken();
                String id = st.nextToken();
                String displayName = st.nextToken();
                String uri = st.nextToken();
                String iconCss = "";
                // migration: iconCss has been added later, check if available first
                if (st.hasMoreElements()) {
                    iconCss = st.nextToken();
                }
                KalendarEventLink eventLink = new KalendarEventLink(provider, id, displayName, uri, iconCss);
                kalendarEventLinks.add(eventLink);
            }
        }
    }
    calEvent.setKalendarEventLinks(kalendarEventLinks);
    Property comment = event.getProperty(ICAL_X_OLAT_COMMENT);
    if (comment != null)
        calEvent.setComment(comment.getValue());
    Property numParticipants = event.getProperty(ICAL_X_OLAT_NUMPARTICIPANTS);
    if (numParticipants != null)
        calEvent.setNumParticipants(Integer.parseInt(numParticipants.getValue()));
    Property participants = event.getProperty(ICAL_X_OLAT_PARTICIPANTS);
    if (participants != null) {
        StringTokenizer strTok = new StringTokenizer(participants.getValue(), "§", false);
        String[] parts = new String[strTok.countTokens()];
        for (int i = 0; strTok.hasMoreTokens(); i++) {
            parts[i] = strTok.nextToken();
        }
        calEvent.setParticipants(parts);
    }
    Property sourceNodId = event.getProperty(ICAL_X_OLAT_SOURCENODEID);
    if (sourceNodId != null) {
        calEvent.setSourceNodeId(sourceNodId.getValue());
    }
    // managed properties
    Property managed = event.getProperty(ICAL_X_OLAT_MANAGED);
    if (managed != null) {
        String value = managed.getValue();
        if ("true".equals(value)) {
            value = "all";
        }
        CalendarManagedFlag[] values = CalendarManagedFlag.toEnum(value);
        calEvent.setManagedFlags(values);
    }
    Property externalId = event.getProperty(ICAL_X_OLAT_EXTERNAL_ID);
    if (externalId != null) {
        calEvent.setExternalId(externalId.getValue());
    }
    Property externalSource = event.getProperty(ICAL_X_OLAT_EXTERNAL_SOURCE);
    if (externalSource != null) {
        calEvent.setExternalSource(externalSource.getValue());
    }
    // recurrence
    if (event.getProperty(ICAL_RRULE) != null) {
        calEvent.setRecurrenceRule(event.getProperty(ICAL_RRULE).getValue());
    }
    // recurrence exclusions
    if (event.getProperty(ICAL_EXDATE) != null) {
        calEvent.setRecurrenceExc(event.getProperty(ICAL_EXDATE).getValue());
    }
    return calEvent;
}
Also used : Description(net.fortuna.ical4j.model.property.Description) ArrayList(java.util.ArrayList) KalendarEventLink(org.olat.commons.calendar.model.KalendarEventLink) Created(net.fortuna.ical4j.model.property.Created) LastModified(net.fortuna.ical4j.model.property.LastModified) CalendarManagedFlag(org.olat.commons.calendar.CalendarManagedFlag) Clazz(net.fortuna.ical4j.model.property.Clazz) XProperty(net.fortuna.ical4j.model.property.XProperty) Property(net.fortuna.ical4j.model.Property) XProperty(net.fortuna.ical4j.model.property.XProperty) Calendar(net.fortuna.ical4j.model.Calendar) KalendarEvent(org.olat.commons.calendar.model.KalendarEvent) Duration(net.fortuna.ical4j.model.property.Duration) Date(java.util.Date) ExDate(net.fortuna.ical4j.model.property.ExDate) Contact(net.fortuna.ical4j.model.property.Contact) Uid(net.fortuna.ical4j.model.property.Uid) StringTokenizer(java.util.StringTokenizer) DtStart(net.fortuna.ical4j.model.property.DtStart) PropertyList(net.fortuna.ical4j.model.PropertyList) Summary(net.fortuna.ical4j.model.property.Summary) Parameter(net.fortuna.ical4j.model.Parameter) RecurrenceId(net.fortuna.ical4j.model.property.RecurrenceId) Location(net.fortuna.ical4j.model.property.Location)

Aggregations

RecurrenceId (net.fortuna.ical4j.model.property.RecurrenceId)13 Date (java.util.Date)12 ExDate (net.fortuna.ical4j.model.property.ExDate)10 PropertyList (net.fortuna.ical4j.model.PropertyList)9 VEvent (net.fortuna.ical4j.model.component.VEvent)9 KalendarEvent (org.olat.commons.calendar.model.KalendarEvent)8 DateTime (net.fortuna.ical4j.model.DateTime)7 ParseException (java.text.ParseException)6 ArrayList (java.util.ArrayList)6 Calendar (net.fortuna.ical4j.model.Calendar)5 PeriodList (net.fortuna.ical4j.model.PeriodList)5 Contact (net.fortuna.ical4j.model.property.Contact)5 Created (net.fortuna.ical4j.model.property.Created)5 Description (net.fortuna.ical4j.model.property.Description)5 LastModified (net.fortuna.ical4j.model.property.LastModified)5 Location (net.fortuna.ical4j.model.property.Location)5 Uid (net.fortuna.ical4j.model.property.Uid)5 RRule (net.fortuna.ical4j.model.property.RRule)4 XProperty (net.fortuna.ical4j.model.property.XProperty)4 Kalendar (org.olat.commons.calendar.model.Kalendar)4