package com.griddynamics.jagger.dbapi;
import com.griddynamics.jagger.dbapi.dto.TagDto;
import com.griddynamics.jagger.dbapi.entity.SessionData;
import com.griddynamics.jagger.dbapi.entity.TagEntity;
import org.springframework.stereotype.Component;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* User: mnovozhilov
* Date: 3/14/14
* Time: 6:01 PM
*/
@Component
public class DataSaverServiceImpl implements DataSaverService {
private EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager.getEntityManagerFactory().createEntityManager();
}
//synchronized because we use not thread safe entity manager
@Override
public synchronized void saveUserComment(Long sessionDataId, String userComment) {
Number number = (Number) entityManager.createQuery(
"select count(*) from SessionMetaDataEntity as sm where sm.sessionData.id=:sessionData_id")
.setParameter("sessionData_id", sessionDataId)
.getSingleResult();
if (number.intValue() == 0) {
// create new SessionMetaInfo
// do not save empty comments
if (userComment.isEmpty()) {
return;
}
try {
entityManager.getTransaction().begin();
entityManager.createNativeQuery(
"INSERT INTO SessionMetaDataEntity (userComment, sessionData_id) " +
"VALUES (:userComment, :sessionData_id)")
.setParameter("userComment", userComment)
.setParameter("sessionData_id", sessionDataId)
.executeUpdate();
} finally {
entityManager.getTransaction().commit();
}
} else {
// update/delete
if (userComment.isEmpty()) {
// delete
try {
entityManager.getTransaction().begin();
entityManager.createQuery(
"delete SessionMetaDataEntity where sessionData.id=:sessionData_id")
.setParameter("sessionData_id", sessionDataId)
.executeUpdate();
} finally {
entityManager.getTransaction().commit();
}
} else {
// update
try {
entityManager.getTransaction().begin();
entityManager.createNativeQuery(
"UPDATE SessionMetaDataEntity smd SET smd.userComment=:userComment " +
"WHERE smd.sessionData_id=:sessionData_id")
.setParameter("userComment", userComment)
.setParameter("sessionData_id", sessionDataId)
.executeUpdate();
} finally {
entityManager.getTransaction().commit();
}
}
}
}
@Override
public synchronized void saveTags(Long sessionDataId, List<TagDto> tags) {
Set<TagEntity> tagEntities = new HashSet<>();
SessionData sessionData;
tagEntities.addAll(tags.stream().map(tagDto -> new TagEntity(tagDto.getName(), tagDto.getDescription())).collect(Collectors.toList()));
try {
entityManager.getTransaction().begin();
sessionData = entityManager.find(SessionData.class, sessionDataId);
if (sessionData != null) {
sessionData.setTags(tagEntities);
entityManager.merge(sessionData);
entityManager.flush();
}
} finally {
entityManager.getTransaction().commit();
}
}
}