docs: public void validate(final FacesContext context, final UIComponent component, final Object value)
              throws ValidatorException
      {
          if (context == null)
          {
              throw new NullPointerException("context");
          }
          if (component == null)
          {
              throw new NullPointerException("component");
          }
  
          ValueExpression valueExpression = component.getValueExpression("value");
          if (valueExpression == null)
          {
              log.warning("cannot validate component with empty value: " 
                      + component.getClientId(context));
              return;
          }
  
          // Obtain a reference to the to-be-validated object and the property name.
          _ValueReferenceWrapper reference = getValueReference(valueExpression, context);
          if (reference == null)
          {
              return;
          }
          Object base = reference.getBase();
          if (base == null)
          {
              return;
          }
          
          Class<?> valueBaseClass = base.getClass();
          if (valueBaseClass == null)
          {
              return;
          }
          
          Object referenceProperty = reference.getProperty();
          if (!(referenceProperty instanceof String))
          {
              // if the property is not a String, the ValueReference does not
              // point to a bean method, but e.g. to a value in a Map, thus we 
              // can exit bean validation here
              return;
          }
          String valueProperty = (String) referenceProperty;
  
          // Initialize Bean Validation.
          ValidatorFactory validatorFactory = createValidatorFactory(context);
          javax.validation.Validator validator = createValidator(validatorFactory, context);
          BeanDescriptor beanDescriptor = validator.getConstraintsForClass(valueBaseClass);
          if (!beanDescriptor.isBeanConstrained())
          {
              return;
          }
          
          // Note that validationGroupsArray was initialized when createValidator was called
          Class[] validationGroupsArray = this.validationGroupsArray;
  
          // Delegate to Bean Validation.
          Set constraintViolations = validator.validateValue(valueBaseClass, valueProperty, value, validationGroupsArray);
          if (!constraintViolations.isEmpty())
          {
              Set<FacesMessage> messages = new LinkedHashSet<FacesMessage>(constraintViolations.size());
              for (Object violation: constraintViolations)
              {
                  ConstraintViolation constraintViolation = (ConstraintViolation) violation;
                  String message = constraintViolation.getMessage();
                  Object[] args = new Object[]{ message, _MessageUtils.getLabel(context, component) };
                  FacesMessage msg = _MessageUtils.getErrorMessage(context, MESSAGE_ID, args);
                  messages.add(msg);
              }
              throw new ValidatorException(messages);
          }
      }