Skip to content

Commit 27a8711

Browse files
committed
more UX changes
1 parent 0630663 commit 27a8711

File tree

26 files changed

+391
-289
lines changed

26 files changed

+391
-289
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<spring.version>3.0.5.RELEASE</spring.version>
1515
<slf4j.version>1.6.1</slf4j.version>
1616
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
17-
<neo4j.version>1.3.M03</neo4j.version>
17+
<neo4j.version>1.3.M04</neo4j.version>
1818
<aspectj.version>1.6.11.M2</aspectj.version>
1919
<org.slf4j-version>1.6.1</org.slf4j-version>
2020
</properties>
@@ -245,7 +245,7 @@
245245
<webAppConfig>
246246
<contextPath>/</contextPath>
247247
</webAppConfig>
248-
<scanIntervalSeconds>1</scanIntervalSeconds>
248+
<!--scanIntervalSeconds>1</scanIntervalSeconds-->
249249
</configuration>
250250
</plugin>
251251

src/main/java/org/neo4j/movies/controller/AuthController.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public String register(
4343

4444
try {
4545
userDetailsService.register(login,name,password);
46-
return "/user/"+login;
46+
return "forward:/user/"+login;
4747
} catch(Exception e) {
4848
model.addAttribute("j_username",login);
4949
model.addAttribute("j_displayname",name);
@@ -57,4 +57,10 @@ public String denied() {
5757
logger.debug("Received request to show denied page");
5858
return "/auth/deniedpage";
5959
}
60+
61+
@RequestMapping(value = "/registerpage", method = RequestMethod.GET)
62+
public String registerPage() {
63+
logger.debug("Received request to show register page");
64+
return "/auth/registerpage";
65+
}
6066
}

src/main/java/org/neo4j/movies/controller/ImportController.java

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,18 @@
33
import org.neo4j.movies.domain.Movie;
44
import org.neo4j.movies.movieimport.MovieDbImportService;
55
import org.neo4j.movies.service.CineastsUserDetailsService;
6-
import org.neo4j.movies.service.DatabasePopulator;
76
import org.neo4j.movies.service.MoviesRepository;
87
import org.slf4j.Logger;
98
import org.slf4j.LoggerFactory;
109
import org.springframework.beans.factory.annotation.Autowired;
1110
import org.springframework.stereotype.Controller;
12-
import org.springframework.web.bind.annotation.*;
11+
import org.springframework.ui.Model;
12+
import org.springframework.web.bind.annotation.PathVariable;
13+
import org.springframework.web.bind.annotation.RequestMapping;
14+
import org.springframework.web.bind.annotation.RequestMethod;
15+
16+
import java.util.LinkedHashMap;
17+
import java.util.Map;
1318

1419
/**
1520
* @author mh
@@ -18,24 +23,45 @@
1823
@Controller
1924
public class ImportController {
2025

21-
private MoviesRepository moviesRepository;
22-
private CineastsUserDetailsService userDetailsService;
2326
private MovieDbImportService importService;
2427
private static final Logger log = LoggerFactory.getLogger(ImportController.class);
2528

2629
@Autowired
27-
public ImportController(MoviesRepository moviesRepository, MovieDbImportService importService, CineastsUserDetailsService userDetailsService) {
28-
this.moviesRepository = moviesRepository;
30+
public ImportController(MovieDbImportService importService) {
2931
this.importService = importService;
30-
this.userDetailsService = userDetailsService;
3132
}
3233

33-
// for web service (JSON) clients
34-
@RequestMapping(value = "/import/{id}", method = RequestMethod.POST)
35-
public
36-
@ResponseBody
37-
Movie getMovie(@PathVariable String id) {
38-
importService.importMovie(id);
39-
return moviesRepository.getMovie(id);
34+
@RequestMapping(value = "/import/{ids}", method = RequestMethod.GET)
35+
public String importMovie(@PathVariable String ids, Model model) {
36+
long start=System.currentTimeMillis();
37+
final Map<Integer, String> movies = importService.importMovies(extractRanges(ids));
38+
long duration = (System.currentTimeMillis() - start) / 1000;
39+
model.addAttribute("duration", duration);
40+
model.addAttribute("ids", ids);
41+
model.addAttribute("movies", movies.entrySet());
42+
return "import/result";
43+
}
44+
45+
46+
private Map<Integer, Integer> extractRanges(String ids) {
47+
Map<Integer, Integer> ranges = new LinkedHashMap<Integer, Integer>();
48+
StringBuilder errors = new StringBuilder();
49+
for (String token : ids.split(",")) {
50+
try {
51+
if (token.contains("-")) {
52+
String[] range = token.split("-");
53+
ranges.put(Integer.parseInt(range[0]), Integer.parseInt(range[1]));
54+
} else {
55+
int id = Integer.parseInt(token);
56+
ranges.put(id, id);
57+
}
58+
} catch (Exception e) {
59+
errors.append(token).append(": ").append(e.getMessage()).append("\n");
60+
}
61+
}
62+
if (errors.length() > 0) {
63+
throw new RuntimeException("Error parsing ids\n" + errors);
64+
}
65+
return ranges;
4066
}
4167
}

src/main/java/org/neo4j/movies/controller/MovieController.java

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.neo4j.movies.domain.Movie;
44
import org.neo4j.movies.domain.Person;
5+
import org.neo4j.movies.domain.Rating;
56
import org.neo4j.movies.domain.User;
67
import org.neo4j.movies.service.CineastsUserDetailsService;
78
import org.neo4j.movies.service.DatabasePopulator;
@@ -50,26 +51,34 @@ Movie getMovie(@PathVariable String id) {
5051

5152

5253
@RequestMapping(value = "/movies/{movieId}", method = RequestMethod.GET, headers = "Accept=text/html")
53-
public String singleMovieView(Model model, @PathVariable String movieId) {
54+
public String singleMovieView(final Model model, @PathVariable String movieId) {
55+
User user = addUser(model);
5456
Movie movie = moviesRepository.getMovie(movieId);
55-
model.addAttribute("movie", movie);
5657
model.addAttribute("id", movieId);
57-
addUser(model);
58+
if (movie != null) {
59+
model.addAttribute("movie", movie);
60+
final int stars = movie.getStars();
61+
model.addAttribute("stars", stars);
62+
Rating rating = null;
63+
if (user!=null) rating = movie.getRelationshipTo(user, Rating.class, "RATED");
64+
if (rating == null) rating = new Rating().rate(stars,null);
65+
model.addAttribute("userRating",rating);
66+
}
5867
return "/movies/show";
5968
}
69+
6070
@RequestMapping(value = "/movies/{movieId}", method = RequestMethod.POST, headers = "Accept=text/html")
6171
public String updateMovie(Model model, @PathVariable String movieId, @RequestParam(value = "rated",required = false) Integer stars, @RequestParam(value = "comment",required = false) String comment) {
6272
Movie movie = moviesRepository.getMovie(movieId);
6373
User user = userDetailsService.getUserFromSession();
6474
moviesRepository.rateMovie(movie,user, stars==null ? -1 : stars,comment!=null ? comment.trim() : null);
65-
model.addAttribute("movie", movie);
66-
model.addAttribute("id", movieId);
67-
model.addAttribute("user", user);
68-
return "/movies/show";
75+
return singleMovieView(model,movieId);
6976
}
7077

71-
private void addUser(Model model) {
72-
model.addAttribute("user", userDetailsService.getUserFromSession());
78+
private User addUser(Model model) {
79+
User user = userDetailsService.getUserFromSession();
80+
model.addAttribute("user", user);
81+
return user;
7382
}
7483

7584
@RequestMapping(value = "/movies", method = RequestMethod.GET, headers = "Accept=text/html")
@@ -110,14 +119,4 @@ public String index(Model model) {
110119
addUser(model);
111120
return "index";
112121
}
113-
114-
/**
115-
* Post a tweet about a session.
116-
*/
117-
/* @RequestMapping(value="/events/{eventId}/sessions/{sessionId}/tweets", method=RequestMethod.POST)
118-
public ResponseEntity<String> postSessionTweet(@PathVariable Long eventId, @PathVariable Integer sessionId, @RequestParam String status) {
119-
return new ResponseEntity<String>(HttpStatus.OK);
120-
}
121-
*/
122-
123122
}

src/main/java/org/neo4j/movies/controller/UserController.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,11 @@ public String profile(Model model) {
3232

3333
@RequestMapping(value = "/user/{login}/friends", method = RequestMethod.POST)
3434
public String addFriend(Model model, @PathVariable("login") String login) {
35-
User friend = userDetailsService.findUser(login);
36-
User user = userDetailsService.getUserFromSession();
37-
if (!user.equals(friend)) {
38-
user.addFriend(friend);
39-
}
40-
return publicProfile(model, friend, user);
35+
userDetailsService.addFriend(login);
36+
return "forward:/user/"+login;
4137
}
4238

43-
@RequestMapping(value = "/user/{login}", method = RequestMethod.GET)
39+
@RequestMapping(value = "/user/{login}")
4440
public String publicProfile(Model model, @PathVariable("login") String login) {
4541
User profiled = userDetailsService.findUser(login);
4642
User user = userDetailsService.getUserFromSession();

src/main/java/org/neo4j/movies/domain/Movie.java

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
import org.springframework.data.graph.annotation.RelatedToVia;
88
import org.springframework.data.graph.core.Direction;
99

10-
import java.util.Collection;
11-
import java.util.Collections;
12-
import java.util.Date;
13-
import java.util.Set;
10+
import java.util.*;
1411

1512
import static org.springframework.data.graph.core.Direction.INCOMING;
1613

@@ -29,14 +26,11 @@ public class Movie {
2926

3027
String description;
3128

32-
int year;
33-
3429
@RelatedTo(type="DIRECTED", direction = INCOMING)
30+
Person director;
3531

36-
Director director;
37-
38-
@RelatedTo(elementClass = Actor.class, type = "ACTS_IN", direction = INCOMING)
39-
Set<Actor> actors;
32+
@RelatedTo(elementClass = Person.class, type = "ACTS_IN", direction = INCOMING)
33+
Set<Person> actors;
4034

4135
@RelatedToVia(elementClass = Role.class, type = "ACTS_IN", direction = INCOMING)
4236
Iterable<Role> roles;
@@ -64,7 +58,7 @@ public Movie(String id, String title) {
6458
this.title = title;
6559
}
6660

67-
public Collection<Actor> getActors() {
61+
public Collection<Person> getActors() {
6862
return actors;
6963
}
7064

@@ -73,11 +67,10 @@ public Collection<Role> getRoles() {
7367
}
7468

7569
public int getYear() {
76-
return year;
77-
}
78-
79-
public void setYear(int year) {
80-
this.year = year;
70+
if (releaseDate==null) return 0;
71+
Calendar cal = Calendar.getInstance();
72+
cal.setTime(releaseDate);
73+
return cal.get(Calendar.YEAR);
8174
}
8275

8376
public String getId() {
@@ -90,14 +83,14 @@ public String getTitle() {
9083

9184
@Override
9285
public String toString() {
93-
return String.format("%s (%d) [%s]", title, year, id);
86+
return String.format("%s (%s) [%s]", title, releaseDate, id);
9487
}
9588

9689
public String getDescription() {
9790
return description;
9891
}
9992

100-
public float getStars() {
93+
public int getStars() {
10194
Iterable<Rating> allRatings = ratings;
10295

10396
if (allRatings == null) return 0;
@@ -106,15 +99,15 @@ public float getStars() {
10699
stars += rating.getStars();
107100
count++;
108101
}
109-
return (float) stars / count;
102+
return count==0 ? 0 : stars / count;
110103
}
111104

112105
public Collection<Rating> getRatings() {
113106
Iterable<Rating> allRatings = ratings;
114107
return allRatings == null ? Collections.<Rating>emptyList() : IteratorUtil.asCollection(allRatings);
115108
}
116109

117-
public Director getDirector() {
110+
public Person getDirector() {
118111
return director;
119112
}
120113

@@ -221,5 +214,13 @@ public Date getLastModified() {
221214
public String getImageUrl() {
222215
return imageUrl;
223216
}
217+
218+
public String getYoutubeId() {
219+
String trailerUrl = trailer;
220+
if (trailerUrl==null || !trailerUrl.contains("youtu")) return null;
221+
String[] parts = trailerUrl.split("[=/]");
222+
int numberOfParts = parts.length;
223+
return numberOfParts > 0 ? parts[numberOfParts-1] : null;
224+
}
224225
}
225226

src/main/java/org/neo4j/movies/domain/Person.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import org.springframework.data.annotation.Indexed;
44
import org.springframework.data.graph.annotation.NodeEntity;
5+
import org.springframework.data.graph.annotation.RelatedTo;
6+
import org.springframework.data.graph.annotation.RelatedToVia;
57

68
import java.util.Date;
9+
import java.util.Set;
710

811
/**
912
* @author mh
@@ -89,4 +92,33 @@ public Date getLastModified() {
8992
public void setProfileImageUrl(String profileImageUrl) {
9093
this.profileImageUrl = profileImageUrl;
9194
}
95+
96+
public String getProfileImageUrl() {
97+
return profileImageUrl;
98+
}
99+
100+
@RelatedTo(elementClass = Movie.class, type = "DIRECTED")
101+
private Set<Movie> directedMovies;
102+
103+
public Set<Movie> getDirectedMovies() {
104+
return directedMovies;
105+
}
106+
107+
public void directed(Movie movie) {
108+
this.directedMovies.add(movie);
109+
}
110+
111+
@RelatedToVia(elementClass = Role.class, type = "ACTS_IN")
112+
Iterable<Role> roles;
113+
114+
public Iterable<Role> getRoles() {
115+
return roles;
116+
}
117+
118+
public Role playedIn(Movie movie, String roleName) {
119+
Role role = relateTo(movie, Role.class, "ACTS_IN");
120+
role.setName(roleName);
121+
return role;
122+
}
123+
92124
}

src/main/java/org/neo4j/movies/domain/Role.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
@RelationshipEntity
1212
public class Role {
1313
@EndNode Movie movie;
14-
@StartNode Actor actor;
14+
@StartNode Person actor;
1515

1616
String name;
1717

@@ -27,7 +27,7 @@ public Movie getMovie() {
2727
return movie;
2828
}
2929

30-
public Actor getActor() {
30+
public Person getActor() {
3131
return actor;
3232
}
3333

src/main/java/org/neo4j/movies/movieimport/MovieDbApiClient.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.codehaus.jackson.map.ObjectMapper;
44

55
import java.net.URL;
6+
import java.util.Collections;
67
import java.util.List;
78
import java.util.Map;
89

@@ -22,17 +23,9 @@ public Map getMovie(String id) {
2223
}
2324

2425
private Map loadJsonData(String id, String url) {
25-
Map data = getUrlAsJson(url);
26-
if (data == null) {
27-
throw new RuntimeException("Data for id " + id + " not found " + url);
28-
}
29-
return data;
30-
}
31-
32-
private Map getUrlAsJson(String url) {
3326
try {
3427
List value = mapper.readValue(new URL(url), List.class);
35-
if (value.isEmpty() || value.get(0).equals("Nothing found.")) return null;
28+
if (value.isEmpty() || value.get(0).equals("Nothing found.")) return Collections.singletonMap("not_found",System.currentTimeMillis());
3629
return (Map) value.get(0);
3730
} catch (Exception e) {
3831
throw new RuntimeException("Failed to get data from " + url, e);

0 commit comments

Comments
 (0)