001/**
002 * Copyright 2005-2016 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.kew.actionitem.dao.impl;
017
018import org.apache.commons.collections.CollectionUtils;
019import org.kuali.rice.core.api.delegation.DelegationType;
020import org.kuali.rice.core.framework.persistence.jpa.OrmUtils;
021import org.kuali.rice.core.framework.persistence.jpa.criteria.Criteria;
022import org.kuali.rice.core.framework.persistence.jpa.criteria.QueryByCriteria;
023import org.kuali.rice.kew.actionitem.ActionItem;
024import org.kuali.rice.kew.actionitem.OutboxItemActionListExtension;
025import org.kuali.rice.kew.actionitem.dao.ActionItemDAO;
026import org.kuali.rice.kew.actionrequest.KimGroupRecipient;
027import org.kuali.rice.kew.actionrequest.Recipient;
028import org.kuali.rice.kew.util.WebFriendlyRecipient;
029import org.kuali.rice.kim.api.services.KimApiServiceLocator;
030
031import javax.persistence.EntityManager;
032import javax.persistence.PersistenceContext;
033import java.sql.Timestamp;
034import java.util.ArrayList;
035import java.util.Collection;
036import java.util.Date;
037import java.util.HashMap;
038import java.util.Iterator;
039import java.util.List;
040import java.util.Map;
041
042/**
043 * OJB implementation of {@link ActionItemDAO}.
044 *
045 * @author Kuali Rice Team (rice.collab@kuali.org)
046 */
047public class ActionItemDAOJpaImpl implements ActionItemDAO {
048        @PersistenceContext(unitName="kew-unit")
049        private EntityManager entityManager;
050
051    public ActionItem findByActionItemId(String actionItemId) {
052        return entityManager.find(ActionItem.class, actionItemId);
053    }
054
055    public void deleteActionItems(Long actionRequestId) {
056        Criteria crit = new Criteria(ActionItem.class.getName());
057        crit.eq("actionRequestId", actionRequestId);
058        for(Object actionItem:new QueryByCriteria(entityManager,crit).toQuery().getResultList()){
059            if( ! (actionItem instanceof OutboxItemActionListExtension)) {
060                entityManager.remove(actionItem);
061            }
062        }
063
064    }
065
066    public void deleteActionItem(ActionItem actionItem) {
067        entityManager.remove(findByActionItemId(actionItem.getId()));
068    }
069
070    public void deleteByDocumentIdWorkflowUserId(String documentId, String workflowUserId) {
071        Criteria crit = new Criteria(ActionItem.class.getName());
072        crit.eq("documentId", documentId);
073        crit.eq("principalId", workflowUserId);
074        for(Object actionItem: new QueryByCriteria(entityManager,crit).toQuery().getResultList()){
075            if( ! (actionItem instanceof OutboxItemActionListExtension)) {
076                entityManager.remove(actionItem);
077            }
078        }
079    }
080
081    public void deleteByDocumentId(String documentId) {
082        Criteria crit = new Criteria(ActionItem.class.getName());
083        crit.eq("documentId", documentId);
084        for(Object actionItem: new QueryByCriteria(entityManager,crit).toQuery().getResultList()){
085            if( ! (actionItem instanceof OutboxItemActionListExtension)) {
086                entityManager.remove(actionItem);
087            }
088        }
089    }
090
091    /**
092         * This method replaces findByWorkflowUser
093         *
094         * @see org.kuali.rice.kew.actionitem.dao.ActionItemDAO#findByPrincipalId(java.lang.String)
095         */
096        public Collection<ActionItem> findByPrincipalId(String principalId) {
097                Criteria crit = new Criteria(ActionItem.class.getName());
098        crit.eq("principalId", principalId);
099        crit.orderBy("documentId", true);
100        List<ActionItem> results = new QueryByCriteria(entityManager, crit).toQuery().getResultList();
101        
102        return removeOutBoxItems(results);
103        }
104
105    public Collection<ActionItem> findByWorkflowUserDocumentId(String workflowId, String documentId) {
106        Criteria crit = new Criteria(ActionItem.class.getName());
107        crit.eq("principalId", workflowId);
108        crit.eq("documentId", documentId);
109        List<ActionItem> results = new QueryByCriteria(entityManager, crit).toQuery().getResultList();
110        
111        return removeOutBoxItems(results);
112    }
113
114    public Collection<ActionItem> findByDocumentTypeName(String documentTypeName) {
115        Criteria crit = new Criteria(ActionItem.class.getName());
116        crit.eq("docName", documentTypeName);
117        List<ActionItem> results = new QueryByCriteria(entityManager, crit).toQuery().getResultList();
118
119        return removeOutBoxItems(results);
120    }
121
122    public Collection<OutboxItemActionListExtension> getOutboxItemsByDocumentType(String documentTypeName) {
123        Criteria crit = new Criteria(ActionItem.class.getName());
124        crit.eq("docName", documentTypeName);
125        List<ActionItem> results = new QueryByCriteria(entityManager, crit).toQuery().getResultList();
126        List<OutboxItemActionListExtension> finalResults = new ArrayList<OutboxItemActionListExtension>();
127        for (ActionItem actionItem : results) {
128            if (actionItem instanceof OutboxItemActionListExtension) {
129                finalResults.add((OutboxItemActionListExtension)actionItem);
130            }
131        }
132        return finalResults;
133    }
134    
135    public Collection<ActionItem> findByDocumentId(String documentId) {
136        Criteria crit = new Criteria(ActionItem.class.getName());
137        crit.eq("documentId", documentId);
138        List<ActionItem> results = new QueryByCriteria(entityManager, crit).toQuery().getResultList();
139        
140        return removeOutBoxItems(results);
141    }
142
143    public Collection<ActionItem> findByActionRequestId(String actionRequestId) {
144        Criteria crit = new Criteria(ActionItem.class.getName());
145        crit.eq("actionRequestId", actionRequestId);
146        List<ActionItem> results = new QueryByCriteria(entityManager, crit).toQuery().getResultList();
147        
148        return removeOutBoxItems(results);
149    }
150
151    public void saveActionItem(ActionItem actionItem) {
152        if (actionItem.getDateAssigned() == null) {
153            actionItem.setDateAssigned(new Timestamp(new Date().getTime()));
154        }
155        
156        if(actionItem.getId()==null){
157                entityManager.persist(actionItem);
158        }else{
159                OrmUtils.merge(entityManager, actionItem);
160        }
161    }
162
163    public Collection<Recipient> findSecondaryDelegators(String principalId) {
164        Criteria notNullWorkflowCriteria = new Criteria(ActionItem.class.getName());
165        notNullWorkflowCriteria.notNull("delegatorPrincipalId");
166        Criteria notNullWorkgroupCriteria = new Criteria(ActionItem.class.getName());
167        notNullWorkgroupCriteria.notNull("delegatorGroupId");
168        Criteria orCriteria = new Criteria(ActionItem.class.getName());
169        orCriteria.or(notNullWorkflowCriteria);
170        orCriteria.or(notNullWorkgroupCriteria);
171        Criteria criteria = new Criteria(ActionItem.class.getName());
172        criteria.eq("principalId", principalId);
173        criteria.eq("delegationType", DelegationType.SECONDARY.getCode());
174        criteria.and(orCriteria);
175
176        Map<Object, Recipient> delegators = new HashMap<Object, Recipient>();
177
178        for(Object actionItem:new QueryByCriteria(entityManager, criteria).toQuery().getResultList()){
179                final String delegatorPrincipalId = ((ActionItem)actionItem).getDelegatorPrincipalId();
180                String delegatorGroupId = ((ActionItem)actionItem).getDelegatorGroupId();
181
182                if (delegatorPrincipalId != null && !delegators.containsKey(delegatorPrincipalId)) {
183                delegators.put(delegatorPrincipalId,new WebFriendlyRecipient(KimApiServiceLocator.getPersonService().getPerson(delegatorPrincipalId)));
184            }else if (delegatorGroupId != null) {
185                if (!delegators.containsKey(delegatorGroupId)) {
186                    delegators.put(delegatorGroupId, new KimGroupRecipient(KimApiServiceLocator.getGroupService().getGroup(
187                            delegatorGroupId)));
188                }
189            }
190        }
191         return delegators.values();
192    }
193
194    public Collection<Recipient> findPrimaryDelegationRecipients(String principalId) {
195        List<String> workgroupIds = KimApiServiceLocator.getGroupService().getGroupIdsByPrincipalId(principalId);
196        Criteria orCriteria = new Criteria(ActionItem.class.getName());
197        Criteria delegatorPrincipalIdCriteria = new Criteria(ActionItem.class.getName());
198        delegatorPrincipalIdCriteria.eq("delegatorPrincipalId", principalId);
199        if (CollectionUtils.isNotEmpty(workgroupIds)) {
200            Criteria delegatorWorkgroupCriteria = new Criteria(ActionItem.class.getName());
201            delegatorWorkgroupCriteria.in("delegatorGroupId", new ArrayList<String>(workgroupIds));
202            orCriteria.or(delegatorWorkgroupCriteria);
203            orCriteria.or(delegatorPrincipalIdCriteria);
204        }
205        else {
206            orCriteria.and(delegatorPrincipalIdCriteria);
207        }
208        Criteria criteria = new Criteria(ActionItem.class.getName());
209        criteria.eq("delegationType", DelegationType.PRIMARY.getCode());
210        criteria.and(orCriteria);
211
212        Map<Object, Recipient> delegators = new HashMap<Object, Recipient>();
213        for(Object actionItem:new QueryByCriteria(entityManager, criteria).toQuery().getResultList()){
214                String princlId = ((ActionItem)actionItem).getPrincipalId();
215            if (princlId != null && !delegators.containsKey(princlId)) {
216                delegators.put(princlId, new WebFriendlyRecipient(KimApiServiceLocator.getPersonService().getPerson(princlId)));
217            }
218        }
219
220        return delegators.values();
221    }
222    
223    private List<ActionItem> removeOutBoxItems(List<ActionItem> results) {
224        Iterator<ActionItem> iterator = results.iterator();
225        while(iterator.hasNext()) {
226            if(iterator.next() instanceof OutboxItemActionListExtension) {
227                iterator.remove();
228            }
229        }
230        
231        return results;
232    }
233
234    public EntityManager getEntityManager() {
235        return this.entityManager;
236    }
237
238    public void setEntityManager(EntityManager entityManager) {
239        this.entityManager = entityManager;
240    }
241
242
243}