2019-11-28 20:14:04 +01:00

128 lines
4.5 KiB
Java

package at.technikumwien.movies;
import javax.annotation.Resource;
import javax.ejb.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.PersistenceContext;
import java.util.List;
import java.util.logging.Logger;
@Stateless
@TransactionManagement(value=TransactionManagementType.CONTAINER)
public class MoviesService {
private static final Logger LOGGER = Logger.getLogger(MoviesService.class.getName());
@Resource
private SessionContext context;
@PersistenceContext(unitName = "MoviesPU")
private EntityManager em;
public Movies findById(long id) {
LOGGER.info("findById() >> id=" + id);
Movies movies = em.find(Movies.class, id);
if (movies == null) {
throw new EntityNotFoundException("can't find movie with id=" + id);
}
return movies;
}
public List<Movies> findByTitle(String title) {
LOGGER.info("findByTitle() >> title=" + title);
return em.createNamedQuery("Movies.selectByTitle", Movies.class)
.setParameter("title", "%" + title + "%")
.getResultList();
}
public List<Movies> findAll() {
LOGGER.info("findAll()");
return em.createNamedQuery("Movies.selectAll", Movies.class) //JPQL -> java persistence query language
.getResultList();
}
public void removeById(long id) {
LOGGER.info("removeById() >> id=" + id);
Movies movies = findById(id);
em.remove(movies); //managed news required
}
public List<Actors> findAllActors() {
LOGGER.info("findAllActors)");
return em.createNamedQuery("Actors.selectAllActors", Actors.class)
.getResultList();
}
public List<Studios> findAllStudios() {
LOGGER.info("findAllStudios)");
return em.createNamedQuery("Studios.selectAllStudios", Studios.class)
.getResultList();
}
// TODO maybe check if the movie already exists?
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void save(List<Movies> movies) {
for (Movies movie : movies) {
try {
// Get studio for the movie from the database
Studios movieStudio = movie.getStudio();
LOGGER.info("Get a studio" + movieStudio);
List<Studios> studioListResult = em.createNamedQuery("Studios.getIdByProperties", Studios.class)
.setParameter("name", movieStudio.getName())
.setParameter("countrycode", movieStudio.getCountrycode())
.setParameter("postcode", movieStudio.getPostcode())
.getResultList();
if (!studioListResult.isEmpty() && studioListResult.size() > 0) {
Long actorId = studioListResult.get(0).getId();
movieStudio.setId(actorId);
}
else
{
LOGGER.info("Rollback! Movie studio: " + movieStudio);
context.setRollbackOnly();
return;
}
// TODO use also birthday
// Get actor for the movie from the database
for (Actors movieActor : movie.getActors()) {
LOGGER.info("Get an actor " + movieActor);
List<Actors> actorListResult = em.createNamedQuery("Actors.getIdByProperties", Actors.class)
.setParameter("firstname", movieActor.getFirstname())
.setParameter("lastname", movieActor.getLastname())
.setParameter("sex", movieActor.getSex())
//.setParameter("birthdate", movieActor.getBirthdate())
.getResultList();
if (!actorListResult.isEmpty() && actorListResult.size() > 0) {
Long actorId = actorListResult.get(0).getId();
movieActor.setId(actorId);
}
else
{
LOGGER.info("Rollback! Movie actor: " + movieActor);
context.setRollbackOnly();
return;
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
LOGGER.info("save() >> movies" + movies);
for (Movies movie : movies) {
em.merge(movie);
}
}
}