001 /**
002 * Copyright 2005-2012 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.actionrequest.dao.impl;
017
018 import java.io.Serializable;
019 import java.sql.Timestamp;
020 import java.util.Collection;
021 import java.util.Collections;
022 import java.util.List;
023
024 import javax.persistence.EntityManager;
025 import javax.persistence.PersistenceContext;
026 import javax.persistence.Query;
027
028 import org.apache.commons.lang.StringUtils;
029 import org.kuali.rice.core.framework.persistence.jpa.OrmUtils;
030 import org.kuali.rice.kew.actionrequest.ActionRequestValue;
031 import org.kuali.rice.kew.actionrequest.dao.ActionRequestDAO;
032 import org.kuali.rice.kew.api.action.ActionRequestStatus;
033 import org.kuali.rice.kew.api.action.RecipientType;
034 import org.kuali.rice.kew.api.KewApiConstants;
035 import org.kuali.rice.kim.api.group.Group;
036
037 /**
038 * This is a description of what this class does - sgibson don't forget to fill this in.
039 *
040 * @author Kuali Rice Team (rice.collab@kuali.org)
041 */
042 public class ActionRequestDAOJpaImpl implements ActionRequestDAO {
043
044 @PersistenceContext(name = "kew-unit")
045 private EntityManager entityManager;
046
047 /**
048 * @return the entityManager
049 */
050 public EntityManager getEntityManager() {
051 return this.entityManager;
052 }
053
054 /**
055 * @param entityManager the entityManager to set
056 */
057 public void setEntityManager(EntityManager entityManager) {
058 this.entityManager = entityManager;
059 }
060
061 public void delete(String actionRequestId) {
062 ActionRequestValue actionRequestValue = (ActionRequestValue) entityManager.find(ActionRequestValue.class, actionRequestId);
063 entityManager.remove(actionRequestValue);
064 }
065
066 public void deleteByDocumentId(String documentId) {
067 // FIXME should be jpa bulk update?
068 Query query = entityManager.createNamedQuery("ActionRequestValue.FindByDocumentId");
069 query.setParameter("documentId", documentId);
070 List<ActionRequestValue> actionRequestValues = (List<ActionRequestValue>) query.getSingleResult();
071 for(ActionRequestValue arv : actionRequestValues) {
072 entityManager.remove(arv);
073 }
074 }
075
076 public boolean doesDocumentHaveUserRequest(String principalId, String documentId) {
077 Query query = entityManager.createNamedQuery("ActionRequestValue.GetUserRequestCount");
078 query.setParameter("principalId", principalId);
079 query.setParameter("documentId", documentId);
080 query.setParameter("recipientTypeCd", RecipientType.PRINCIPAL.getCode());
081 query.setParameter("currentIndicator", Boolean.TRUE);
082
083 return ((Long)query.getSingleResult()) > 0;
084 }
085
086 public List<?> findActivatedByGroup(Group group) {
087
088 Query query = entityManager.createNamedQuery("ActionRequestValue.FindActivatedByGroup");
089 query.setParameter("groupId", group.getId());
090 query.setParameter("currentIndicator", Boolean.TRUE);
091 query.setParameter("status", ActionRequestStatus.ACTIVATED.getCode());
092
093 return query.getResultList();
094 }
095
096 public List<ActionRequestValue> findAllByDocId(String documentId) {
097 Query query = entityManager.createNamedQuery("ActionRequestValue.FindAllByDocId");
098 query.setParameter("documentId", documentId);
099 query.setParameter("currentIndicator", Boolean.TRUE);
100
101 return query.getResultList();
102 }
103
104 public List<ActionRequestValue> findAllPendingByDocId(String documentId) {
105 Query query = entityManager.createNamedQuery("ActionRequestValue.FindAllPendingByDocId");
106 query.setParameter("documentId", documentId);
107 query.setParameter("currentIndicator", Boolean.TRUE);
108 query.setParameter("actionRequestStatus1", ActionRequestStatus.INITIALIZED.getCode());
109 query.setParameter("actionRequestStatus2", ActionRequestStatus.ACTIVATED.getCode());
110
111 return query.getResultList();
112 }
113
114 @SuppressWarnings("unchecked")
115 public List<ActionRequestValue> findAllRootByDocId(String documentId) {
116 Query query = entityManager.createNamedQuery("ActionRequestValue.FindAllRootByDocId");
117 query.setParameter("documentId", documentId);
118 query.setParameter("currentIndicator", Boolean.TRUE);
119
120 return (List<ActionRequestValue>) query.getResultList();
121 }
122
123 public List<ActionRequestValue> findByDocumentIdIgnoreCurrentInd(String documentId) {
124 Query query = entityManager.createNamedQuery("ActionRequestValue.FindByDocumentId");
125 query.setParameter("documentId", documentId);
126
127 return query.getResultList();
128 }
129
130 @SuppressWarnings("unchecked")
131 public List<ActionRequestValue> findByStatusAndDocId(String statusCd, String documentId) {
132 Query query = entityManager.createNamedQuery("ActionRequestValue.FindByStatusAndDocId");
133 query.setParameter("documentId", documentId);
134 query.setParameter("status", statusCd);
135 query.setParameter("currentIndicator", Boolean.TRUE);
136
137 return (List<ActionRequestValue>)query.getResultList();
138 }
139
140 public List<ActionRequestValue> findPendingByActionRequestedAndDocId(String actionRequestedCd, String documentId) {
141 Query query = entityManager.createNamedQuery("ActionRequestValue.FindPendingByActionRequestedAndDocId");
142 query.setParameter("documentId", documentId);
143 query.setParameter("currentIndicator", Boolean.TRUE);
144 query.setParameter("actionRequested", actionRequestedCd);
145 query.setParameter("actionRequestStatus1", ActionRequestStatus.INITIALIZED.getCode());
146 query.setParameter("actionRequestStatus2", ActionRequestStatus.ACTIVATED.getCode());
147
148 return query.getResultList();
149 }
150
151 public List<ActionRequestValue> findPendingByDocIdAtOrBelowRouteLevel(String documentId, Integer routeLevel) {
152 Query query = entityManager.createNamedQuery("ActionRequestValue.FindPendingByDocIdAtOrBelowRouteLevel");
153 query.setParameter("documentId", documentId);
154 query.setParameter("currentIndicator", Boolean.TRUE);
155 query.setParameter("routeLevel", routeLevel);
156 query.setParameter("status", ActionRequestStatus.DONE.getCode());
157
158 return query.getResultList();
159 }
160
161 public List<ActionRequestValue> findPendingByResponsibilityIds(Collection responsibilityIds) {
162 if (responsibilityIds == null || responsibilityIds.size() == 0)
163 return Collections.emptyList();
164
165 Query query = entityManager.createNamedQuery("ActionRequestValue.FindPendingByDocIdAtOrBelowRouteLevel");
166 query.setParameter("responsibilityIds", responsibilityIds);
167
168 return query.getResultList();
169 }
170
171 public List<ActionRequestValue> findPendingRootRequestsByDocIdAtOrBelowRouteLevel(String documentId, Integer routeLevel) {
172 Query query = entityManager.createNamedQuery("ActionRequestValue.FindPendingRootRequestsByDocIdAtOrBelowRouteLevel");
173 query.setParameter("documentId", documentId);
174 query.setParameter("currentIndicator", Boolean.TRUE);
175 query.setParameter("status", ActionRequestStatus.DONE.getCode());
176 query.setParameter("routeLevel", routeLevel);
177
178 return query.getResultList();
179 }
180
181 public List<ActionRequestValue> findPendingRootRequestsByDocIdAtRouteLevel(String documentId, Integer routeLevel) {
182 Query query = entityManager.createNamedQuery("ActionRequestValue.FindPendingRootRequestsByDocIdAtRouteLevel");
183 query.setParameter("documentId", documentId);
184 query.setParameter("currentIndicator", Boolean.TRUE);
185 query.setParameter("status", ActionRequestStatus.DONE.getCode());
186 query.setParameter("routeLevel", routeLevel);
187
188 return query.getResultList();
189 }
190
191 public List<ActionRequestValue> findPendingRootRequestsByDocIdAtRouteNode(String documentId, String nodeInstanceId) {
192 Query query = entityManager.createNamedQuery("ActionRequestValue.FindPendingRootRequestsByDocIdAtRouteNode");
193 query.setParameter("documentId", documentId);
194 query.setParameter("currentIndicator", Boolean.TRUE);
195 query.setParameter("routeNodeInstanceId", nodeInstanceId);
196 query.setParameter("actionRequestStatus1", ActionRequestStatus.INITIALIZED.getCode());
197 query.setParameter("actionRequestStatus2", ActionRequestStatus.ACTIVATED.getCode());
198
199 return query.getResultList();
200 }
201
202 public List<ActionRequestValue> findPendingRootRequestsByDocumentType(String documentTypeId) {
203 Query query = entityManager.createNamedQuery("ActionRequestValue.FindPendingRootRequestsByDocumentType");
204 query.setParameter("documentTypeId", documentTypeId);
205 query.setParameter("currentIndicator", Boolean.TRUE);
206 query.setParameter("actionRequestStatus1", ActionRequestStatus.INITIALIZED.getCode());
207 query.setParameter("actionRequestStatus2", ActionRequestStatus.ACTIVATED.getCode());
208
209 return query.getResultList();
210 }
211
212 public List<ActionRequestValue> findRootRequestsByDocIdAtRouteNode(String documentId, String nodeInstanceId) {
213 Query query = entityManager.createNamedQuery("ActionRequestValue.FindRootRequestsByDocIdAtRouteNode");
214 query.setParameter("documentId", documentId);
215 query.setParameter("currentIndicator", Boolean.TRUE);
216 query.setParameter("routeNodeInstanceId", nodeInstanceId);
217
218 return query.getResultList();
219 }
220
221 public ActionRequestValue getActionRequestByActionRequestId(String actionRequestId) {
222 return entityManager.find(ActionRequestValue.class, actionRequestId);
223 }
224
225 @SuppressWarnings("unchecked")
226 public List<String> getRequestGroupIds(String documentId) {
227 Query query = entityManager.createNamedQuery("ActionRequestValue.GetRequestGroupIds");
228 query.setParameter("documentId", documentId);
229 query.setParameter("currentIndicator", Boolean.TRUE);
230 query.setParameter("recipientTypeCd", RecipientType.GROUP.getCode());
231
232 return query.getResultList();
233 }
234
235 public void saveActionRequest(ActionRequestValue actionRequest) {
236 if ( actionRequest.getAnnotation() != null && actionRequest.getAnnotation().length() > 2000 ) {
237 actionRequest.setAnnotation( StringUtils.abbreviate(actionRequest.getAnnotation(), 2000) );
238 }
239 if(actionRequest.getActionRequestId() == null) {
240 loadDefaultValues(actionRequest);
241 entityManager.persist(actionRequest);
242 }else{
243 OrmUtils.merge(entityManager, actionRequest);
244 }
245 }
246 private void loadDefaultValues(ActionRequestValue actionRequest) {
247 checkNull(actionRequest.getActionRequested(), "action requested");
248 checkNull(actionRequest.getResponsibilityId(), "responsibility ID");
249 checkNull(actionRequest.getRouteLevel(), "route level");
250 checkNull(actionRequest.getDocVersion(), "doc version");
251 if (actionRequest.getForceAction() == null) {
252 actionRequest.setForceAction(Boolean.FALSE);
253 }
254 if (actionRequest.getStatus() == null) {
255 actionRequest.setStatus(ActionRequestStatus.INITIALIZED.getCode());
256 }
257 if (actionRequest.getPriority() == null) {
258 actionRequest.setPriority(KewApiConstants.ACTION_REQUEST_DEFAULT_PRIORITY);
259 }
260 if (actionRequest.getCurrentIndicator() == null) {
261 actionRequest.setCurrentIndicator(true);
262 }
263 actionRequest.setCreateDate(new Timestamp(System.currentTimeMillis()));
264 }
265 //TODO Runtime might not be the right thing to do here...
266 private void checkNull(Serializable value, String valueName) throws RuntimeException {
267 if (value == null) {
268 throw new RuntimeException("Null value for " + valueName);
269 }
270 }
271
272 public List<ActionRequestValue> findActivatedByGroup(String groupId) {
273 Query query = entityManager.createNamedQuery("ActionRequestValue.FindByStatusAndGroupId");
274 query.setParameter("status", ActionRequestStatus.ACTIVATED.getCode());
275 query.setParameter("currentIndicator", Boolean.TRUE);
276 query.setParameter("groupId", groupId);
277
278 return query.getResultList();
279 }
280
281 @Override
282 public ActionRequestValue getRoleActionRequestByActionTakenId(String actionTakenId) {
283 throw new UnsupportedOperationException("not yet implemented");
284 }
285 }