/**
   * Create user - persist to database
   *
   * @param userEntity
   * @return true if success
   */
  public boolean createUser(UserEntity userEntity) {

    if (!userDao.checkAvailable(userEntity.getUserName())) {
      FacesMessage message =
          constructErrorMessage(
              String.format(
                  getMessageBundle().getString("userExistsMsg"), userEntity.getUserName()),
              null);
      getFacesContext().addMessage(null, message);

      return false;
    }

    try {
      userDao.save(userEntity);
    } catch (Exception e) {
      FacesMessage message = constructFatalMessage(e.getMessage(), null);
      getFacesContext().addMessage(null, message);

      return false;
    }

    return true;
  }
  /** Construct UserDetails instance required by spring security */
  public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {

    UserEntity user = userDao.loadUserByUserName(userName);

    if (user == null) {
      throw new UsernameNotFoundException(
          String.format(getMessageBundle().getString("badCredentials"), userName));
    }
    // Just one simple authority, basically it should be located in the additional table of database
    Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    authorities.add(new SimpleGrantedAuthority("ROLE_USER"));

    User userDetails = new User(user.getUserName(), user.getPassword(), authorities);

    return userDetails;
  }
  /**
   * Check user name availability. UI ajax use.
   *
   * @param ajax event
   * @return
   */
  public boolean checkAvailable(AjaxBehaviorEvent event) {

    InputText inputText = (InputText) event.getSource();
    String value = (String) inputText.getValue();

    boolean available = userDao.checkAvailable(value);

    if (!available) {
      FacesMessage message =
          constructErrorMessage(
              null, String.format(getMessageBundle().getString("userExistsMsg"), value));
      getFacesContext().addMessage(event.getComponent().getClientId(), message);
    } else {
      FacesMessage message =
          constructInfoMessage(
              null, String.format(getMessageBundle().getString("userAvailableMsg"), value));
      getFacesContext().addMessage(event.getComponent().getClientId(), message);
    }

    return available;
  }
 /**
  * Retrieves full User record from database by user name
  *
  * @param userName
  * @return UserEntity
  */
 public UserEntity loadUserEntityByUsername(String userName) {
   return userDao.loadUserByUserName(userName);
 }