@Override
  public void handle(Context context, FaultMessage emsg, TideFaultEvent faultEvent) {
    Object[] invalidValues =
        emsg.getExtended() != null ? (Object[]) emsg.getExtended().get("invalidValues") : null;
    if (invalidValues != null) {
      Set<ConstraintViolation<?>> constraintViolations = new HashSet<ConstraintViolation<?>>();

      for (Object v : invalidValues) {
        InvalidValue iv = (InvalidValue) v;
        Object rootBean = context.getEntityManager().getCachedObject(iv.getRootBean(), true);
        Object leafBean = null;
        if (iv.getBean() != null) {
          leafBean = context.getEntityManager().getCachedObject(iv.getBean(), true);
          if (leafBean == null) {
            // Embedded ?
            Object bean = rootBean;
            String[] path = iv.getPath().split("\\.");
            for (int i = 0; i < path.length - 1; i++)
              bean = context.getDataManager().getPropertyValue(bean, path[i]);
            leafBean = bean;
          }
        }

        ServerConstraintViolation violation = new ServerConstraintViolation(iv, rootBean, leafBean);
        constraintViolations.add(violation);
      }

      NotifyingValidatorFactory notifyingValidatorFactory =
          context.byType(NotifyingValidatorFactory.class);
      if (notifyingValidatorFactory == null)
        throw new RuntimeException(
            "No suitable validator factory defined, cannot process validation events");

      notifyingValidatorFactory
          .getValidator()
          .notifyConstraintViolations(null, constraintViolations);
    }
  }
 @Override
 public boolean accepts(FaultMessage emsg) {
   return emsg.getCode().equals(Code.VALIDATION_FAILED);
 }