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