View Javadoc

1   /**
2    * Copyright 2005-2014 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kew.actionitem.dao.impl;
17  
18  import org.apache.commons.collections.CollectionUtils;
19  import org.kuali.rice.core.api.delegation.DelegationType;
20  import org.kuali.rice.core.framework.persistence.jpa.OrmUtils;
21  import org.kuali.rice.core.framework.persistence.jpa.criteria.Criteria;
22  import org.kuali.rice.core.framework.persistence.jpa.criteria.QueryByCriteria;
23  import org.kuali.rice.kew.actionitem.ActionItem;
24  import org.kuali.rice.kew.actionitem.OutboxItemActionListExtension;
25  import org.kuali.rice.kew.actionitem.dao.ActionItemDAO;
26  import org.kuali.rice.kew.actionrequest.KimGroupRecipient;
27  import org.kuali.rice.kew.actionrequest.Recipient;
28  import org.kuali.rice.kew.util.WebFriendlyRecipient;
29  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
30  
31  import javax.persistence.EntityManager;
32  import javax.persistence.PersistenceContext;
33  import java.sql.Timestamp;
34  import java.util.ArrayList;
35  import java.util.Collection;
36  import java.util.Date;
37  import java.util.HashMap;
38  import java.util.Iterator;
39  import java.util.List;
40  import java.util.Map;
41  
42  /**
43   * OJB implementation of {@link ActionItemDAO}.
44   *
45   * @author Kuali Rice Team (rice.collab@kuali.org)
46   */
47  public class ActionItemDAOJpaImpl implements ActionItemDAO {
48  	@PersistenceContext(unitName="kew-unit")
49  	private EntityManager entityManager;
50  
51      public ActionItem findByActionItemId(String actionItemId) {
52      	return entityManager.find(ActionItem.class, actionItemId);
53      }
54  
55      public void deleteActionItems(Long actionRequestId) {
56          Criteria crit = new Criteria(ActionItem.class.getName());
57          crit.eq("actionRequestId", actionRequestId);
58          for(Object actionItem:new QueryByCriteria(entityManager,crit).toQuery().getResultList()){
59              if( ! (actionItem instanceof OutboxItemActionListExtension)) {
60                  entityManager.remove(actionItem);
61              }
62          }
63  
64      }
65  
66      public void deleteActionItem(ActionItem actionItem) {
67      	entityManager.remove(findByActionItemId(actionItem.getId()));
68      }
69  
70      public void deleteByDocumentIdWorkflowUserId(String documentId, String workflowUserId) {
71          Criteria crit = new Criteria(ActionItem.class.getName());
72          crit.eq("documentId", documentId);
73          crit.eq("principalId", workflowUserId);
74          for(Object actionItem: new QueryByCriteria(entityManager,crit).toQuery().getResultList()){
75              if( ! (actionItem instanceof OutboxItemActionListExtension)) {
76                  entityManager.remove(actionItem);
77              }
78          }
79      }
80  
81      public void deleteByDocumentId(String documentId) {
82          Criteria crit = new Criteria(ActionItem.class.getName());
83          crit.eq("documentId", documentId);
84          for(Object actionItem: new QueryByCriteria(entityManager,crit).toQuery().getResultList()){
85              if( ! (actionItem instanceof OutboxItemActionListExtension)) {
86                  entityManager.remove(actionItem);
87              }
88          }
89      }
90  
91      /**
92  	 * This method replaces findByWorkflowUser
93  	 *
94  	 * @see org.kuali.rice.kew.actionitem.dao.ActionItemDAO#findByPrincipalId(java.lang.String)
95  	 */
96  	public Collection<ActionItem> findByPrincipalId(String principalId) {
97  		Criteria crit = new Criteria(ActionItem.class.getName());
98          crit.eq("principalId", principalId);
99          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 }