Skip to content

Commit

Permalink
Implemented new template construct
Browse files Browse the repository at this point in the history
  • Loading branch information
benfortuna committed Jul 22, 2023
1 parent c47b9c0 commit ef88f6d
Show file tree
Hide file tree
Showing 30 changed files with 492 additions and 296 deletions.
43 changes: 43 additions & 0 deletions src/main/java/org/ical4j/template/AbstractCalendarTemplate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package org.ical4j.template;

import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.ComponentGroup;
import net.fortuna.ical4j.model.Property;
import net.fortuna.ical4j.model.component.CalendarComponent;
import net.fortuna.ical4j.model.property.RecurrenceId;
import net.fortuna.ical4j.model.property.Uid;

import java.util.Collections;
import java.util.Optional;

/**
* Implementors provide a template for common iCalendar and vCard use-cases.
*/
public abstract class AbstractCalendarTemplate<T extends CalendarComponent> implements FluentCalendarTemplate<T> {

private final ComponentGroup<T> revisions;

public AbstractCalendarTemplate(T initialValue) {
Uid uid = initialValue.getRequiredProperty(Property.UID);
Optional<RecurrenceId<?>> recurrenceId = initialValue.getProperty(Property.RECURRENCE_ID);
this.revisions = recurrenceId.map(id -> new ComponentGroup<>(Collections.singletonList(initialValue), uid, id))
.orElseGet(() -> new ComponentGroup<>(Collections.singletonList(initialValue), uid));
}

public ComponentGroup<T> getRevisions() {
return revisions;
}

/**
* Produce a {@link Calendar} representation of the object.
* @return a calendar instance
*/
public Calendar toCalendar() {
return new Calendar(getRevisions().getComponentList()).withDefaults().getFluentTarget();
}

@Override
public String toString() {
return toCalendar().toString();
}
}
28 changes: 28 additions & 0 deletions src/main/java/org/ical4j/template/AbstractVCardTemplate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.ical4j.template;

import net.fortuna.ical4j.vcard.PropertyName;
import net.fortuna.ical4j.vcard.VCard;
import net.fortuna.ical4j.vcard.VCardGroup;
import net.fortuna.ical4j.vcard.VCardList;
import net.fortuna.ical4j.vcard.property.Uid;

import java.util.Collections;

public abstract class AbstractVCardTemplate {

private final VCardGroup revisions;

public AbstractVCardTemplate(VCard initialValue) {
Uid uid = initialValue.getRequiredProperty(PropertyName.UID.toString());
this.revisions = new VCardGroup(uid, new VCardList(Collections.singletonList(initialValue)));
}

public VCardGroup getRevisions() {
return revisions;
}

@Override
public String toString() {
return revisions.toString();
}
}
16 changes: 16 additions & 0 deletions src/main/java/org/ical4j/template/FluentCalendarTemplate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.ical4j.template;

import net.fortuna.ical4j.model.component.CalendarComponent;
import net.fortuna.ical4j.model.property.Sequence;

public interface FluentCalendarTemplate<C extends CalendarComponent> {

<T extends AbstractCalendarTemplate<C>> T getFluentTarget();

default FluentCalendarTemplate<C> withRevision() {
C newRevision = getFluentTarget().getRevisions().getLatestRevision().copy();
newRevision.add(new Sequence(1));
getFluentTarget().getRevisions().add(newRevision);
return getFluentTarget();
}
}
32 changes: 25 additions & 7 deletions src/main/java/org/ical4j/template/vcard/Group.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,35 @@
package org.ical4j.template.vcard;

import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.vcard.VCard;
import net.fortuna.ical4j.vcard.property.Fn;
import net.fortuna.ical4j.vcard.property.Member;
import net.fortuna.ical4j.vcard.property.Note;
import net.fortuna.ical4j.vcard.property.Related;
import net.fortuna.ical4j.vcard.property.immutable.ImmutableKind;
import org.ical4j.template.AbstractVCardTemplate;

public class Group extends VCard {
import java.util.Arrays;

/**
* This class provides support for grouping related card entities as well as hierarchical
* relationships.
*/
public class Group extends AbstractVCardTemplate {

public Group(String name, VCard...members) {
add(ImmutableKind.GROUP);
add(new Fn(name));
for (VCard member : members) {
add(new Member(member));
}
super(new VCard(new PropertyList(Arrays.asList(new Fn(name), ImmutableKind.GROUP))));
// for (VCard member : members) {
// add(new Member(member));
// }
}

public Group description(String description) {
getRevisions().getLatestRevision().add(new Note(description));
return this;
}

public Group related(Related group) {
getRevisions().getLatestRevision().add(group);
return this;
}
}
9 changes: 6 additions & 3 deletions src/main/java/org/ical4j/template/vcard/Organization.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package org.ical4j.template.vcard;

import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.vcard.VCard;
import net.fortuna.ical4j.vcard.property.Fn;
import net.fortuna.ical4j.vcard.property.immutable.ImmutableKind;
import org.ical4j.template.AbstractVCardTemplate;

public class Organization extends VCard {
import java.util.Arrays;

public class Organization extends AbstractVCardTemplate {

public Organization(String name) {
add(ImmutableKind.ORG);
add(new Fn(name));
super(new VCard(new PropertyList(Arrays.asList(new Fn(name), ImmutableKind.ORG))));
}
}
9 changes: 6 additions & 3 deletions src/main/java/org/ical4j/template/vcard/Place.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package org.ical4j.template.vcard;

import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.vcard.VCard;
import net.fortuna.ical4j.vcard.property.Fn;
import net.fortuna.ical4j.vcard.property.immutable.ImmutableKind;
import org.ical4j.template.AbstractVCardTemplate;

public class Place extends VCard {
import java.util.Arrays;

public class Place extends AbstractVCardTemplate {

public Place(String name) {
add(ImmutableKind.LOCATION);
add(new Fn(name));
super(new VCard(new PropertyList(Arrays.asList(new Fn(name), ImmutableKind.LOCATION))));
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package org.ical4j.template.vcard;

import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.vcard.VCard;
import net.fortuna.ical4j.vcard.property.Fn;
import net.fortuna.ical4j.vcard.property.immutable.ImmutableKind;
import org.ical4j.template.AbstractVCardTemplate;

import java.util.Arrays;

/**
* A production definition.
*/
public class ProductDefinition extends VCard {
public class ProductDefinition extends AbstractVCardTemplate {

public ProductDefinition(String name) {
add(ImmutableKind.THING);
add(new Fn(name));
super(new VCard(new PropertyList(Arrays.asList(new Fn(name), ImmutableKind.THING))));
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package org.ical4j.template.vcard;

import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.vcard.VCard;
import net.fortuna.ical4j.vcard.property.Fn;
import net.fortuna.ical4j.vcard.property.immutable.ImmutableKind;
import org.ical4j.template.AbstractVCardTemplate;

public class ResourceDefinition extends VCard {
import java.util.Arrays;

public class ResourceDefinition extends AbstractVCardTemplate {

public ResourceDefinition(String name) {
add(ImmutableKind.THING);
add(new Fn(name));
super(new VCard(new PropertyList(Arrays.asList(new Fn(name), ImmutableKind.THING))));
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package org.ical4j.template.vcard;

import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.vcard.VCard;
import net.fortuna.ical4j.vcard.property.Fn;
import net.fortuna.ical4j.vcard.property.immutable.ImmutableKind;
import org.ical4j.template.AbstractVCardTemplate;

import java.util.Arrays;

/**
* A service definition.
*/
public class ServiceDefinition extends VCard {
public class ServiceDefinition extends AbstractVCardTemplate {

public ServiceDefinition(String name) {
add(ImmutableKind.THING);
add(new Fn(name));
super(new VCard(new PropertyList(Arrays.asList(new Fn(name), ImmutableKind.THING))));
}
}
17 changes: 14 additions & 3 deletions src/main/java/org/ical4j/template/vcard/UserInfo.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
package org.ical4j.template.vcard;

import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.vcard.VCard;
import net.fortuna.ical4j.vcard.property.Fn;
import net.fortuna.ical4j.vcard.property.immutable.ImmutableKind;
import org.ical4j.template.AbstractVCardTemplate;

public class UserInfo extends VCard {
import java.util.Arrays;

public class UserInfo extends AbstractVCardTemplate {

public UserInfo(String name) {
add(ImmutableKind.INDIVIDUAL);
add(new Fn(name));
super(new VCard(new PropertyList(Arrays.asList(new Fn(name), ImmutableKind.INDIVIDUAL))));
}

public UserInfo tags() {
return this;
}

public UserInfo directReports() {
return this;
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package org.ical4j.template.property;
package org.ical4j.template.vcard.property;

import net.fortuna.ical4j.model.property.ImmutableProperty;
import net.fortuna.ical4j.vcard.property.Categories;

/**
* This class extends the {@link Categories} property to provide common categories applied to
* vCard information.
*/
public class CardType extends Categories implements ImmutableProperty {

public static final CardType CONTACT = new CardType("CONTACT");

public static final CardType APPLICATION = new CardType("APPLICATION");

public CardType(String... categories) {
super(categories);
}
Expand Down
45 changes: 24 additions & 21 deletions src/main/java/org/ical4j/template/vevent/Anniversary.java
Original file line number Diff line number Diff line change
@@ -1,39 +1,42 @@
package org.ical4j.template.vevent;

import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.property.DtStamp;
import net.fortuna.ical4j.model.property.DtStart;
import net.fortuna.ical4j.model.property.Summary;
import net.fortuna.ical4j.model.property.immutable.ImmutableTransp;
import net.fortuna.ical4j.util.RandomUidGenerator;
import org.ical4j.template.AbstractCalendarTemplate;
import org.ical4j.template.property.Repeats;

import java.time.LocalDate;
import java.util.Arrays;

/**
* Creates a recurring {@link VEvent} representing a birthday/anniversary, etc.
*/
public class Anniversary extends VEvent {
public class Anniversary extends AbstractCalendarTemplate<VEvent> {

public Anniversary(LocalDate date) {
super(new VEvent(new PropertyList(Arrays.asList(new RandomUidGenerator().generateUid(),
new DtStamp(), ImmutableTransp.TRANSPARENT, Repeats.YEARLY,
new DtStart<>(date)))));
}

public Anniversary(String summary, LocalDate date) {
add(ImmutableTransp.TRANSPARENT);
add(new Summary(summary));
add(new DtStart<>(date));
add(Repeats.YEARLY);
super(new VEvent(new PropertyList(Arrays.asList(new RandomUidGenerator().generateUid(),
new DtStamp(), ImmutableTransp.TRANSPARENT, Repeats.YEARLY,
new DtStart<>(date), new Summary(summary)))));
}

// public static class Factory extends VEvent.Factory {
// @Override
// public VEvent createComponent() {
// return super.createComponent(initProps());
// }
//
// @Override
// public VEvent createComponent(PropertyList properties) {
// return super.createComponent(initProps());
// }
//
// @Override
// public VEvent createComponent(PropertyList properties, ComponentList<?> subComponents) {
// return new VEvent(initProps(), (ComponentList<VAlarm>) subComponents);
// }
// }
@Override
public <T extends AbstractCalendarTemplate<VEvent>> T getFluentTarget() {
return (T) this;
}

public Anniversary withSummary(String summary) {
getRevisions().getLatestRevision().replace(new Summary(summary));
return this;
}
}
21 changes: 15 additions & 6 deletions src/main/java/org/ical4j/template/vevent/Appointment.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
package org.ical4j.template.vevent;

import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.property.DtStamp;
import net.fortuna.ical4j.model.property.DtStart;
import net.fortuna.ical4j.model.property.Organizer;
import net.fortuna.ical4j.model.property.Summary;
import org.ical4j.template.property.ComponentType;
import net.fortuna.ical4j.util.RandomUidGenerator;
import org.ical4j.template.AbstractCalendarTemplate;
import org.ical4j.template.property.EventType;

import java.net.URISyntaxException;
import java.time.ZonedDateTime;
import java.util.Arrays;

public class Appointment extends VEvent {
public class Appointment extends AbstractCalendarTemplate<VEvent> {

public Appointment(String summary, ZonedDateTime start) {
add(ComponentType.APPOINTMENT);
add(new Summary(summary));
add(new DtStart<>(start));
super(new VEvent(new PropertyList(Arrays.asList(new RandomUidGenerator().generateUid(),
new DtStamp(), EventType.APPOINTMENT, new Summary(summary),
new DtStart<>(start)))));
}

@Override
public <T extends AbstractCalendarTemplate<VEvent>> T getFluentTarget() {
return (T) this;
}

/**
Expand Down
Loading

0 comments on commit ef88f6d

Please sign in to comment.