package admin;
import java.io.IOException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import persistency.entities.Comment;
import persistency.entities.LoggedUser;
import persistency.entities.gamification.PointsCategory;
import persistency.entities.gamification.PointsInstance;
import persistency.exposed.CommentsExposedBasic;
import persistency.exposed.PointsCategoryExposed;
import persistency.exposed.PointsExposed;
import persistency.exposed.json.PointsInstanceJson;
import service.rest.wrappers.CommentBasic;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/**
* Servlet implementation class DeleteComments
*/
public class DeleteComments extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Gson g= new Gson();
List<CommentBasic> commentsToDelete = g.fromJson(request.getReader(), new TypeToken<List<CommentBasic>>(){}.getType());
if(commentsToDelete != null){
String templateLike = "like on comment: ";
String templateLiked = "liked on comment: ";
String templateLiked5 = "liked5 on comment: ";
CommentsExposedBasic ceb = new CommentsExposedBasic();
PointsCategoryExposed pce = new PointsCategoryExposed();
PointsCategory likeCategory = pce.findCategoryByShortName("like");
PointsCategory likedCategory = pce.findCategoryByShortName("liked");
PointsCategory liked5Category = pce.findCategoryByShortName("liked5");
for (CommentBasic commentBasic : commentsToDelete) {
Comment comment = ceb.getComment(commentBasic.getId());
EntityManager entityManager = ceb.entityManager;
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
comment.getCowner().getComments().remove(comment);
entityManager.merge(comment.getCowner());
List<LoggedUser> likedBy = comment.getLikedBy();
for (LoggedUser loggedUser : likedBy) {
loggedUser.getLikedComments().remove(comment);
List<PointsInstance> likesPoints = loggedUser.findAllPointsWithDescription(likeCategory, templateLike);
removePoints(likeCategory, likesPoints, loggedUser);
List<PointsInstance> likedPoints = loggedUser.findAllPointsWithDescription(likedCategory, templateLiked);
removePoints(likedCategory, likedPoints, loggedUser);
//liked point are removed from the correct user?
List<PointsInstance> liked5Points = loggedUser.findAllPointsWithDescription(liked5Category, templateLiked5);
removePoints(liked5Category, liked5Points, loggedUser);
entityManager.merge(loggedUser);
entityManager.merge(likeCategory);
entityManager.merge(likedCategory);
entityManager.merge(liked5Category);
}
entityManager.remove(comment);
transaction.commit();
}
}
}
private void removePoints(PointsCategory likeCategory,
List<PointsInstance> likesPoints, LoggedUser loggedUser) {
if(likesPoints != null){
for (PointsInstance pointsInstance : likesPoints) {
likeCategory.getInstancesOfThisType().remove(pointsInstance);
}
loggedUser.getPointsInstances().removeAll(likesPoints);
}
}
}