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.actiontaken.dao.impl;
017
018 import org.kuali.rice.core.framework.persistence.jpa.OrmUtils;
019 import org.kuali.rice.core.framework.persistence.jpa.criteria.Criteria;
020 import org.kuali.rice.core.framework.persistence.jpa.criteria.QueryByCriteria;
021 import org.kuali.rice.kew.actionrequest.ActionRequestValue;
022 import org.kuali.rice.kew.actiontaken.ActionTakenValue;
023 import org.kuali.rice.kew.actiontaken.dao.ActionTakenDAO;
024
025 import javax.persistence.EntityManager;
026 import javax.persistence.PersistenceContext;
027 import java.io.Serializable;
028 import java.sql.Timestamp;
029 import java.util.Collection;
030 import java.util.List;
031
032
033 /**
034 * OJB implementation of the {@link ActionTakenDAO}.
035 *
036 * @author Kuali Rice Team (rice.collab@kuali.org)
037 */
038 public class ActionTakenDAOJpaImpl implements ActionTakenDAO {
039
040 @PersistenceContext(unitName="kew-unit")
041 private EntityManager entityManager;
042
043 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ActionTakenDAOJpaImpl.class);
044
045 public ActionTakenValue load(String id) {
046 LOG.debug("Loading Action Taken for the given id " + id);
047 return entityManager.find(ActionTakenValue.class, id);
048 }
049
050 public void deleteActionTaken(ActionTakenValue actionTaken) {
051 LOG.debug("deleting ActionTaken " + actionTaken.getActionTakenId());
052 entityManager.remove(entityManager.find(ActionTakenValue.class, actionTaken.getActionTakenId()));
053 }
054
055 public ActionTakenValue findByActionTakenId(String actionTakenId) {
056 LOG.debug("finding Action Taken by actionTakenId " + actionTakenId);
057 Criteria crit = new Criteria(ActionTakenValue.class.getName());
058 crit.eq("actionTakenId", actionTakenId);
059 crit.eq("currentIndicator", Boolean.TRUE);
060 return (ActionTakenValue) new QueryByCriteria(entityManager, crit).toQuery().getSingleResult();
061 }
062
063 public Collection<ActionTakenValue> findByDocIdAndAction(String documentId, String action) {
064 LOG.debug("finding Action Taken by documentId " + documentId + " and action " + action);
065 Criteria crit = new Criteria(ActionTakenValue.class.getName());
066 crit.eq("documentId", documentId);
067 crit.eq("actionTaken", action);
068 crit.eq("currentIndicator", Boolean.TRUE);
069 return (Collection<ActionTakenValue>) new QueryByCriteria(entityManager, crit).toQuery().getResultList();
070 }
071
072 public Collection<ActionTakenValue> findByDocumentId(String documentId) {
073 LOG.debug("finding Action Takens by documentId " + documentId);
074 Criteria crit = new Criteria(ActionTakenValue.class.getName());
075 crit.eq("documentId", documentId);
076 crit.eq("currentIndicator", Boolean.TRUE);
077 crit.orderBy("actionDate", true);
078 return (Collection<ActionTakenValue>) new QueryByCriteria(entityManager, crit).toQuery().getResultList();
079 }
080
081 public List<ActionTakenValue> findByDocumentIdWorkflowId(String documentId, String workflowId) {
082 LOG.debug("finding Action Takens by documentId " + documentId + " and workflowId" + workflowId);
083 Criteria crit = new Criteria(ActionTakenValue.class.getName());
084 crit.eq("documentId", documentId);
085 crit.eq("principalId", workflowId);
086 crit.eq("currentIndicator", Boolean.TRUE);
087 return (List<ActionTakenValue>) new QueryByCriteria(entityManager, crit).toQuery().getResultList();
088 }
089
090 public List findByDocumentIdIgnoreCurrentInd(String documentId) {
091 LOG.debug("finding ActionsTaken ignoring currentInd by documentId:" + documentId);
092 Criteria crit = new Criteria(ActionTakenValue.class.getName());
093 crit.eq("documentId", documentId);
094 return (List) new QueryByCriteria(entityManager, crit);
095 }
096
097 public void saveActionTaken(ActionTakenValue actionTaken) {
098 LOG.debug("saving ActionTaken");
099 checkNull(actionTaken.getDocumentId(), "Document ID");
100 checkNull(actionTaken.getActionTaken(), "action taken code");
101 checkNull(actionTaken.getDocVersion(), "doc version");
102 checkNull(actionTaken.getPrincipalId(), "principal ID");
103
104 if (actionTaken.getActionDate() == null) {
105 actionTaken.setActionDate(new Timestamp(System.currentTimeMillis()));
106 }
107 if (actionTaken.getCurrentIndicator() == null) {
108 actionTaken.setCurrentIndicator(Boolean.TRUE);
109 }
110 LOG.debug("saving ActionTaken: routeHeader " + actionTaken.getDocumentId() +
111 ", actionTaken " + actionTaken.getActionTaken() + ", principalId " + actionTaken.getPrincipalId());
112
113 if(actionTaken.getActionTakenId()==null){
114 entityManager.persist(actionTaken);
115 }else{
116 OrmUtils.merge(entityManager, actionTaken);
117 }
118 }
119
120 //TODO perhaps runtime isn't the best here, maybe a dao runtime exception
121 private void checkNull(Serializable value, String valueName) throws RuntimeException {
122 if (value == null) {
123 throw new RuntimeException("Null value for " + valueName);
124 }
125 }
126
127 public void deleteByDocumentId(String documentId){
128 Criteria crit = new Criteria(ActionRequestValue.class.getName());
129 crit.eq("documentId", documentId);
130 ActionRequestValue actionRequestValue = (ActionRequestValue) new QueryByCriteria(entityManager, crit).toQuery().getSingleResult();
131 entityManager.remove(actionRequestValue);
132 }
133
134 public boolean hasUserTakenAction(String workflowId, String documentId) {
135 Criteria crit = new Criteria(ActionTakenValue.class.getName());
136 crit.eq("documentId", documentId);
137 crit.eq("principalId", workflowId);
138 crit.eq("currentIndicator", Boolean.TRUE);
139 long count = (Long) new QueryByCriteria(entityManager, crit).toCountQuery().getSingleResult();
140 return count > 0;
141 }
142
143 public EntityManager getEntityManager() {
144 return this.entityManager;
145 }
146
147 public void setEntityManager(EntityManager entityManager) {
148 this.entityManager = entityManager;
149 }
150
151 }