@PreAuthorize("hasRole('" + Entitlement.SECURITY_QUESTION_UPDATE + "')")
  public SecurityQuestionTO update(final SecurityQuestionTO securityQuestionTO) {
    SecurityQuestion securityQuestion = securityQuestionDAO.find(securityQuestionTO.getKey());
    if (securityQuestion == null) {
      LOG.error("Could not find security question '" + securityQuestionTO.getKey() + "'");

      throw new NotFoundException(String.valueOf(securityQuestionTO.getKey()));
    }

    binder.update(securityQuestion, securityQuestionTO);
    securityQuestion = securityQuestionDAO.save(securityQuestion);

    return binder.getSecurityQuestionTO(securityQuestion);
  }
  @Override
  protected SecurityQuestionTO resolveReference(final Method method, final Object... args)
      throws UnresolvedReferenceException {

    Long key = null;

    if (ArrayUtils.isNotEmpty(args)) {
      for (int i = 0; key == null && i < args.length; i++) {
        if (args[i] instanceof Long) {
          key = (Long) args[i];
        } else if (args[i] instanceof SecurityQuestionTO) {
          key = ((SecurityQuestionTO) args[i]).getKey();
        }
      }
    }

    if ((key != null) && !key.equals(0L)) {
      try {
        return binder.getSecurityQuestionTO(securityQuestionDAO.find(key));
      } catch (Throwable ignore) {
        LOG.debug("Unresolved reference", ignore);
        throw new UnresolvedReferenceException(ignore);
      }
    }

    throw new UnresolvedReferenceException();
  }
  @PreAuthorize("isAuthenticated()")
  public SecurityQuestionTO read(final Long securityQuestionId) {
    SecurityQuestion securityQuestion = securityQuestionDAO.find(securityQuestionId);
    if (securityQuestion == null) {
      LOG.error("Could not find security question '" + securityQuestionId + "'");

      throw new NotFoundException(String.valueOf(securityQuestionId));
    }

    return binder.getSecurityQuestionTO(securityQuestion);
  }
  @PreAuthorize("hasRole('" + Entitlement.SECURITY_QUESTION_DELETE + "')")
  public SecurityQuestionTO delete(final Long securityQuestionId) {
    SecurityQuestion securityQuestion = securityQuestionDAO.find(securityQuestionId);
    if (securityQuestion == null) {
      LOG.error("Could not find security question '" + securityQuestionId + "'");

      throw new NotFoundException(String.valueOf(securityQuestionId));
    }

    SecurityQuestionTO deleted = binder.getSecurityQuestionTO(securityQuestion);
    securityQuestionDAO.delete(securityQuestionId);
    return deleted;
  }
  @PreAuthorize("isAnonymous() or hasRole('" + Entitlement.ANONYMOUS + "')")
  public SecurityQuestionTO read(final String username) {
    if (username == null) {
      throw new NotFoundException("Null username");
    }
    User user = userDAO.find(username);
    if (user == null) {
      throw new NotFoundException("User " + username);
    }

    if (user.getSecurityQuestion() == null) {
      LOG.error("Could not find security question for user '" + username + "'");

      throw new NotFoundException("Security question for user " + username);
    }

    return binder.getSecurityQuestionTO(user.getSecurityQuestion());
  }
 @PreAuthorize("hasRole('" + Entitlement.SECURITY_QUESTION_CREATE + "')")
 public SecurityQuestionTO create(final SecurityQuestionTO securityQuestionTO) {
   return binder.getSecurityQuestionTO(
       securityQuestionDAO.save(binder.create(securityQuestionTO)));
 }