package de.codecentric.moviedatabase.shop.event;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.codecentric.moviedatabase.shop.domain.Movie;
import de.codecentric.moviedatabase.shop.repositories.MovieRepository;
public class MovieReceiver {
private MovieRepository movieRepository;
private ObjectMapper objectMapper;
public MovieReceiver(MovieRepository movieRepository, ObjectMapper objectMapper) {
super();
this.movieRepository = movieRepository;
this.objectMapper = objectMapper;
}
private static final Logger LOGGER = LoggerFactory.getLogger(MovieReceiver.class);
public void receive(String message){
if (LOGGER.isInfoEnabled()){
LOGGER.info(message);
}
JsonNode jsonRoot = null;
try {
JsonFactory factory = objectMapper.getFactory();
JsonParser parser = factory.createParser(message);
jsonRoot = objectMapper.readTree(parser);
} catch (IOException e) {
throw new RuntimeException("Problem with parsing message.",e);
}
MovieEventType eventType = MovieEventType.valueOf(jsonRoot.get("type").asText());
UUID id = UUID.fromString(jsonRoot.get("movie").get("id").asText());
String title = jsonRoot.get("movie").get("title").asText();
String description = jsonRoot.get("movie").get("description").asText();
switch (eventType) {
case MOVIE_CHANGED:
updateMovie(id,title,description);
break;
case MOVIE_CREATED:
createMovie(id,title,description);
break;
default:
break;
}
}
private void updateMovie(UUID id, String title, String description) {
Movie movie = movieRepository.findOne(id);
if (movie != null){
movie.setDescription(description);
movie.setTitle(title);
movieRepository.save(movie);
} else {
// should not happen, if it does it means we missed messages. Better create the entity now than throwing error.
createMovie(id,title,description);
}
}
private void createMovie(UUID id, String title, String description) {
Movie movie = new Movie();
movie.setId(id);
movie.setDescription(description);
movie.setTitle(title);
movie.setQuantity(0);
movie.setPrice(new BigDecimal(-1));
movieRepository.save(movie);
}
}