/**
   * Load a User for ACEGI given its user name
   *
   * @param username user name
   * @throws org.acegisecurity.userdetails.UsernameNotFoundException
   * @throws org.springframework.dao.DataAccessException
   * @return the user object description as specified by ACEGI
   */
  public UserDetails loadUserByUsername(String username)
      throws UsernameNotFoundException, DataAccessException {
    try {
      Version db = Version.getDatabaseVersion();
      Version code = Version.getApplicationVersion();

      if (db.compareTo(code, Version.MINOR) == 0) {
        log.info("loadUserByUsername - getting user " + username + " using Hibernate");
        User user = userDAO.searchByLogin(username);

        GrantedAuthority[] auths = userRolesService.getAuthorities(user);

        if (log.isDebugEnabled()) {
          StringBuilder sb = new StringBuilder();
          for (GrantedAuthority auth : auths) {
            sb.append(auth);
            sb.append(" ");
          }
          log.debug("loadUserByUsername - user roles: " + sb);
        }

        final Principal principal = new Principal(user, auths);

        // setting user preferred Locale
        final SettingSearch s = new SettingSearch();
        s.setName(SettingPath.GENERAL_PREFERRED_LOCALE);
        s.setOwnerId(user.getId());
        final List<Setting> vals = settings.search(s, null);

        final Setting val = (vals != null && vals.size() > 0) ? vals.get(0) : null;

        if (val != null) {
          final Locale local = new Locale(val.getValue());
          principal.setLocale(local);
        }

        return principal;
      } else {
        log.info("loadUserByUsername - getting user " + username + " using JDBC");
        return jdbcSearchByLogin(username);
      }
    } catch (SecException e) {
      log.warn("loadUserByUsername - exception", e);
      throw new DataRetrievalFailureException("Error getting roles for user: "******"loadUserByUsername - exception", e);
      throw new DataIntegrityViolationException("Inconsistent user name: " + username, e);
    } catch (DataNotFoundException e) {
      log.warn("loadUserByUsername - exception", e);
      throw new UsernameNotFoundException("User not found: " + username, e);
    } catch (DataAccException e) {
      log.warn("loadUserByUsername - exception", e);
      throw new DataRetrievalFailureException("Error getting user: "******"loadUserByUsername - exception", e);
      throw new DataRetrievalFailureException("Error getting user: " + username, e);
    }
  }