001    /**
002     * Copyright 2005-2014 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     */
016    package org.kuali.rice.kew.actionitem.dao.impl;
017    
018    import org.apache.commons.collections.CollectionUtils;
019    import org.kuali.rice.core.api.delegation.DelegationType;
020    import org.kuali.rice.core.framework.persistence.jpa.OrmUtils;
021    import org.kuali.rice.core.framework.persistence.jpa.criteria.Criteria;
022    import org.kuali.rice.core.framework.persistence.jpa.criteria.QueryByCriteria;
023    import org.kuali.rice.kew.actionitem.ActionItem;
024    import org.kuali.rice.kew.actionitem.OutboxItemActionListExtension;
025    import org.kuali.rice.kew.actionitem.dao.ActionItemDAO;
026    import org.kuali.rice.kew.actionrequest.KimGroupRecipient;
027    import org.kuali.rice.kew.actionrequest.Recipient;
028    import org.kuali.rice.kew.util.WebFriendlyRecipient;
029    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
030    
031    import javax.persistence.EntityManager;
032    import javax.persistence.PersistenceContext;
033    import java.sql.Timestamp;
034    import java.util.ArrayList;
035    import java.util.Collection;
036    import java.util.Date;
037    import java.util.HashMap;
038    import java.util.Iterator;
039    import java.util.List;
040    import java.util.Map;
041    
042    /**
043     * OJB implementation of {@link ActionItemDAO}.
044     *
045     * @author Kuali Rice Team (rice.collab@kuali.org)
046     */
047    public 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    }