001 /**
002 * Copyright 2005-2011 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.apache.log4j.Logger;
020 import org.apache.ojb.broker.query.Criteria;
021 import org.apache.ojb.broker.query.QueryByCriteria;
022 import org.apache.ojb.broker.query.QueryFactory;
023 import org.apache.ojb.broker.query.ReportQueryByCriteria;
024 import org.kuali.rice.core.api.delegation.DelegationType;
025 import org.kuali.rice.kew.actionitem.ActionItem;
026 import org.kuali.rice.kew.actionitem.OutboxItemActionListExtension;
027 import org.kuali.rice.kew.actionitem.dao.ActionItemDAO;
028 import org.kuali.rice.kew.actionrequest.KimGroupRecipient;
029 import org.kuali.rice.kew.actionrequest.Recipient;
030 import org.kuali.rice.kew.util.WebFriendlyRecipient;
031 import org.kuali.rice.kim.api.identity.Person;
032 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
033 import org.springmodules.orm.ojb.support.PersistenceBrokerDaoSupport;
034
035 import java.sql.Timestamp;
036 import java.util.Collection;
037 import java.util.Date;
038 import java.util.HashMap;
039 import java.util.Iterator;
040 import java.util.List;
041 import java.util.Map;
042 /**
043 * OJB implementation of {@link ActionItemDAO}.
044 *
045 * @author Kuali Rice Team (rice.collab@kuali.org)
046 */
047 public class ActionItemDAOOjbImpl extends PersistenceBrokerDaoSupport implements ActionItemDAO {
048
049
050 private static final Logger LOG = Logger.getLogger(ActionItemDAOOjbImpl.class);
051
052
053 public ActionItem findByActionItemId(String actionItemId) {
054 Criteria crit = new Criteria();
055 crit.addEqualTo("id", actionItemId);
056 return (ActionItem) this.getPersistenceBrokerTemplate().getObjectByQuery(new QueryByCriteria(ActionItem.class, crit));
057 }
058
059 public void deleteActionItems(Long actionRequestId) {
060 Criteria crit = new Criteria();
061 crit.addEqualTo("actionRequestId", actionRequestId);
062 this.getPersistenceBrokerTemplate().deleteByQuery(new QueryByCriteria(ActionItem.class, crit));
063 }
064
065 public void deleteActionItem(ActionItem actionItem) {
066 this.getPersistenceBrokerTemplate().delete(actionItem);
067 }
068
069 public void deleteByDocumentIdWorkflowUserId(String documentId, String workflowUserId) {
070 Criteria crit = new Criteria();
071 crit.addEqualTo("documentId", documentId);
072 crit.addEqualTo("principalId", workflowUserId);
073 this.getPersistenceBrokerTemplate().deleteByQuery(new QueryByCriteria(ActionItem.class, crit));
074 }
075
076 public void deleteByDocumentId(String documentId) {
077 Criteria crit = new Criteria();
078 crit.addEqualTo("documentId", documentId);
079 this.getPersistenceBrokerTemplate().deleteByQuery(new QueryByCriteria(ActionItem.class, crit));
080 }
081
082 public Collection<ActionItem> findByWorkflowUserDocumentId(String workflowId, String documentId) {
083 Criteria crit = new Criteria();
084 crit.addEqualTo("principalId", workflowId);
085 crit.addEqualTo("documentId", documentId);
086 return this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(ActionItem.class, crit));
087 }
088
089 public Collection<ActionItem> findByDocumentId(String documentId) {
090 Criteria crit = new Criteria();
091 crit.addEqualTo("documentId", documentId);
092 return this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(ActionItem.class, crit));
093 }
094
095 public Collection<ActionItem> findByActionRequestId(String actionRequestId) {
096 Criteria crit = new Criteria();
097 crit.addEqualTo("actionRequestId", actionRequestId);
098 return this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(ActionItem.class, crit));
099 }
100
101 public Collection<ActionItem> findByDocumentTypeName(String documentTypeName) {
102 return getItemsByDocumentType(ActionItem.class, documentTypeName);
103 }
104
105 public Collection<ActionItem> getOutboxItemsByDocumentType(String documentTypeName) {
106 return getItemsByDocumentType(OutboxItemActionListExtension.class, documentTypeName);
107 }
108
109 private Collection<ActionItem> getItemsByDocumentType(Class<? extends ActionItem> objectClass, String documentTypeName) {
110 Criteria crit = new Criteria();
111 crit.addEqualTo("docName", documentTypeName);
112 return this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(objectClass, crit));
113 }
114
115 public void saveActionItem(ActionItem actionItem) {
116 if (actionItem.getDateAssigned() == null) {
117 actionItem.setDateAssigned(new Timestamp(new Date().getTime()));
118 }
119 this.getPersistenceBrokerTemplate().store(actionItem);
120 }
121
122 public Collection<Recipient> findSecondaryDelegators(String principalId) {
123 Criteria notNullWorkflowCriteria = new Criteria();
124 notNullWorkflowCriteria.addNotNull("delegatorPrincipalId");
125 Criteria notNullWorkgroupCriteria = new Criteria();
126 notNullWorkgroupCriteria.addNotNull("delegatorGroupId");
127 Criteria orCriteria = new Criteria();
128 orCriteria.addOrCriteria(notNullWorkflowCriteria);
129 orCriteria.addOrCriteria(notNullWorkgroupCriteria);
130 Criteria criteria = new Criteria();
131 criteria.addEqualTo("principalId", principalId);
132 criteria.addEqualTo("delegationType", DelegationType.SECONDARY.getCode());
133 criteria.addAndCriteria(orCriteria);
134 ReportQueryByCriteria query = QueryFactory.newReportQuery(ActionItem.class, criteria);
135
136 query.setAttributes(new String[]{"delegatorPrincipalId", "delegatorGroupId"});
137 Map<Object, Recipient> delegators = new HashMap<Object, Recipient>();
138 Iterator iterator = this.getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query);
139 while (iterator.hasNext()) {
140 Object[] ids = (Object[]) iterator.next();
141 if (ids[0] != null && !delegators.containsKey((String) ids[0])) {
142 WebFriendlyRecipient rec = new WebFriendlyRecipient(KimApiServiceLocator.getPersonService().getPerson((String) ids[0]));
143 delegators.put((String) ids[0], rec);
144 } else if (ids[1] != null) {
145 String workgroupId = ids[1].toString();
146 if (!delegators.containsKey(workgroupId)) {
147 delegators.put(workgroupId, new KimGroupRecipient(KimApiServiceLocator.getGroupService().getGroup(workgroupId)));
148 }
149 }
150 }
151 return delegators.values();
152 }
153
154 public Collection<Recipient> findPrimaryDelegationRecipients(String principalId) {
155 List<String> workgroupIds = KimApiServiceLocator.getGroupService().getGroupIdsByPrincipalId(principalId);
156 Criteria orCriteria = new Criteria();
157 Criteria delegatorPrincipalIdCriteria = new Criteria();
158 delegatorPrincipalIdCriteria.addEqualTo("delegatorPrincipalId", principalId);
159 if (CollectionUtils.isNotEmpty(workgroupIds)) {
160 Criteria delegatorWorkgroupCriteria = new Criteria();
161 delegatorWorkgroupCriteria.addIn("delegatorGroupId", workgroupIds);
162 orCriteria.addOrCriteria(delegatorWorkgroupCriteria);
163 orCriteria.addOrCriteria(delegatorPrincipalIdCriteria);
164 }
165 else {
166 orCriteria.addAndCriteria(delegatorPrincipalIdCriteria);
167 }
168 Criteria criteria = new Criteria();
169 criteria.addEqualTo("delegationType", DelegationType.PRIMARY.getCode());
170 criteria.addAndCriteria(orCriteria);
171 ReportQueryByCriteria query = QueryFactory.newReportQuery(ActionItem.class, criteria, true);
172
173 query.setAttributes(new String[]{"principalId"});
174 Map<Object, Recipient> delegators = new HashMap<Object, Recipient>();
175 Iterator iterator = this.getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query);
176 while (iterator.hasNext()) {
177 Object[] ids = (Object[]) iterator.next();
178 if (ids[0] != null && !delegators.containsKey((String) ids[0])) {
179
180 Person person = KimApiServiceLocator.getPersonService().getPerson((String) ids[0]);
181 if (person != null) {
182 WebFriendlyRecipient rec = new WebFriendlyRecipient(person);
183 delegators.put((String) ids[0],rec);
184 LOG.warn("The name for " + (String) ids[0] + " was not added to the primary delegate drop down list because the delegate does not exist.");
185 }
186
187 }
188 }
189 return delegators.values();
190 }
191
192 /**
193 * This overridden method replaced findByWorkfowUser
194 *
195 * @see org.kuali.rice.kew.actionitem.dao.ActionItemDAO#findByPrincipalId(java.lang.String)
196 */
197 public Collection<ActionItem> findByPrincipalId(String principalId) {
198 Criteria crit = new Criteria();
199 crit.addEqualTo("principalId", principalId);
200 QueryByCriteria query = new QueryByCriteria(ActionItem.class, crit);
201 query.addOrderByAscending("documentId");
202 return this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
203 }
204
205 }