View Javadoc

1   /**
2    * Copyright 2005-2013 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.actiontaken.dao.impl;
17  
18  import org.kuali.rice.core.framework.persistence.jpa.OrmUtils;
19  import org.kuali.rice.core.framework.persistence.jpa.criteria.Criteria;
20  import org.kuali.rice.core.framework.persistence.jpa.criteria.QueryByCriteria;
21  import org.kuali.rice.kew.actionrequest.ActionRequestValue;
22  import org.kuali.rice.kew.actiontaken.ActionTakenValue;
23  import org.kuali.rice.kew.actiontaken.dao.ActionTakenDAO;
24  import org.kuali.rice.kew.api.action.ActionType;
25  
26  import javax.persistence.EntityManager;
27  import javax.persistence.PersistenceContext;
28  import java.io.Serializable;
29  import java.sql.Timestamp;
30  import java.util.Collection;
31  import java.util.List;
32  
33  
34  /**
35   * OJB implementation of the {@link ActionTakenDAO}.
36   *
37   * @author Kuali Rice Team (rice.collab@kuali.org)
38   */
39  public class ActionTakenDAOJpaImpl implements ActionTakenDAO {
40  
41  	@PersistenceContext(unitName="kew-unit")
42  	private EntityManager entityManager;
43  
44      private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ActionTakenDAOJpaImpl.class);
45  
46      public ActionTakenValue load(String id) {
47          LOG.debug("Loading Action Taken for the given id " + id);
48          return entityManager.find(ActionTakenValue.class, id);
49      }
50  
51      public void deleteActionTaken(ActionTakenValue actionTaken) {
52          LOG.debug("deleting ActionTaken " + actionTaken.getActionTakenId());
53          entityManager.remove(entityManager.find(ActionTakenValue.class, actionTaken.getActionTakenId()));
54      }
55  
56      public ActionTakenValue findByActionTakenId(String actionTakenId) {
57          LOG.debug("finding Action Taken by actionTakenId " + actionTakenId);
58          Criteria crit = new Criteria(ActionTakenValue.class.getName());
59          crit.eq("actionTakenId", actionTakenId);
60          crit.eq("currentIndicator", Boolean.TRUE);
61          return (ActionTakenValue) new QueryByCriteria(entityManager, crit).toQuery().getSingleResult();
62      }
63  
64      public Collection<ActionTakenValue> findByDocIdAndAction(String documentId, String action) {
65          LOG.debug("finding Action Taken by documentId " + documentId + " and action " + action);
66          Criteria crit = new Criteria(ActionTakenValue.class.getName());
67          crit.eq("documentId", documentId);
68          crit.eq("actionTaken", action);
69          crit.eq("currentIndicator", Boolean.TRUE);
70          return (Collection<ActionTakenValue>) new QueryByCriteria(entityManager, crit).toQuery().getResultList();
71      }
72  
73      public Collection<ActionTakenValue> findByDocumentId(String documentId) {
74          LOG.debug("finding Action Takens by documentId " + documentId);
75          Criteria crit = new Criteria(ActionTakenValue.class.getName());
76          crit.eq("documentId", documentId);
77          crit.eq("currentIndicator", Boolean.TRUE);
78          crit.orderBy("actionDate", true);
79          return (Collection<ActionTakenValue>) new QueryByCriteria(entityManager, crit).toQuery().getResultList();
80      }
81  
82      public List<ActionTakenValue> findByDocumentIdWorkflowId(String documentId, String workflowId) {
83          LOG.debug("finding Action Takens by documentId " + documentId + " and workflowId" + workflowId);
84          Criteria crit = new Criteria(ActionTakenValue.class.getName());
85          crit.eq("documentId", documentId);
86          crit.eq("principalId", workflowId);
87          crit.eq("currentIndicator", Boolean.TRUE);
88          return (List<ActionTakenValue>) new QueryByCriteria(entityManager, crit).toQuery().getResultList();
89      }
90  
91      public List findByDocumentIdIgnoreCurrentInd(String documentId) {
92          LOG.debug("finding ActionsTaken ignoring currentInd by documentId:" + documentId);
93          Criteria crit = new Criteria(ActionTakenValue.class.getName());
94          crit.eq("documentId", documentId);
95          return (List) new QueryByCriteria(entityManager, crit);
96      }
97  
98      public void saveActionTaken(ActionTakenValue actionTaken) {
99          LOG.debug("saving ActionTaken");
100         checkNull(actionTaken.getDocumentId(), "Document ID");
101         checkNull(actionTaken.getActionTaken(), "action taken code");
102         checkNull(actionTaken.getDocVersion(), "doc version");
103         checkNull(actionTaken.getPrincipalId(), "principal ID");
104 
105         if (actionTaken.getActionDate() == null) {
106             actionTaken.setActionDate(new Timestamp(System.currentTimeMillis()));
107         }
108         if (actionTaken.getCurrentIndicator() == null) {
109             actionTaken.setCurrentIndicator(Boolean.TRUE);
110         }
111         LOG.debug("saving ActionTaken: routeHeader " + actionTaken.getDocumentId() +
112                 ", actionTaken " + actionTaken.getActionTaken() + ", principalId " + actionTaken.getPrincipalId());
113 
114         if(actionTaken.getActionTakenId()==null){
115         	entityManager.persist(actionTaken);
116         }else{
117         	OrmUtils.merge(entityManager, actionTaken);
118         }
119     }
120 
121     //TODO perhaps runtime isn't the best here, maybe a dao runtime exception
122     private void checkNull(Serializable value, String valueName) throws RuntimeException {
123         if (value == null) {
124             throw new RuntimeException("Null value for " + valueName);
125         }
126     }
127 
128     public void deleteByDocumentId(String documentId){
129 	    Criteria crit = new Criteria(ActionRequestValue.class.getName());
130 	    crit.eq("documentId", documentId);
131 	    ActionRequestValue actionRequestValue = (ActionRequestValue) new QueryByCriteria(entityManager, crit).toQuery().getSingleResult();
132 	    entityManager.remove(actionRequestValue);
133     }
134 
135     public boolean hasUserTakenAction(String workflowId, String documentId) {
136     	Criteria crit = new Criteria(ActionTakenValue.class.getName());
137 	    crit.eq("documentId", documentId);
138 	    crit.eq("principalId", workflowId);
139 	    crit.eq("currentIndicator", Boolean.TRUE);
140 	    long count = (Long) new QueryByCriteria(entityManager, crit).toCountQuery().getSingleResult();
141         return count > 0;
142     }
143 
144     @Override
145     public Timestamp getLastActionTakenDate(String documentId, ActionType actionType) {
146         // TODO - fix this!
147 
148         throw new UnsupportedOperationException("The JPA version of this method still needs to be implemented!");
149 
150     }
151 
152     public EntityManager getEntityManager() {
153         return this.entityManager;
154     }
155 
156     public void setEntityManager(EntityManager entityManager) {
157         this.entityManager = entityManager;
158     }
159 
160 }