/** * Invoke validation on the calendar properties in its current state. * * @throws ValidationException where any of the calendar properties is not in a valid state */ private void validateProperties() throws ValidationException { for (final Property property : getProperties()) { property.validate(); } }
/** * 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(); } }