package hu.sch.ejb;
import hu.sch.domain.Group;
import hu.sch.domain.Membership;
import hu.sch.domain.Post;
import hu.sch.domain.PostType;
import hu.sch.domain.enums.SvieMembershipType;
import hu.sch.domain.enums.SvieStatus;
import hu.sch.domain.user.User;
import hu.sch.services.PostManagerLocal;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author aldaris
*/
@Stateless(mappedName = "PostManager")
@SuppressWarnings("unchecked")
public class PostManagerBean implements PostManagerLocal {
@PersistenceContext
private EntityManager em;
private static Logger log = LoggerFactory.getLogger(PostManagerBean.class);
public List<PostType> getAvailablePostTypesForGroup(Group group) {
Query q = em.createNamedQuery(PostType.availablePostsQuery);
q.setParameter("id", group.getId());
return q.getResultList();
}
public List<Post> getCurrentPostsForGroup(Membership ms) {
Query q = em.createNamedQuery(Post.currentPostsForGroup);
q.setParameter("id", ms.getId());
return q.getResultList();
}
public void setPostsForMembership(Membership ms, List<Post> removable, List<PostType> creatable) {
log.info("törlendő:");
for (Post post : removable) {
log.info(post.getPostType().toString());
Post temp = em.find(Post.class, post.getId());
// mi van, ha időközben már töröltük? Akkor ne akarjuk mégegyszer!
if(temp != null)
em.remove(temp);
}
log.info("létrehozandók");
for (PostType postType : creatable) {
log.info(postType.toString());
Post temp = new Post();
temp.setMembership(ms);
temp.setPostType(postType);
em.persist(temp);
}
em.flush();
}
public void changeGroupLeader(Membership membership, PostType groupLeaderType) {
User user = membership.getUser();
Query q = em.createNamedQuery(Post.getByTypeAndGroup);
q.setParameter("pt", groupLeaderType);
q.setParameter("group", membership.getGroup());
Post post = (Post) q.getSingleResult();
Query q2 = em.createNamedQuery(Post.getPostTypeByName);
q2.setParameter("pn", "volt körvezető");
PostType postType = (PostType) q2.getSingleResult();
post.setPostType(postType);
List<PostType> temp = new ArrayList<PostType>(1);
temp.add(groupLeaderType);
log.warn("Körvezetőt szeretnének váltani: " + post.getMembership().getUser().getId() + "->" + membership.getUser().getId());
if (membership.getGroup().getIsSvie()) {
if (user.getSvieMembershipType().equals(SvieMembershipType.RENDESTAG)
&& user.getSvieStatus().equals(SvieStatus.ELFOGADVA)
&& user.getSvieMembershipType() != null && user.getSviePrimaryMembership().equals(membership)) {
post.getMembership().getUser().setDelegated(false);
membership.getUser().setDelegated(true);
} else {
throw new IllegalStateException("Ennek a felhasználónak nem adhatod át a körvezetőséget, "
+ "nem teljesíti a SVIE feltételeket.");
}
}
em.merge(membership.getUser());
em.flush();
setPostsForMembership(membership, new ArrayList<Post>(0), temp);
}
public boolean createPostType(String postName, Group group, Boolean isDelegatedPost) {
try {
Query q = em.createNamedQuery(PostType.getByNameAndGroup);
q.setParameter("pn", postName);
q.setParameter("group", group);
q.getSingleResult();
} catch (NoResultException nre) {
PostType temp = new PostType();
temp.setGroup(group);
temp.setPostName(postName);
temp.setDelegatedPost(isDelegatedPost);
em.persist(temp);
return true;
}
return false;
}
public boolean hasUserDelegatedPostInGroup(Group group, User user) {
try {
Query q = em.createNamedQuery(Post.getUserDelegatedPost);
q.setParameter("group", group);
q.setParameter("user", user);
List result = q.getResultList();
if (!result.isEmpty()) {
return true;
} else {
return false;
}
} catch (NoResultException nre) {
return false;
}
}
}