// Path: src/main/java/com/yyqian/imagine/po/User.java
// @Entity
// @Table(name = "user")
// public class User extends Base {
// 
//   @Column(name = "username", nullable = false, unique = true)
//   private String username;
// 
//   @Column(name = "password_hash", nullable = false)
//   private String passwordHash;
// 
//   @Column(name = "email", unique = true)
//   private String email;
// 
//   @Column(name = "role", nullable = false)
//   @Enumerated(EnumType.STRING)
//   private Role role = Role.USER;
// 
//   @Lob
//   @Column(name = "about")
//   private String about;
// 
//   @Column(name = "point", nullable = false)
//   private Integer point = 0;
// 
//   public enum Role {
//     USER, ADMIN
//   }
// 
//   public User() {
//   }
// 
//   public User(String username, String passwordHash) {
//     this.username = username;
//     this.passwordHash = passwordHash;
//   }
// 
//   @Override
//   public String toString() {
//     return id.toString();
//   }
// 
//   public String getUsername() {
//     return username;
//   }
// 
//   public String getEmail() {
//     return email;
//   }
// 
//   public Role getRole() {
//     return role;
//   }
// 
//   public String getPasswordHash() {
//     return passwordHash;
//   }
// 
//   public void setPasswordHash(String passwordHash) {
//     this.passwordHash = passwordHash;
//   }
// 
//   public void setRole(Role role) {
//     this.role = role;
//   }
// 
//   public void setUsername(String username) {
//     this.username = username;
//   }
// 
//   public void setEmail(String email) {
//     this.email = email;
//   }
// 
//   public String getAbout() {
//     return about;
//   }
// 
//   public void setAbout(String about) {
//     this.about = about;
//   }
// 
//   public Integer getPoint() {
//     return point;
//   }
// 
//   public void setPoint(Integer point) {
//     this.point = point;
//   }
// }
// 
// Path: src/main/java/com/yyqian/imagine/repository/UserRepository.java
// @Repository
// public interface UserRepository extends JpaRepository<User, Long> {
//   Optional<User> findOneByUsername(String username);
// }
// 
// Path: src/main/java/com/yyqian/imagine/vo/CurrentUser.java
// public class CurrentUser extends org.springframework.security.core.userdetails.User {
// 
//   private User user;
// 
//   public CurrentUser(User user) {
//     super(user.getUsername(), user.getPasswordHash(),
//           AuthorityUtils.createAuthorityList(user.getRole().toString()));
//     this.user = user;
//   }
// 
//   public User getUser() {
//     return user;
//   }
// 
//   public Long getId() {
//     return user.getId();
//   }
// 
//   public User.Role getRole() {
//     return user.getRole();
//   }
// }


import com.yyqian.imagine.po.User;
import com.yyqian.imagine.repository.UserRepository;
import com.yyqian.imagine.vo.CurrentUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
package com.yyqian.imagine.service.impl;


/**
 * Created on 12/15/15.
 *
 * @author Yinyin Qian
 */
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

  private final UserRepository userRepository;

  @Autowired
  public UserDetailsServiceImpl(UserRepository userRepository) {
    this.userRepository = userRepository;
  }

  @Override
// Path: src/main/java/com/yyqian/imagine/po/User.java
// @Entity
// @Table(name = "user")
// public class User extends Base {
// 
//   @Column(name = "username", nullable = false, unique = true)
//   private String username;
// 
//   @Column(name = "password_hash", nullable = false)
//   private String passwordHash;
// 
//   @Column(name = "email", unique = true)
//   private String email;
// 
//   @Column(name = "role", nullable = false)
//   @Enumerated(EnumType.STRING)
//   private Role role = Role.USER;
// 
//   @Lob
//   @Column(name = "about")
//   private String about;
// 
//   @Column(name = "point", nullable = false)
//   private Integer point = 0;
// 
//   public enum Role {
//     USER, ADMIN
//   }
// 
//   public User() {
//   }
// 
//   public User(String username, String passwordHash) {
//     this.username = username;
//     this.passwordHash = passwordHash;
//   }
// 
//   @Override
//   public String toString() {
//     return id.toString();
//   }
// 
//   public String getUsername() {
//     return username;
//   }
// 
//   public String getEmail() {
//     return email;
//   }
// 
//   public Role getRole() {
//     return role;
//   }
// 
//   public String getPasswordHash() {
//     return passwordHash;
//   }
// 
//   public void setPasswordHash(String passwordHash) {
//     this.passwordHash = passwordHash;
//   }
// 
//   public void setRole(Role role) {
//     this.role = role;
//   }
// 
//   public void setUsername(String username) {
//     this.username = username;
//   }
// 
//   public void setEmail(String email) {
//     this.email = email;
//   }
// 
//   public String getAbout() {
//     return about;
//   }
// 
//   public void setAbout(String about) {
//     this.about = about;
//   }
// 
//   public Integer getPoint() {
//     return point;
//   }
// 
//   public void setPoint(Integer point) {
//     this.point = point;
//   }
// }
// 
// Path: src/main/java/com/yyqian/imagine/repository/UserRepository.java
// @Repository
// public interface UserRepository extends JpaRepository<User, Long> {
//   Optional<User> findOneByUsername(String username);
// }
// 
// Path: src/main/java/com/yyqian/imagine/vo/CurrentUser.java
// public class CurrentUser extends org.springframework.security.core.userdetails.User {
// 
//   private User user;
// 
//   public CurrentUser(User user) {
//     super(user.getUsername(), user.getPasswordHash(),
//           AuthorityUtils.createAuthorityList(user.getRole().toString()));
//     this.user = user;
//   }
// 
//   public User getUser() {
//     return user;
//   }
// 
//   public Long getId() {
//     return user.getId();
//   }
// 
//   public User.Role getRole() {
//     return user.getRole();
//   }
// }


// Path: src/main/java/com/yyqian/imagine/service/impl/UserDetailsServiceImpl.java
import com.yyqian.imagine.po.User;
import com.yyqian.imagine.repository.UserRepository;
import com.yyqian.imagine.vo.CurrentUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

package com.yyqian.imagine.service.impl;


/**
 * Created on 12/15/15.
 *
 * @author Yinyin Qian
 */
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

  private final UserRepository userRepository;

  @Autowired
  public UserDetailsServiceImpl(UserRepository userRepository) {
    this.userRepository = userRepository;
  }

  @Override
  public CurrentUser loadUserByUsername(String username) throws UsernameNotFoundException {