public void testMessageInterpolation() {
    // get validators
    List validatorList =
        annotationActionValidatorManager.getValidators(
            AnnotatedTestBean.class, "beanMessageBundle");
    assertEquals(3, validatorList.size());

    try {
      AnnotatedTestBean bean = new AnnotatedTestBean();
      bean.setName("foo");
      bean.setCount(150);

      ValidatorContext context = new GenericValidatorContext(bean);
      annotationActionValidatorManager.validate(bean, "beanMessageBundle", context);
      assertTrue(context.hasErrors());
      assertTrue(context.hasFieldErrors());

      List<String> l = context.getFieldErrors().get("count");
      assertNotNull(l);
      assertEquals(1, l.size());
      assertEquals("Count must be between 1 and 100, current value is 150.", l.get(0));
    } catch (ValidationException ex) {
      ex.printStackTrace();
      fail("Validation error: " + ex.getMessage());
    }
  }
  public void testActionLevelShortCircuit() throws Exception {

    List validatorList = annotationActionValidatorManager.getValidators(AnnotationUser.class, null);
    assertEquals(10, validatorList.size());

    AnnotationUser user = new AnnotationUser();
    // all fields will trigger error, but sc of action-level, cause it to not appear
    user.setName(null);

    user.setEmail("rainerh(at)example.com");
    user.setEmail("rainer_h(at)example.com");

    ValidatorContext context = new GenericValidatorContext(user);
    annotationActionValidatorManager.validate(user, null, context);

    // check field level errors
    // shouldn't have any because action error prevents validation of anything else
    List l = (List) context.getFieldErrors().get("email2");
    assertNull(l);

    // check action errors
    assertTrue(context.hasActionErrors());
    l = (List) context.getActionErrors();
    assertNotNull(l);
    // we only get one, because AnnotationUserMarker-validation.xml action-level validator
    // already sc it   :-)
    assertEquals(1, l.size());
    assertEquals("Email not the same as email2", l.get(0));
  }
 public void execute(ValidatorContext ctx) {
   logValidatorNames();
   for (Validator validator : validators) {
     logger.debug("starting {}", validator.getClass().getSimpleName());
     try {
       validator.validate(ctx);
     } catch (RuntimeException e) {
       logger.error(
           "validator "
               + validator.getClass().getSimpleName()
               + " ended with unexpected exception!",
           e);
       ctx.addError(null, ctx.getValidatedRepository(), e);
     }
   }
 }
 @Override
 public void validate(ValidatorContext context) {
   DataElement element = context.dataElement();
   DataSchema schema = element.getSchema();
   if (schema != null) {
     validateSchema(context, schema);
   }
   DataElement parentElement = element.getParent();
   if (parentElement != null) {
     DataSchema parentSchema = parentElement.getSchema();
     // check if the value belongs to a field in a record
     // if it belongs to a field, check if the field has
     // validators.
     if (parentSchema != null && parentSchema.getType() == DataSchema.Type.RECORD) {
       Object name = element.getName();
       if (name.getClass() == String.class) {
         RecordDataSchema recordDataSchema = (RecordDataSchema) parentSchema;
         RecordDataSchema.Field field = recordDataSchema.getField((String) name);
         if (field != null) {
           getAndInvokeValidatorList(context, field);
         }
       }
     }
   }
 }
  public void testShortCircuitNoErrors() {
    // get validators
    List validatorList = annotationActionValidatorManager.getValidators(AnnotationUser.class, null);
    assertEquals(10, validatorList.size());

    try {
      AnnotationUser user = new AnnotationUser();
      user.setName("Mark");
      user.setEmail("*****@*****.**");
      user.setEmail2("*****@*****.**");

      ValidatorContext context = new GenericValidatorContext(user);
      annotationActionValidatorManager.validate(user, null, context);
      assertFalse(context.hasErrors());
    } catch (ValidationException ex) {
      ex.printStackTrace();
      fail("Validation error: " + ex.getMessage());
    }
  }
 private void getAndInvokeValidatorList(ValidatorContext ctx, Object key) {
   List<Validator> validatorList = _cache.get(key);
   if (validatorList == null) {
     // this means schema or field to be validated has not been cached.
     ctx.addResult(
         new Message(
             ctx.dataElement().path(),
             "validation skipped, %1$s have not been initialized for use by %2$s",
             key,
             getClass().getSimpleName()));
   } else if (validatorList != NO_VALIDATORS) {
     for (Validator validator : validatorList) {
       if (_debugMode) {
         ctx.addResult(
             new Message(ctx.dataElement().path(), false, "validating with %1$s", validator));
       }
       validator.validate(ctx);
     }
   }
 }
  public void testSkipAllActionLevelShortCircuit2() {
    // get validators
    List validatorList = annotationActionValidatorManager.getValidators(AnnotationUser.class, null);
    assertEquals(10, validatorList.size());

    try {
      AnnotationUser user = new AnnotationUser();
      user.setName("Mark");
      // * mark both email to starts with mark to get pass the action-level validator,
      // so we could concentrate on testing the field-level validators
      // (AnnotationUser-validation.xml)
      // * make both email the same to pass the action-level validator at
      // AnnotationUserMarker-validation.xml
      user.setEmail("*****@*****.**");
      user.setEmail2("*****@*****.**");

      ValidatorContext context = new GenericValidatorContext(user);
      annotationActionValidatorManager.validate(user, null, context);
      assertTrue(context.hasFieldErrors());

      // check field errors
      // we have an error in this field level, email does not ends with mycompany.com
      List l = (List) context.getFieldErrors().get("email");
      assertNotNull(l);
      assertEquals(1, l.size()); // because email-field-val is short-circuit
      assertEquals("Email not from the right company.", l.get(0));

      // check action errors
      l = (List) context.getActionErrors();
      assertFalse(context.hasActionErrors());
      assertEquals(0, l.size());

    } catch (ValidationException ex) {
      ex.printStackTrace();
      fail("Validation error: " + ex.getMessage());
    }
  }
  public void testSkipUserMarkerActionLevelShortCircuit() {
    // get validators
    List validatorList = annotationActionValidatorManager.getValidators(AnnotationUser.class, null);
    assertEquals(10, validatorList.size());

    try {
      AnnotationUser user = new AnnotationUser();
      user.setName("Mark");
      user.setEmail("bad_email");
      user.setEmail2("bad_email");

      ValidatorContext context = new GenericValidatorContext(user);
      annotationActionValidatorManager.validate(user, null, context);
      assertTrue(context.hasFieldErrors());

      // check field errors
      List<String> l = context.getFieldErrors().get("email");
      assertNotNull(l);
      assertEquals(1, l.size());
      assertEquals("Not a valid e-mail.", l.get(0));
      l = context.getFieldErrors().get("email2");
      assertNotNull(l);
      assertEquals(2, l.size());
      assertEquals("Not a valid e-mail2.", l.get(0));
      assertEquals("Email2 not from the right company.", l.get(1));

      // check action errors
      assertTrue(context.hasActionErrors());
      l = (List<String>) context.getActionErrors();
      assertNotNull(l);
      assertEquals(2, l.size()); // both expression test failed see AnnotationUser-validation.xml
      assertEquals("Email does not start with mark", l.get(0));
    } catch (ValidationException ex) {
      ex.printStackTrace();
      fail("Validation error: " + ex.getMessage());
    }
  }