@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);
         }
       }
     }
   }
 }
 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);
     }
   }
 }