Skip to content

Commit

Permalink
Merge pull request #398 from ical4j/develop
Browse files Browse the repository at this point in the history
Prepare release
  • Loading branch information
benfortuna committed Mar 7, 2020
2 parents 10c2127 + 6dcaa96 commit 9c32018
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 3 deletions.
20 changes: 19 additions & 1 deletion src/main/java/net/fortuna/ical4j/model/ComponentGroup.java
Expand Up @@ -5,8 +5,11 @@
import net.fortuna.ical4j.model.property.RecurrenceId;
import net.fortuna.ical4j.model.property.Uid;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
* Support for operations applicable to a group of components. Typically this class is used to manage
Expand Down Expand Up @@ -83,11 +86,26 @@ public T getLatestRevision() {
*/
public PeriodList calculateRecurrenceSet(final Period period) {
PeriodList periods = new PeriodList();
List<Component> replacements = new ArrayList<>();

for (Component component : getRevisions()) {
periods = periods.add(component.calculateRecurrenceSet(period));
if (!component.getProperties(Property.RECURRENCE_ID).isEmpty()) {
replacements.add(component);
} else {
periods = periods.add(component.calculateRecurrenceSet(period));
}
}

PeriodList finalPeriods = periods;
replacements.forEach(component -> {
RecurrenceId recurrenceId = component.getProperty(Property.RECURRENCE_ID);
List<Period> match = finalPeriods.stream().filter(p -> p.getStart().equals(recurrenceId.getDate()))
.collect(Collectors.toList());
finalPeriods.removeAll(match);

finalPeriods.addAll(component.calculateRecurrenceSet(period));
});

return periods;
}
}
25 changes: 23 additions & 2 deletions src/test/groovy/net/fortuna/ical4j/model/ComponentGroupTest.groovy
Expand Up @@ -16,7 +16,7 @@ class ComponentGroupTest extends Specification {

Uid uid

VEvent event, rev1, rev2
VEvent event, rev1, rev2, rev3

def setup() {
uid = builder.uid('1')
Expand All @@ -38,12 +38,21 @@ class ComponentGroupTest extends Specification {

rev2 = builder.vevent {
uid(uid)
sequence('1')
sequence('2')
dtstamp(new DtStamp(new DateTime()))
dtstart('20101113', parameters: parameters() { value('DATE') })
dtend('20101114', parameters: parameters() { value('DATE') })
rrule('FREQ=WEEKLY;WKST=MO;INTERVAL=3;BYDAY=MO,TU,SA')
}

rev3 = builder.vevent {
uid(uid)
sequence('3')
recurrenceid('20101129', parameters: parameters() { value('DATE') })
dtstamp(new DtStamp(new DateTime()))
dtstart('20101130', parameters: parameters() { value('DATE') })
dtend('20101201', parameters: parameters() { value('DATE') })
}
}

def "GetRevisions"() {
Expand Down Expand Up @@ -79,4 +88,16 @@ class ComponentGroupTest extends Specification {
then: 'the expected number of recurrences are returned'
recurrences == event.calculateRecurrenceSet(period).normalise()
}

def "CalculateRecurrenceSetWithException"() {
given: 'an event with 2 revisions'
def components = new ComponentList<VEvent>([event, rev1, rev2, rev3])

when: 'recurrence instances are calculated'
Period period = ['20101113T120000/P3W']
def recurrences = new ComponentGroup(components, uid).calculateRecurrenceSet(period)

then: 'the expected number of recurrences are returned'
recurrences.size() == event.calculateRecurrenceSet(period).normalise().size()
}
}

0 comments on commit 9c32018

Please sign in to comment.