/** * Constructor. * * @param aString a string representation of a day list */ public WeekDayList(final String aString) { final boolean outlookCompatibility = CompatibilityHints.isHintEnabled(CompatibilityHints.KEY_OUTLOOK_COMPATIBILITY); final StringTokenizer t = new StringTokenizer(aString, ","); while (t.hasMoreTokens()) { if (outlookCompatibility) { add(new WeekDay(t.nextToken().replaceAll(" ", ""))); } else { add(new WeekDay(t.nextToken())); } } }
/* * (non-Javadoc) * @see net.fortuna.ical4j.model.Component#validate(boolean) */ public final void validate(final boolean recurse) throws ValidationException { if (!CompatibilityHints.isHintEnabled(CompatibilityHints.KEY_RELAXED_VALIDATION)) { // From "4.8.4.7 Unique Identifier": // Conformance: The property MUST be specified in the "VEVENT", "VTODO", // "VJOURNAL" or "VFREEBUSY" calendar components. PropertyValidator.getInstance().assertOne(Property.UID, getProperties()); // From "4.8.7.2 Date/Time Stamp": // Conformance: This property MUST be included in the "VEVENT", "VTODO", // "VJOURNAL" or "VFREEBUSY" calendar components. PropertyValidator.getInstance().assertOne(Property.DTSTAMP, getProperties()); } /* * ; the following are optional, ; but MUST NOT occur more than once class / created / description / dtstart / * dtstamp / last-mod / organizer / recurid / seq / status / summary / uid / url / */ PropertyValidator.getInstance().assertOneOrLess(Property.CLASS, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.CREATED, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.DESCRIPTION, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.DTSTART, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.DTSTAMP, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.LAST_MODIFIED, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.ORGANIZER, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.RECURRENCE_ID, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.SEQUENCE, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.STATUS, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.SUMMARY, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.UID, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.URL, getProperties()); Status status = (Status) getProperty(Property.STATUS); if (status != null && !Status.VJOURNAL_DRAFT.equals(status) && !Status.VJOURNAL_FINAL.equals(status) && !Status.VJOURNAL_CANCELLED.equals(status)) { throw new ValidationException( "Status property [" + status.toString() + "] may not occur in VJOURNAL"); } /* * ; the following are optional, ; and MAY occur more than once attach / attendee / categories / comment / * contact / exdate / exrule / related / rdate / rrule / rstatus / x-prop */ if (recurse) { validateProperties(); } }
/** * Perform validation on the calendar in its current state. * * @param recurse indicates whether to validate the calendar's properties and components * @throws ValidationException where the calendar is not in a valid state */ public void validate(final boolean recurse) throws ValidationException { // 'prodid' and 'version' are both REQUIRED, // but MUST NOT occur more than once PropertyValidator.getInstance().assertOne(Property.PRODID, properties); PropertyValidator.getInstance().assertOne(Property.VERSION, properties); if (!CompatibilityHints.isHintEnabled(CompatibilityHints.KEY_RELAXED_VALIDATION)) { // require VERSION:2.0 for RFC2445.. if (!Version.VERSION_2_0.equals(getProperty(Property.VERSION))) { throw new ValidationException( "Unsupported Version: " + getProperty(Property.VERSION).getValue()); } } // 'calscale' and 'method' are optional, // but MUST NOT occur more than once PropertyValidator.getInstance().assertOneOrLess(Property.CALSCALE, properties); PropertyValidator.getInstance().assertOneOrLess(Property.METHOD, properties); // must contain at least one component if (getComponents().isEmpty()) { throw new ValidationException("Calendar must contain at least one component"); } // validate properties.. for (final Property property : getProperties()) { if (!(property instanceof XProperty) && !property.isCalendarProperty()) { throw new ValidationException("Invalid property: " + property.getName()); } } // if (!CompatibilityHints.isHintEnabled(CompatibilityHints.KEY_RELAXED_VALIDATION)) { // validate method.. final Method method = (Method) getProperty(Property.METHOD); if (Method.PUBLISH.equals(method)) { if (getComponent(Component.VEVENT) != null) { ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); if (!CompatibilityHints.isHintEnabled(CompatibilityHints.KEY_RELAXED_VALIDATION)) { ComponentValidator.assertNone(Component.VTODO, getComponents()); } } else if (getComponent(Component.VFREEBUSY) != null) { ComponentValidator.assertNone(Component.VTODO, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); ComponentValidator.assertNone(Component.VTIMEZONE, getComponents()); ComponentValidator.assertNone(Component.VALARM, getComponents()); } else if (getComponent(Component.VTODO) != null) { // ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); // ComponentValidator.assertNone(Component.VEVENT, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); } // else if (getComponent(Component.VJOURNAL) != null) { // ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); // ComponentValidator.assertNone(Component.VEVENT, getComponents()); // ComponentValidator.assertNone(Component.VTODO, getComponents()); // } } else if (Method.REQUEST.equals(getProperty(Property.METHOD))) { if (getComponent(Component.VEVENT) != null) { ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); ComponentValidator.assertNone(Component.VTODO, getComponents()); } else if (getComponent(Component.VFREEBUSY) != null) { ComponentValidator.assertNone(Component.VTODO, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); ComponentValidator.assertNone(Component.VTIMEZONE, getComponents()); ComponentValidator.assertNone(Component.VALARM, getComponents()); } else if (getComponent(Component.VTODO) != null) { // ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); // ComponentValidator.assertNone(Component.VEVENT, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); } } else if (Method.REPLY.equals(getProperty(Property.METHOD))) { if (getComponent(Component.VEVENT) != null) { ComponentValidator.assertOneOrLess(Component.VTIMEZONE, getComponents()); ComponentValidator.assertNone(Component.VALARM, getComponents()); ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); ComponentValidator.assertNone(Component.VTODO, getComponents()); } else if (getComponent(Component.VFREEBUSY) != null) { ComponentValidator.assertNone(Component.VTODO, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); ComponentValidator.assertNone(Component.VTIMEZONE, getComponents()); ComponentValidator.assertNone(Component.VALARM, getComponents()); } else if (getComponent(Component.VTODO) != null) { ComponentValidator.assertOneOrLess(Component.VTIMEZONE, getComponents()); ComponentValidator.assertNone(Component.VALARM, getComponents()); // ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); // ComponentValidator.assertNone(Component.VEVENT, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); } } else if (Method.ADD.equals(getProperty(Property.METHOD))) { if (getComponent(Component.VEVENT) != null) { ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); ComponentValidator.assertNone(Component.VTODO, getComponents()); } else if (getComponent(Component.VTODO) != null) { ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); // ComponentValidator.assertNone(Component.VEVENT, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); } else if (getComponent(Component.VJOURNAL) != null) { ComponentValidator.assertOneOrLess(Component.VTIMEZONE, getComponents()); ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); // ComponentValidator.assertNone(Component.VEVENT, getComponents()); // ComponentValidator.assertNone(Component.VTODO, getComponents()); } } else if (Method.CANCEL.equals(getProperty(Property.METHOD))) { if (getComponent(Component.VEVENT) != null) { ComponentValidator.assertNone(Component.VALARM, getComponents()); ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); ComponentValidator.assertNone(Component.VTODO, getComponents()); } else if (getComponent(Component.VTODO) != null) { ComponentValidator.assertOneOrLess(Component.VTIMEZONE, getComponents()); ComponentValidator.assertNone(Component.VALARM, getComponents()); ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); // ComponentValidator.assertNone(Component.VEVENT, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); } else if (getComponent(Component.VJOURNAL) != null) { ComponentValidator.assertNone(Component.VALARM, getComponents()); ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); // ComponentValidator.assertNone(Component.VEVENT, getComponents()); // ComponentValidator.assertNone(Component.VTODO, getComponents()); } } else if (Method.REFRESH.equals(getProperty(Property.METHOD))) { if (getComponent(Component.VEVENT) != null) { ComponentValidator.assertNone(Component.VALARM, getComponents()); ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); ComponentValidator.assertNone(Component.VTODO, getComponents()); } else if (getComponent(Component.VTODO) != null) { ComponentValidator.assertNone(Component.VALARM, getComponents()); ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); // ComponentValidator.assertNone(Component.VEVENT, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); ComponentValidator.assertNone(Component.VTIMEZONE, getComponents()); } } else if (Method.COUNTER.equals(getProperty(Property.METHOD))) { if (getComponent(Component.VEVENT) != null) { ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); ComponentValidator.assertNone(Component.VTODO, getComponents()); } else if (getComponent(Component.VTODO) != null) { ComponentValidator.assertOneOrLess(Component.VTIMEZONE, getComponents()); ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); // ComponentValidator.assertNone(Component.VEVENT, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); } } else if (Method.DECLINE_COUNTER.equals(getProperty(Property.METHOD))) { if (getComponent(Component.VEVENT) != null) { ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); ComponentValidator.assertNone(Component.VTODO, getComponents()); ComponentValidator.assertNone(Component.VTIMEZONE, getComponents()); ComponentValidator.assertNone(Component.VALARM, getComponents()); } else if (getComponent(Component.VTODO) != null) { ComponentValidator.assertNone(Component.VALARM, getComponents()); ComponentValidator.assertNone(Component.VFREEBUSY, getComponents()); // ComponentValidator.assertNone(Component.VEVENT, getComponents()); ComponentValidator.assertNone(Component.VJOURNAL, getComponents()); } } // } // perform ITIP validation on components.. if (method != null) { for (CalendarComponent component : getComponents()) { component.validate(method); } } if (recurse) { validateProperties(); validateComponents(); } }
/* * (non-Javadoc) * @see net.fortuna.ical4j.model.Component#validate(boolean) */ public final void validate(final boolean recurse) throws ValidationException { // validate that getAlarms() only contains VAlarm components Iterator iterator = getAlarms().iterator(); while (iterator.hasNext()) { Component component = (Component) iterator.next(); if (!(component instanceof VAlarm)) { throw new ValidationException( "Component [" + component.getName() + "] may not occur in VTODO"); } ((VAlarm) component).validate(recurse); } if (!CompatibilityHints.isHintEnabled(CompatibilityHints.KEY_RELAXED_VALIDATION)) { // From "4.8.4.7 Unique Identifier": // Conformance: The property MUST be specified in the "VEVENT", "VTODO", // "VJOURNAL" or "VFREEBUSY" calendar components. PropertyValidator.getInstance().assertOne(Property.UID, getProperties()); // From "4.8.7.2 Date/Time Stamp": // Conformance: This property MUST be included in the "VEVENT", "VTODO", // "VJOURNAL" or "VFREEBUSY" calendar components. PropertyValidator.getInstance().assertOne(Property.DTSTAMP, getProperties()); } /* * ; the following are optional, ; but MUST NOT occur more than once class / completed / created / description / * dtstamp / dtstart / geo / last-mod / location / organizer / percent / priority / recurid / seq / status / * summary / uid / url / */ PropertyValidator.getInstance().assertOneOrLess(Property.CLASS, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.COMPLETED, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.CREATED, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.DESCRIPTION, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.DTSTAMP, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.DTSTART, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.GEO, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.LAST_MODIFIED, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.LOCATION, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.ORGANIZER, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.PERCENT_COMPLETE, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.PRIORITY, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.RECURRENCE_ID, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.SEQUENCE, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.STATUS, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.SUMMARY, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.UID, getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.URL, getProperties()); Status status = (Status) getProperty(Property.STATUS); if (status != null && !Status.VTODO_NEEDS_ACTION.equals(status) && !Status.VTODO_COMPLETED.equals(status) && !Status.VTODO_IN_PROCESS.equals(status) && !Status.VTODO_CANCELLED.equals(status)) { throw new ValidationException( "Status property [" + status.toString() + "] may not occur in VTODO"); } /* * ; either 'due' or 'duration' may appear in ; a 'todoprop', but 'due' and 'duration' ; MUST NOT occur in the * same 'todoprop' due / duration / */ try { PropertyValidator.getInstance().assertNone(Property.DUE, getProperties()); } catch (ValidationException ve) { PropertyValidator.getInstance().assertNone(Property.DURATION, getProperties()); } /* * ; the following are optional, ; and MAY occur more than once attach / attendee / categories / comment / * contact / exdate / exrule / rstatus / related / resources / rdate / rrule / x-prop */ if (recurse) { validateProperties(); } }