code: public final void validate(final boolean recurse)
              throws ValidationException {
  
          /*
           * ; 'action' and 'trigger' are both REQUIRED, ; but MUST NOT occur more than once action / trigger /
           */
          PropertyValidator.getInstance().assertOne(Property.ACTION, getProperties());
          PropertyValidator.getInstance().assertOne(Property.TRIGGER, getProperties());
  
          /*
           * ; 'duration' and 'repeat' are both optional, ; and MUST NOT occur more than once each, ; but if one occurs,
           * so MUST the other duration / repeat /
           */
          PropertyValidator.getInstance().assertOneOrLess(Property.DURATION, getProperties());
          PropertyValidator.getInstance().assertOneOrLess(Property.REPEAT, getProperties());
  
          try {
              PropertyValidator.getInstance().assertNone(Property.DURATION, getProperties());
              PropertyValidator.getInstance().assertNone(Property.REPEAT, getProperties());
          }
          catch (ValidationException ve) {
              PropertyValidator.getInstance().assertOne(Property.DURATION, getProperties());
              PropertyValidator.getInstance().assertOne(Property.REPEAT, getProperties());
          }
          
          /*
           * ; the following is optional, ; and MAY occur more than once x-prop
           */
          
          final Validator actionValidator = actionValidators.get(getAction());
          if (actionValidator != null) {
              actionValidator.validate(this);
          }
          
          if (recurse) {
              validateProperties();
          }
      }
docs: {@inheritDoc}