replaced CineastsUserDetailsService with a custom UserRepository-Implementation

This commit is contained in:
Michael Hunger
2011-11-08 15:10:04 +01:00
parent 02f7c4d533
commit a279b7d4a2
12 changed files with 38 additions and 70 deletions

View File

@@ -1,7 +1,7 @@
package org.neo4j.cineasts.controller;
import org.neo4j.cineasts.service.CineastsUserDetailsService;
import org.neo4j.cineasts.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -21,7 +21,7 @@ public class AuthController {
private final static Logger logger = LoggerFactory.getLogger(AuthController.class);
@Autowired
CineastsUserDetailsService userDetailsService;
UserRepository userRepository;
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(@RequestParam(value = "login_error", required = false) boolean error, Model model) {
logger.debug("Received request to show login page, error "+error);
@@ -39,7 +39,7 @@ public class AuthController {
Model model) {
try {
userDetailsService.register(login,name,password);
userRepository.register(login,name,password);
return "forward:/user/"+login;
} catch(Exception e) {
model.addAttribute("j_username",login);

View File

@@ -7,7 +7,6 @@ import org.neo4j.cineasts.domain.User;
import org.neo4j.cineasts.repository.MovieRepository;
import org.neo4j.cineasts.repository.PersonRepository;
import org.neo4j.cineasts.repository.UserRepository;
import org.neo4j.cineasts.service.CineastsUserDetailsService;
import org.neo4j.cineasts.service.DatabasePopulator;
import org.neo4j.helpers.collection.IteratorUtil;
import org.slf4j.Logger;
@@ -37,8 +36,6 @@ public class MovieController {
@Autowired
private UserRepository userRepository;
@Autowired
private CineastsUserDetailsService userDetailsService;
@Autowired
Neo4jOperations template;
@Autowired
private DatabasePopulator populator;
@@ -76,17 +73,17 @@ public class MovieController {
@RequestMapping(value = "/movies/{movieId}", method = RequestMethod.POST, headers = "Accept=text/html")
public String updateMovie(Model model, @PathVariable String movieId, @RequestParam(value = "rated",required = false) Integer stars, @RequestParam(value = "comment",required = false) String comment) {
Movie movie = movieRepository.findById(movieId);
User user = userDetailsService.getUserFromSession();
User user = userRepository.getUserFromSession();
if (user != null && movie != null) {
int stars1 = stars==null ? -1 : stars;
String comment1 = comment!=null ? comment.trim() : null;
userDetailsService.rate(movie, user, stars1, comment1);
userRepository.rate(movie, user, stars1, comment1);
}
return singleMovieView(model,movieId);
}
private User addUser(Model model) {
User user = userDetailsService.getUserFromSession();
User user = userRepository.getUserFromSession();
model.addAttribute("user", user);
return user;
}

View File

@@ -3,7 +3,7 @@ package org.neo4j.cineasts.controller;
import org.neo4j.cineasts.domain.User;
import org.neo4j.cineasts.repository.MovieRepository;
import org.neo4j.cineasts.service.CineastsUserDetailsService;
import org.neo4j.cineasts.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -19,7 +19,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class UserController {
@Autowired CineastsUserDetailsService userDetailsService;
@Autowired
UserRepository userRepository;
@Autowired
MovieRepository movieRepository;
@@ -27,7 +28,7 @@ public class UserController {
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String profile(Model model) {
final User user = userDetailsService.getUserFromSession();
final User user = userRepository.getUserFromSession();
model.addAttribute("user", user);
if (user!=null) {
model.addAttribute("recommendations", movieRepository.getRecommendations(user));
@@ -37,14 +38,14 @@ public class UserController {
@RequestMapping(value = "/user/{login}/friends", method = RequestMethod.POST)
public String addFriend(Model model, @PathVariable("login") String login) {
userDetailsService.addFriend(login);
userRepository.addFriend(login, userRepository.getUserFromSession());
return "forward:/user/"+login;
}
@RequestMapping(value = "/user/{login}")
public String publicProfile(Model model, @PathVariable("login") String login) {
User profiled = userDetailsService.findUser(login);
User user = userDetailsService.getUserFromSession();
User profiled = userRepository.findByLogin(login);
User user = userRepository.getUserFromSession();
return publicProfile(model, profiled, user);
}

View File

@@ -1,10 +1,10 @@
package org.neo4j.cineasts.service;
package org.neo4j.cineasts.repository;
import org.neo4j.cineasts.domain.Movie;
import org.neo4j.cineasts.domain.Rating;
import org.neo4j.cineasts.domain.User;
import org.neo4j.cineasts.service.CineastsUserDetails;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.transaction.annotation.Transactional;
@@ -15,9 +15,7 @@ import org.springframework.transaction.annotation.Transactional;
*/
public interface CineastsUserDetailsService extends UserDetailsService {
@Override
UserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException;
User findUser(String login);
CineastsUserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException;
User getUserFromSession();
@@ -28,5 +26,5 @@ public interface CineastsUserDetailsService extends UserDetailsService {
User register(String login, String name, String password);
@Transactional
void addFriend(String login);
void addFriend(String login, final User userFromSession);
}

View File

@@ -8,5 +8,6 @@ import org.springframework.data.neo4j.repository.RelationshipOperationsRepositor
* @author mh
* @since 02.04.11
*/
public interface UserRepository extends GraphRepository<User>, RelationshipOperationsRepository<User> {
public interface UserRepository extends GraphRepository<User>, RelationshipOperationsRepository<User>, CineastsUserDetailsService {
User findByLogin(String login);
}

View File

@@ -1,9 +1,9 @@
package org.neo4j.cineasts.service;
package org.neo4j.cineasts.repository;
import org.neo4j.cineasts.domain.Movie;
import org.neo4j.cineasts.domain.Rating;
import org.neo4j.cineasts.domain.User;
import org.neo4j.cineasts.repository.UserRepository;
import org.neo4j.cineasts.service.CineastsUserDetails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.neo4j.template.Neo4jOperations;
@@ -11,36 +11,29 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author mh
* @since 06.03.11
*/
@Service
public class CineastsUserDetailsServiceImpl implements CineastsUserDetailsService {
public class UserRepositoryImpl implements CineastsUserDetailsService {
@Autowired
private UserRepository userRepository;
@Autowired
private Neo4jOperations template;
@Override
public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException {
final User user = findUser(login);
if (user==null) throw new UsernameNotFoundException("Username not found",login);
public CineastsUserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException {
final User user = findByLogin(login);
if (user==null) throw new UsernameNotFoundException("Username not found: "+login);
return new CineastsUserDetails(user);
}
@Override
public User findUser(String login) {
return userRepository.findByPropertyValue("login",login);
private User findByLogin(String login) {
return template.lookup(User.class,"login",login).to(User.class).single();
}
@Override
public User getUserFromSession() {
SecurityContext context = SecurityContextHolder.getContext();
@@ -63,11 +56,11 @@ public class CineastsUserDetailsServiceImpl implements CineastsUserDetailsServic
@Override
@Transactional
public User register(String login, String name, String password) {
User found = findUser(login);
User found = findByLogin(login);
if (found!=null) throw new RuntimeException("Login already taken: "+login);
if (name==null || name.isEmpty()) throw new RuntimeException("No name provided.");
if (password==null || password.isEmpty()) throw new RuntimeException("No password provided.");
User user=userRepository.save(new User(login,name,password,User.Roles.ROLE_USER));
User user=template.save(new User(login,name,password,User.Roles.ROLE_USER));
setUserInSession(user);
return user;
}
@@ -82,9 +75,8 @@ public class CineastsUserDetailsServiceImpl implements CineastsUserDetailsServic
@Override
@Transactional
public void addFriend(String login) {
User friend = findUser(login);
User user = getUserFromSession();
public void addFriend(String friendLogin, final User user) {
User friend = findByLogin(friendLogin);
if (!user.equals(friend)) {
user.addFriend(friend);
template.save(user);

View File

@@ -1,19 +0,0 @@
package org.neo4j.cineasts.service;
import org.neo4j.cineasts.repository.MovieRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
/**
* @author mh
* @since 04.03.11
*/
@Repository
@Transactional
public class CineastsRepository {
@Autowired private MovieRepository movieRepository;
}

View File

@@ -25,7 +25,7 @@
</security:http>
<security:authentication-manager>
<security:authentication-provider user-service-ref="cineastsUserDetailsServiceImpl">
<security:authentication-provider user-service-ref="userRepository">
<security:password-encoder hash="md5">
<security:salt-source system-wide="cewuiqwzie"/>
</security:password-encoder>

View File

@@ -30,7 +30,6 @@
<constructor-arg value="data/json"/>
</bean>
<tx:annotation-driven mode="proxy" transaction-manager="transactionManager"/>
<tx:annotation-driven mode="proxy"/>
<!--import resource="applicatioContext-security.xml"/-->
</beans>

View File

@@ -15,7 +15,6 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.Iterator;
import static org.junit.Assert.*;
import static org.junit.Assert.assertNotNull;
/**
* @author mh

View File

@@ -8,6 +8,7 @@ import org.neo4j.cineasts.domain.User;
import org.neo4j.cineasts.repository.MovieRepository;
import org.neo4j.cineasts.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -19,21 +20,20 @@ import static org.junit.Assert.assertEquals;
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/movies-test-context.xml"})
@DirtiesContext
public class TransactionTest {
@Autowired
UserRepository userRepository;
@Autowired
MovieRepository movieRepository;
@Autowired
CineastsUserDetailsService userDetailsService;
@Test
@Ignore
public void testBefriendUsers() {
final User me = userRepository.save(new User("me", "me", "me"));
final User you = userRepository.save(new User("you", "you", "you"));
userDetailsService.addFriend("you");
userRepository.addFriend("you", userRepository.getUserFromSession());
final User loaded = userRepository.findOne(me.getId());
assertEquals(1,loaded.getFriends().size());
}
@@ -42,7 +42,7 @@ public class TransactionTest {
public void testRateMovie() {
final User me = userRepository.save(new User("me", "me", "me"));
final Movie movie = movieRepository.save(new Movie("1","Movie"));
userDetailsService.rate(movie, me, 5, "cool");
userRepository.rate(movie, me, 5, "cool");
final User loaded = userRepository.findOne(me.getId());
assertEquals(1,loaded.getRatings().size());
}

View File

@@ -15,7 +15,7 @@
<neo4j:config graphDatabaseService="graphDatabaseService"/>
<neo4j:repositories base-package="org.neo4j.cineasts.repository"/>
<bean id="graphDatabaseService" class="org.neo4j.test.ImpermanentGraphDatabase"/>
<bean id="graphDatabaseService" class="org.neo4j.test.ImpermanentGraphDatabase" destroy-method="shutdown"/>
<bean class="org.neo4j.cineasts.movieimport.MovieDbApiClient">
<constructor-arg value="926d2a79e82920b62f03b1cb57e532e6"/>