Skip to content

Commit

Permalink
Merge branch 'develop' into feature/jsr-310-localdate
Browse files Browse the repository at this point in the history
# Conflicts:
#	src/main/java/net/fortuna/ical4j/model/PropertyBuilder.java
#	src/main/java/net/fortuna/ical4j/model/component/Available.java
#	src/main/java/net/fortuna/ical4j/model/component/Participant.java
#	src/main/java/net/fortuna/ical4j/model/component/VAlarm.java
#	src/main/java/net/fortuna/ical4j/model/component/VAvailability.java
#	src/main/java/net/fortuna/ical4j/model/component/VEvent.java
#	src/main/java/net/fortuna/ical4j/model/component/VFreeBusy.java
#	src/main/java/net/fortuna/ical4j/model/component/VJournal.java
#	src/main/java/net/fortuna/ical4j/model/component/VLocation.java
#	src/main/java/net/fortuna/ical4j/model/component/VResource.java
#	src/main/java/net/fortuna/ical4j/model/component/VTimeZone.java
#	src/main/java/net/fortuna/ical4j/model/component/VToDo.java
#	src/main/java/net/fortuna/ical4j/model/component/VVenue.java
#	src/main/java/net/fortuna/ical4j/model/component/XComponent.java
#	src/main/java/net/fortuna/ical4j/model/property/Attach.java
#	src/main/java/net/fortuna/ical4j/model/property/Attendee.java
#	src/main/java/net/fortuna/ical4j/model/property/Categories.java
#	src/main/java/net/fortuna/ical4j/model/property/Comment.java
#	src/main/java/net/fortuna/ical4j/model/property/Contact.java
#	src/main/java/net/fortuna/ical4j/model/property/Country.java
#	src/main/java/net/fortuna/ical4j/model/property/DateProperty.java
#	src/main/java/net/fortuna/ical4j/model/property/Description.java
#	src/main/java/net/fortuna/ical4j/model/property/ExDate.java
#	src/main/java/net/fortuna/ical4j/model/property/FreeBusy.java
#	src/main/java/net/fortuna/ical4j/model/property/Location.java
#	src/main/java/net/fortuna/ical4j/model/property/Organizer.java
#	src/main/java/net/fortuna/ical4j/model/property/RDate.java
#	src/main/java/net/fortuna/ical4j/model/property/RRule.java
#	src/main/java/net/fortuna/ical4j/model/property/RecurrenceId.java
#	src/main/java/net/fortuna/ical4j/model/property/Region.java
#	src/main/java/net/fortuna/ical4j/model/property/RelatedTo.java
#	src/main/java/net/fortuna/ical4j/model/property/RequestStatus.java
#	src/main/java/net/fortuna/ical4j/model/property/Resources.java
#	src/main/java/net/fortuna/ical4j/model/property/StructuredData.java
#	src/main/java/net/fortuna/ical4j/model/property/StyledDescription.java
#	src/main/java/net/fortuna/ical4j/model/property/Summary.java
#	src/main/java/net/fortuna/ical4j/model/property/Tel.java
#	src/main/java/net/fortuna/ical4j/model/property/Trigger.java
#	src/main/java/net/fortuna/ical4j/model/property/TzName.java
#	src/main/java/net/fortuna/ical4j/model/property/UtcProperty.java
#	src/main/java/net/fortuna/ical4j/validate/CalendarValidatorImpl.java
#	src/main/java/net/fortuna/ical4j/validate/ComponentValidator.java
#	src/main/java/net/fortuna/ical4j/validate/PropertyValidator.java
#	src/main/java/net/fortuna/ical4j/validate/ValidationRule.java
#	src/main/java/net/fortuna/ical4j/validate/component/VEventValidator.java
#	src/main/java/net/fortuna/ical4j/validate/component/VTimeZoneValidator.java
#	src/main/java/net/fortuna/ical4j/validate/component/VToDoValidator.java
  • Loading branch information
benfortuna committed Oct 26, 2021
2 parents 1858238 + 989a937 commit 1ba134a
Show file tree
Hide file tree
Showing 59 changed files with 1,303 additions and 783 deletions.
17 changes: 15 additions & 2 deletions src/main/java/net/fortuna/ical4j/model/ParameterBuilder.java
Expand Up @@ -4,7 +4,7 @@
import org.apache.commons.codec.DecoderException;

import java.net.URISyntaxException;
import java.util.Collections;
import java.util.ArrayList;
import java.util.List;

/**
Expand All @@ -19,13 +19,26 @@ public class ParameterBuilder extends AbstractContentBuilder {
private String value;

public ParameterBuilder() {
this(Collections.emptyList());
this(new ArrayList<>());
}

public ParameterBuilder(List<ParameterFactory<? extends Parameter>> factories) {
this.factories = factories;
}

/**
* Set the list of parameter factories supporting this builder instance.
* @param factories a list of parameter factories
* @return the builder instance
* @deprecated preference the constructor option for specifying factories
*/
@Deprecated
public ParameterBuilder factories(List<ParameterFactory<?>> factories) {
this.factories.clear();
this.factories.addAll(factories);
return this;
}

public ParameterBuilder name(String name) {
// parameter names are case-insensitive, but convert to upper case to simplify further processing
this.name = name.toUpperCase();
Expand Down
17 changes: 15 additions & 2 deletions src/main/java/net/fortuna/ical4j/model/PropertyBuilder.java
Expand Up @@ -7,8 +7,8 @@

import java.io.IOException;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
Expand All @@ -29,13 +29,26 @@ public class PropertyBuilder extends AbstractContentBuilder {
private TimeZoneRegistry timeZoneRegistry;

public PropertyBuilder() {
this(Collections.emptyList());
this(new ArrayList<>());
}

public PropertyBuilder(List<PropertyFactory<? extends Property>> factories) {
this.factories = factories;
}

/**
* Set the list of property factories supporting this builder instance.
* @param factories a list of property factories
* @return the builder instance
* @deprecated preference the constructor option for specifying factories
*/
@Deprecated
public PropertyBuilder factories(List<PropertyFactory<?>> factories) {
this.factories.clear();
this.factories.addAll(factories);
return this;
}

public PropertyBuilder name(String name) {
// property names are case-insensitive, but convert to upper case to simplify further processing
this.name = name.toUpperCase();
Expand Down
62 changes: 2 additions & 60 deletions src/main/java/net/fortuna/ical4j/model/component/Available.java
Expand Up @@ -32,19 +32,8 @@
package net.fortuna.ical4j.model.component;

import net.fortuna.ical4j.model.*;
import net.fortuna.ical4j.model.parameter.Value;
import net.fortuna.ical4j.model.property.DtEnd;
import net.fortuna.ical4j.validate.ComponentValidator;
import net.fortuna.ical4j.validate.ValidationException;
import net.fortuna.ical4j.validate.ValidationRule;
import net.fortuna.ical4j.validate.Validator;

import java.io.Serializable;
import java.util.Optional;
import java.util.function.Predicate;

import static net.fortuna.ical4j.model.Property.*;
import static net.fortuna.ical4j.validate.ValidationRule.ValidationType.*;
import net.fortuna.ical4j.validate.component.AvailableValidator;

/**
* $Id$ [05-Apr-2004]
Expand Down Expand Up @@ -127,54 +116,7 @@ public Available(final PropertyList properties) {
*/
@Override
public final void validate(final boolean recurse) throws ValidationException {

validator.validate(this);
/*
* ; dtstamp / dtstart / uid are required, but MUST NOT occur more than once /
*/

/* If specified, the "DTSTART" and "DTEND" properties in
* "VAVAILABILITY" components and "AVAILABLE" sub-components MUST be
* "DATE-TIME" values specified as either date with UTC time or date
* with local time and a time zone reference.
*/
try {
if (getProperties().getRequired(DTSTART).getParameters().getFirst(Parameter.VALUE)
.equals(Optional.of(Value.DATE))) {
throw new ValidationException("Property [" + DTSTART + "] must be a " + Value.DATE_TIME);
}
} catch (ConstraintViolationException cve) {
throw new ValidationException("Missing required property", cve);
}

/*
* ; the following are optional,
* ; but MUST NOT occur more than once
*
* created / last-mod / recurid / rrule /
* summary /
*/

/*
; either a 'dtend' or a 'duration' is required
; in a 'availableprop', but 'dtend' and
; 'duration' MUST NOT occur in the same
; 'availableprop', and each MUST NOT occur more
; than once
*/
final Optional<DtEnd<?>> end = getProperties().getFirst(DTEND);
if (end.isPresent()) {
/* Must be DATE_TIME */
if (Optional.of(Value.DATE).equals(end.get().getParameters().getFirst(Parameter.VALUE))) {
throw new ValidationException("Property [" + DTEND + "] must be a " + Value.DATE_TIME);
}
}

/*
* ; the following are optional, ; and MAY occur more than once
* categories / comment / contact / exdate /
* rdate / x-prop
*/
new AvailableValidator().validate(this);

if (recurse) {
validateProperties();
Expand Down
Expand Up @@ -38,8 +38,6 @@
import net.fortuna.ical4j.validate.ValidationRule;
import net.fortuna.ical4j.validate.Validator;

import java.util.Optional;

import static net.fortuna.ical4j.model.Property.*;
import static net.fortuna.ical4j.validate.ValidationRule.ValidationType.One;
import static net.fortuna.ical4j.validate.ValidationRule.ValidationType.OneOrLess;
Expand Down Expand Up @@ -157,8 +155,7 @@ public Participant(final PropertyList properties, final ComponentList<? extends
* {@inheritDoc}
*/
public final void validate(final boolean recurse) throws ValidationException {

validator.validate(this);
ComponentValidator.PARTICIPANT.validate(this);

if (recurse) {
validateProperties();
Expand Down
56 changes: 13 additions & 43 deletions src/main/java/net/fortuna/ical4j/model/component/VAlarm.java
Expand Up @@ -37,19 +37,11 @@
import net.fortuna.ical4j.model.property.*;
import net.fortuna.ical4j.validate.ComponentValidator;
import net.fortuna.ical4j.validate.ValidationException;
import net.fortuna.ical4j.validate.ValidationRule;
import net.fortuna.ical4j.validate.Validator;

import java.io.Serializable;
import java.time.Instant;
import java.time.temporal.TemporalAmount;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Predicate;

import static net.fortuna.ical4j.model.Property.*;
import static net.fortuna.ical4j.validate.ValidationRule.ValidationType.*;

/**
* $Id$ [Apr 5, 2004]
Expand Down Expand Up @@ -204,24 +196,6 @@ public class VAlarm extends CalendarComponent {

private static final long serialVersionUID = -8193965477414653802L;

private static final Map<Action, Validator> actionValidators = new HashMap<Action, Validator>();
static {
actionValidators.put(Action.AUDIO, new ComponentValidator<VAlarm>(new ValidationRule(OneOrLess, ATTACH)));
actionValidators.put(Action.DISPLAY, new ComponentValidator<VAlarm>(new ValidationRule(One, DESCRIPTION)));
actionValidators.put(Action.EMAIL, new ComponentValidator<VAlarm>(new ValidationRule(One, DESCRIPTION, SUMMARY),
new ValidationRule(OneOrMore, ATTENDEE)));
actionValidators.put(Action.PROCEDURE, new ComponentValidator<VAlarm>(new ValidationRule(One, ATTACH),
new ValidationRule(OneOrLess, DESCRIPTION)));
}

private final Validator<VAlarm> vAlarmValidator = new ComponentValidator<>(
new ValidationRule<>(One, ACTION, TRIGGER),
new ValidationRule<>(OneOrLess, DURATION, REPEAT),
// DURATION and REPEAT must both be present or both absent
new ValidationRule<>(One,
(Predicate<VAlarm> & Serializable) p->p.getProperties().getFirst(DURATION).isPresent(), REPEAT)
);

/**
* Default constructor.
*/
Expand Down Expand Up @@ -261,24 +235,20 @@ public VAlarm(final TemporalAmount trigger) {
@Override
public final void validate(final boolean recurse) throws ValidationException {

/*
* ; 'action' and 'trigger' are both REQUIRED, ; but MUST NOT occur more than once action / trigger /
*/

/*
* ; 'duration' and 'repeat' are both optional, ; and MUST NOT occur more than once each, ; but if one occurs,
* so MUST the other duration / repeat /
*/

/*
* ; the following is optional, ; and MAY occur more than once x-prop
*/
Optional<Action> action = getProperties().getFirst(ACTION);
if (action.isPresent()) {
final Validator<VAlarm> actionValidator = actionValidators.get(action.get());
if (actionValidator != null) {
actionValidator.validate(this);
if (getAction() != null) {
switch (getAction().getValue()) {
case "AUDIO":
ComponentValidator.VALARM_AUDIO.validate(this);
break;
case "DISPLAY":
ComponentValidator.VALARM_DISPLAY.validate(this);
break;
case "EMAIL":
ComponentValidator.VALARM_EMAIL.validate(this);
break;
}
} else {
ComponentValidator.VALARM_ITIP.validate(this);
}

if (recurse) {
Expand Down
Expand Up @@ -32,22 +32,13 @@
package net.fortuna.ical4j.model.component;

import net.fortuna.ical4j.model.*;
import net.fortuna.ical4j.model.parameter.Value;
import net.fortuna.ical4j.model.property.DtEnd;
import net.fortuna.ical4j.model.property.DtStamp;
import net.fortuna.ical4j.model.property.DtStart;
import net.fortuna.ical4j.model.property.Method;
import net.fortuna.ical4j.util.Strings;
import net.fortuna.ical4j.validate.ComponentValidator;
import net.fortuna.ical4j.validate.ValidationException;
import net.fortuna.ical4j.validate.ValidationRule;
import net.fortuna.ical4j.validate.Validator;

import java.io.Serializable;
import java.util.Optional;
import java.util.function.Predicate;

import static net.fortuna.ical4j.model.Property.*;
import static net.fortuna.ical4j.validate.ValidationRule.ValidationType.*;
import net.fortuna.ical4j.validate.component.VAvailabilityValidator;

/**
* $Id$ [Apr 5, 2004]
Expand Down Expand Up @@ -185,68 +176,7 @@ public final String toString() {
*/
@Override
public final void validate(final boolean recurse) throws ValidationException {

validator.validate(this);

// validate that getAvailable() only contains Available components
// final Iterator<Available> iterator = getAvailable().iterator();
// while (iterator.hasNext()) {
// final Component component = (Component) iterator.next();
//
// if (!(component instanceof Available)) {
// throw new ValidationException("Component ["
// + component.getName() + "] may not occur in VAVAILABILITY");
// }
// }

/*
* ; dtstamp / dtstart / uid are required, but MUST NOT occur more than once /
*/

/* If specified, the "DTSTART" and "DTEND" properties in
* "VAVAILABILITY" components and "AVAILABLE" sub-components MUST be
* "DATE-TIME" values specified as either date with UTC time or date
* with local time and a time zone reference.
*/
try {
final DtStart<?> start = getProperties().getRequired(DTSTART);
if (start.getParameters().getFirst(Parameter.VALUE).equals(Optional.of(Value.DATE))) {
throw new ValidationException("Property [" + DTSTART + "] must be a " + Value.DATE_TIME);
}
} catch (ConstraintViolationException cve) {
throw new ValidationException("Missing required property", cve);
}

/*
* ; either 'dtend' or 'duration' may appear in ; a 'eventprop', but 'dtend' and 'duration' ; MUST NOT occur in
* the same 'eventprop' dtend / duration /
*/
Optional<DtEnd<?>> end = getProperties().getFirst(DTEND);
if (end.isPresent()) {
/* Must be DATE_TIME */
if (end.get().getParameters().getFirst(Parameter.VALUE).equals(Optional.of(Value.DATE))) {
throw new ValidationException("Property [" + DTEND + "] must be a " + Value.DATE_TIME);
}

if (getProperties().getFirst(DURATION).isPresent()) {
throw new ValidationException("Only one of Property [" + DTEND + "] or [" + DURATION +
" must appear a VAVAILABILITY");
}
}

/*
* ; the following are optional,
* ; but MUST NOT occur more than once
*
* busytype / created / last-mod /
* organizer / seq / summary / url /
*/

/*
* ; the following are optional, ; and MAY occur more than once
* categories / comment / contact / x-prop
*/

new VAvailabilityValidator().validate(this);
if (recurse) {
validateProperties();
}
Expand Down

0 comments on commit 1ba134a

Please sign in to comment.