/*
* Copyright 2012 Ixonos Plc, Finland. All rights reserved.
*
* This file is part of Kohti kumppanuutta.
*
* This file is licensed under GNU LGPL version 3.
* Please see the 'license.txt' file in the root directory of the package you received.
* If you did not receive a license, please contact the copyright holder
* (http://www.ixonos.com/).
*
*/
package fi.koku.services.entity.community.impl;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import fi.koku.KoKuFaultException;
/**
* Community related data access facilities.
*
* @author aspluma
* @author laukksa
*/
@Stateless
public class CommunityDAOBean implements CommunityDAO {
@PersistenceContext
private EntityManager em;
public CommunityDAOBean() {
}
@Override
public Community getCommunity(Long id) {
Query q = em.createNamedQuery(Community.QUERY_GET_COMMUNITY_BY_ID);
q.setParameter("id", id);
return (Community) q.getSingleResult();
}
@Override
public Long insertCommunity(Community c) {
c.setId(null);
em.persist(c);
return c.getId();
}
/**
* Merge from c2 to c1.
*/
@Override
public void updateCommunity(Community c2) {
Community c1 = getCommunity(c2.getId());
c1.setName(c2.getName());
c1.setType(c2.getType());
// some temporary data structures
Set<String> m1Ids = new HashSet<String>();
Map<String, CommunityMember> m2 = new HashMap<String, CommunityMember>();
for(CommunityMember cm : c2.getMembers()) {
m2.put(cm.getMemberPic(), cm);
}
// update modified and delete removed members
for(Iterator<CommunityMember> i = c1.getMembers().iterator(); i.hasNext() ; ) {
CommunityMember cm = i.next();
CommunityMember cm2 = m2.get(cm.getMemberPic());
if(cm2 != null) {
if(!cm.getRole().equals(cm2.getRole())) {
cm.setRole(cm2.getRole());
}
} else {
i.remove();
em.remove(cm);
}
m1Ids.add(cm.getMemberPic());
}
// add new members
Set<String> m2Ids = m2.keySet();
m2Ids.removeAll(m1Ids);
for(Iterator<String> i = m2Ids.iterator(); i.hasNext() ; ) {
CommunityMember cm = m2.get(i.next());
c1.getMembers().add(cm);
cm.setCommunity(c1);
}
}
@Override
public Collection<Community> queryCommunities(CommunityQueryCriteria qc) {
// JPQL generates an unnecessary join in the SQL subquery.
StringBuilder jpql = new StringBuilder("SELECT c FROM Community c " +
"JOIN FETCH c.members " +
"WHERE c IN (" +
"SELECT cm.community FROM CommunityMember cm WHERE cm.memberPic IN (:memberPics))");
if(qc.getCommunityType() != null) {
jpql.append(" AND c.type = :type");
}
Query q = em.createQuery(jpql.toString());
if (qc.getMemberPics() != null && qc.getMemberPics().size() > 0) {
q.setParameter("memberPics", qc.getMemberPics());
} else {
// MemberPics are mandatory
CommunityServiceErrorCode errorCode = CommunityServiceErrorCode.NO_MEMBER_PICS_QUERY_CRITERIA;
throw new KoKuFaultException(errorCode.getValue(), errorCode.getDescription());
}
if (qc.getCommunityType() != null) {
q.setParameter("type", qc.getCommunityType());
}
@SuppressWarnings("unchecked")
List<Community> communities = q.getResultList();
// remove duplicate communities.
Set<Community> r = new HashSet<Community>();
for(Community c : communities) {
r.add(c);
}
return r;
}
@Override
public Collection<MembershipRequest> queryMembershipRequests(MembershipRequestQueryCriteria qc) {
Query q = null;
if(qc.getRequesterPic() != null) {
q = em.createNamedQuery(MembershipRequest.QUERY_GET_MEM_REQUESTS_BY_REQUESTER_PIC);
q.setParameter("requesterPic", qc.getRequesterPic());
} else if(qc.getApproverPic() != null) {
q = em.createNamedQuery(MembershipRequest.QUERY_GET_MEM_REQUESTS_BY_APPROVER_PIC);
q.setParameter("approverPic", qc.getApproverPic());
} else {
throw new IllegalArgumentException("missing query parameters");
}
@SuppressWarnings("unchecked")
Collection<MembershipRequest> requests = q.getResultList();
Set<Long> ids = new HashSet<Long>();
for(Iterator<MembershipRequest> i = requests.iterator(); i.hasNext(); ) {
MembershipRequest mr = i.next();
if(ids.contains(mr.getId())) {
i.remove();
}
ids.add(mr.getId());
}
return requests;
}
@Override
public void updateMembershipApproval(MembershipApproval a) {
em.merge(a);
}
@Override
public void deleteCommunity(Long id) {
Community c = em.find(Community.class, id);
em.remove(c);
}
@Override
public Long insertMembershipRequest(MembershipRequest rq) {
rq.setId(null);
em.persist(rq);
return rq.getId();
}
@Override
public MembershipRequest getMembershipRequest(Long requestId) {
Query q = em.createNamedQuery(MembershipRequest.QUERY_GET_MEM_REQUEST_BY_ID);
q.setParameter("id", requestId);
MembershipRequest rq = (MembershipRequest) q.getSingleResult();
return rq;
}
@Override
public void deleteMembershipRequest(Long requestId) {
MembershipRequest rq = getMembershipRequest(requestId);
em.remove(rq);
}
}