package hudson.plugins.sfee; import hudson.plugins.sfee.Computable; import hudson.plugins.sfee.Memoizer; import org.acegisecurity.userdetails.UserDetails; import org.acegisecurity.userdetails.UserDetailsService; import org.acegisecurity.userdetails.UsernameNotFoundException; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataRetrievalFailureException; public class CachingUserDetailsService implements UserDetailsService, Computable<String, UserDetails> { private Memoizer<String, UserDetails> memoizer; private UserDetailsService service; public CachingUserDetailsService(UserDetailsService service) { this.service = service; memoizer = new Memoizer<String, UserDetails>(this); } public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { try { return memoizer.compute(username); } catch (InterruptedException e) { throw new DataRetrievalFailureException("Interrupted", e); } } public UserDetails compute(String arg) throws InterruptedException { return service.loadUserByUsername(arg); } }