001 /**
002 * Copyright 2005-2014 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;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.joda.time.DateTime;
020 import org.kuali.rice.core.api.util.RiceConstants;
021 import org.kuali.rice.kew.actionrequest.ActionRequestValue;
022 import org.kuali.rice.kew.actionrequest.KimGroupRecipient;
023 import org.kuali.rice.kew.actionrequest.KimPrincipalRecipient;
024 import org.kuali.rice.kew.actionrequest.Recipient;
025 import org.kuali.rice.kew.actionrequest.service.ActionRequestService;
026 import org.kuali.rice.kew.actiontaken.dao.impl.ActionTakenDaoJpa;
027 import org.kuali.rice.kew.api.KewApiConstants;
028 import org.kuali.rice.kew.api.action.ActionTaken;
029 import org.kuali.rice.kew.api.action.ActionType;
030 import org.kuali.rice.kew.api.util.CodeTranslator;
031 import org.kuali.rice.kew.service.KEWServiceLocator;
032 import org.kuali.rice.kim.api.group.Group;
033 import org.kuali.rice.kim.api.identity.principal.Principal;
034 import org.kuali.rice.kim.api.role.Role;
035 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
036 import org.kuali.rice.krad.data.jpa.converters.Boolean01Converter;
037 import org.kuali.rice.krad.data.jpa.PortableSequenceGenerator;
038
039 import javax.persistence.Column;
040 import javax.persistence.Convert;
041 import javax.persistence.Entity;
042 import javax.persistence.GeneratedValue;
043 import javax.persistence.Id;
044 import javax.persistence.NamedQueries;
045 import javax.persistence.NamedQuery;
046 import javax.persistence.OneToMany;
047 import javax.persistence.Table;
048 import javax.persistence.Transient;
049 import javax.persistence.Version;
050 import java.io.Serializable;
051 import java.sql.Timestamp;
052 import java.util.ArrayList;
053 import java.util.Collection;
054 import java.util.List;
055 import java.util.Map;
056
057 /**
058 * Model object mapped to ojb for representing actions taken on documents by users. The type of the action is indicated
059 * by the {@link #actionTaken} code which will be a valid code value from {@link ActionType}.
060 *
061 * @author Kuali Rice Team (rice.collab@kuali.org)
062 */
063 @Entity
064 @Table(name = "KREW_ACTN_TKN_T")
065 @NamedQueries({
066 @NamedQuery(name = ActionTakenDaoJpa.GET_LAST_ACTION_TAKEN_DATE_NAME,
067 query = ActionTakenDaoJpa.GET_LAST_ACTION_TAKEN_DATE_QUERY)
068 })
069 public class ActionTakenValue implements Serializable {
070
071 private static final long serialVersionUID = -81505450567067594L;
072
073 @Id
074 @GeneratedValue(generator = "KREW_ACTN_TKN_S")
075 @PortableSequenceGenerator(name = "KREW_ACTN_TKN_S")
076 @Column(name="ACTN_TKN_ID", nullable = false)
077 private String actionTakenId;
078
079 @Column(name="DOC_HDR_ID", nullable = false)
080 private String documentId;
081
082 @Column(name="ACTN_CD", nullable = false)
083 private String actionTaken;
084
085 @Column(name="ACTN_DT", nullable = false)
086 private Timestamp actionDate;
087
088 @Column(name="ANNOTN")
089 private String annotation = "";
090
091 @Column(name="DOC_VER_NBR", nullable = false)
092 private Integer docVersion;
093
094 @Column(name="PRNCPL_ID", nullable = false)
095 private String principalId;
096
097 @Column(name="DLGTR_PRNCPL_ID")
098 private String delegatorPrincipalId;
099
100 @Column(name="DLGTR_GRP_ID")
101 private String delegatorGroupId;
102
103 @Column(name="CUR_IND")
104 @Convert(converter = Boolean01Converter.class)
105 private Boolean currentIndicator = Boolean.TRUE;
106
107 @Version
108 @Column(name="VER_NBR")
109 private Integer lockVerNbr;
110
111 @OneToMany(mappedBy = "actionTaken")
112 private Collection<ActionRequestValue> actionRequests;
113
114 @Transient private String actionDateString;
115
116 public Principal getPrincipal() {
117 return getPrincipalForId( principalId );
118 }
119
120 public String getPrincipalDisplayName() {
121 return KEWServiceLocator.getIdentityHelperService().getPerson(getPrincipalId()).getName();
122 }
123
124 public Principal getDelegatorPrincipal() {
125 return getPrincipalForId(delegatorPrincipalId);
126 }
127
128 public Group getDelegatorGroup()
129 {
130 return KimApiServiceLocator.getGroupService()
131 .getGroup(String.valueOf(delegatorGroupId));
132 }
133
134 public void setDelegator(Recipient recipient) {
135 if (recipient instanceof KimPrincipalRecipient) {
136 setDelegatorPrincipalId(((KimPrincipalRecipient)recipient).getPrincipalId());
137 } else if (recipient instanceof KimGroupRecipient) {
138 setDelegatorGroupId(((KimGroupRecipient)recipient).getGroup().getId());
139 } else {
140 setDelegatorPrincipalId(null);
141 setDelegatorGroupId(null);
142 }
143 }
144
145 public boolean isForDelegator() {
146 return getDelegatorPrincipalId() != null || getDelegatorGroupId() != null || getDelegatorRoleId() != null;
147 }
148
149 public String getDelegatorDisplayName() {
150 if (getDelegatorPrincipalId() != null) {
151 return KEWServiceLocator.getIdentityHelperService().getPerson(this.getDelegatorPrincipalId()).getName();
152 } else if (getDelegatorGroupId() != null) {
153 return getDelegatorGroup().getName();
154 } else {
155 String delegatorRoleId = getDelegatorRoleId();
156 if (delegatorRoleId != null) {
157 Role role = KimApiServiceLocator.getRoleService().getRole(delegatorRoleId);
158 if(role != null) {
159 return role.getName();
160 } else {
161 return "";
162 }
163 } else {
164 return "";
165 }
166 }
167 }
168
169 private Principal getPrincipalForId(String principalId) {
170 Principal principal = null;
171
172 if (!StringUtils.isBlank(principalId)) {
173 principal = KEWServiceLocator.getIdentityHelperService().getPrincipal(principalId);
174 }
175
176 return principal;
177 }
178
179 public String getActionTakenLabel() {
180 return CodeTranslator.getActionTakenLabel(actionTaken);
181 }
182
183 public Collection<ActionRequestValue> getActionRequests() {
184 if (actionRequests == null) {
185 setActionRequests(new ArrayList<ActionRequestValue>());
186 }
187 return actionRequests;
188 }
189
190 public void setActionRequests(Collection<ActionRequestValue> actionRequests) {
191 this.actionRequests = actionRequests;
192 }
193
194 public Timestamp getActionDate() {
195 return actionDate;
196 }
197
198 public void setActionDate(Timestamp actionDate) {
199 this.actionDate = actionDate;
200 }
201
202 public String getActionTaken() {
203 return actionTaken;
204 }
205
206 public void setActionTaken(String actionTaken) {
207 this.actionTaken = actionTaken;
208 }
209
210 public String getActionTakenId() {
211 return actionTakenId;
212 }
213
214 public void setActionTakenId(String actionTakenId) {
215 this.actionTakenId = actionTakenId;
216 }
217
218 public String getAnnotation() {
219 return annotation;
220 }
221
222 public void setAnnotation(String annotation) {
223 this.annotation = annotation;
224 }
225
226 public String getDelegatorPrincipalId() {
227 return delegatorPrincipalId;
228 }
229
230 public void setDelegatorPrincipalId(String delegatorPrincipalId) {
231 this.delegatorPrincipalId = delegatorPrincipalId;
232 }
233
234 public String getDelegatorGroupId() {
235 return delegatorGroupId;
236 }
237
238 public void setDelegatorGroupId(String delegatorGroupId) {
239 this.delegatorGroupId = delegatorGroupId;
240 }
241
242 public String getDelegatorRoleId() {
243 // this could (perhaps) happen when running a simulation
244 if (actionTakenId == null) {
245 return null;
246 }
247 ActionRequestValue actionRequest = KEWServiceLocator.getActionRequestService().getActionRequestForRole(actionTakenId);
248 if (actionRequest != null) {
249 return actionRequest.getRoleName();
250 } else {
251 return null;
252 }
253 }
254
255 public Integer getDocVersion() {
256 return docVersion;
257 }
258
259 public void setDocVersion(Integer docVersion) {
260 this.docVersion = docVersion;
261 }
262
263 public Integer getLockVerNbr() {
264 return lockVerNbr;
265 }
266
267 public void setLockVerNbr(Integer lockVerNbr) {
268 this.lockVerNbr = lockVerNbr;
269 }
270
271 public String getDocumentId() {
272 return documentId;
273 }
274
275 public void setDocumentId(String documentId) {
276 this.documentId = documentId;
277 }
278
279 public String getPrincipalId() {
280 return principalId;
281 }
282
283 public void setPrincipalId(String principalId) {
284 this.principalId = principalId;
285 }
286
287 public Boolean getCurrentIndicator() {
288 return currentIndicator;
289 }
290
291 public void setCurrentIndicator(Boolean currentIndicator) {
292 this.currentIndicator = currentIndicator;
293 }
294
295 public Collection getRootActionRequests() {
296 return getActionRequestService().getRootRequests(getActionRequests());
297 }
298
299 private ActionRequestService getActionRequestService() {
300 return KEWServiceLocator.getService(KEWServiceLocator.ACTION_REQUEST_SRV);
301 }
302
303 public String getActionDateString() {
304 if(StringUtils.isBlank(actionDateString)) {
305 return RiceConstants.getDefaultDateFormat().format(getActionDate());
306 } else {
307 return actionDateString;
308 }
309 }
310 public void setActionDateString(String actionDateString) {
311 this.actionDateString = actionDateString;
312 }
313
314 public boolean isApproval() {
315 return KewApiConstants.ACTION_TAKEN_APPROVED_CD.equals(getActionTaken());
316 }
317
318 public boolean isCompletion() {
319 return KewApiConstants.ACTION_TAKEN_COMPLETED_CD.equals(getActionTaken());
320 }
321
322 public ActionTakenValue deepCopy(Map<Object, Object> visited) {
323 if (visited.containsKey(this)) {
324 return (ActionTakenValue)visited.get(this);
325 }
326 ActionTakenValue copy = new ActionTakenValue();
327 visited.put(this, copy);
328 copy.actionTakenId = actionTakenId;
329 copy.documentId = documentId;
330 copy.actionTaken = actionTaken;
331 if (actionDate != null) {
332 copy.actionDate = new Timestamp(actionDate.getTime());
333 }
334 copy.annotation = annotation;
335 copy.docVersion = docVersion;
336 copy.principalId = principalId;
337 copy.delegatorPrincipalId = delegatorPrincipalId;
338 copy.delegatorGroupId = delegatorGroupId;
339 copy.currentIndicator = currentIndicator;
340 copy.lockVerNbr = lockVerNbr;
341 if (actionRequests != null) {
342 List<ActionRequestValue> copies = new ArrayList<ActionRequestValue>();
343 for (ActionRequestValue actionRequest : actionRequests) {
344 copies.add(actionRequest.deepCopy(visited));
345 }
346 copy.actionRequests = copies;
347 }
348 copy.actionDateString = actionDateString;
349 return copy;
350 }
351
352 public static ActionTaken to(ActionTakenValue actionTakenBo) {
353 if (actionTakenBo == null) {
354 return null;
355 }
356 ActionTaken.Builder builder = ActionTaken.Builder.create(actionTakenBo.getActionTakenId(),
357 actionTakenBo.getDocumentId(),
358 actionTakenBo.getPrincipalId(),
359 ActionType.fromCode(actionTakenBo.getActionTaken()));
360 if (actionTakenBo.getActionDate() != null) {
361 builder.setActionDate(new DateTime(actionTakenBo.getActionDate().getTime()));
362 }
363 builder.setAnnotation(actionTakenBo.getAnnotation());
364 builder.setCurrent(actionTakenBo.getCurrentIndicator().booleanValue());
365 builder.setDelegatorGroupId(actionTakenBo.getDelegatorGroupId());
366 builder.setDelegatorPrincipalId(actionTakenBo.getDelegatorPrincipalId());
367 return builder.build();
368 }
369
370 public boolean isSuperUserAction() {
371 if ( KewApiConstants.ACTION_TAKEN_SU_ACTION_REQUEST_ACKNOWLEDGED_CD.equals(actionTaken) ||
372 KewApiConstants.ACTION_TAKEN_SU_ACTION_REQUEST_FYI_CD.equals(actionTaken) ||
373 KewApiConstants.ACTION_TAKEN_SU_ACTION_REQUEST_COMPLETED_CD.equals(actionTaken) ||
374 KewApiConstants.ACTION_TAKEN_SU_ACTION_REQUEST_APPROVED_CD.equals(actionTaken) ||
375 KewApiConstants.ACTION_TAKEN_SU_ROUTE_LEVEL_APPROVED_CD.equals(actionTaken) ||
376 KewApiConstants.ACTION_TAKEN_SU_RETURNED_TO_PREVIOUS_CD.equals(actionTaken) ||
377 KewApiConstants.ACTION_TAKEN_SU_DISAPPROVED_CD.equals(actionTaken) ||
378 KewApiConstants.ACTION_TAKEN_SU_CANCELED_CD.equals(actionTaken) ||
379 KewApiConstants.ACTION_TAKEN_SU_APPROVED_CD.equals(actionTaken)
380 ) {
381 return true;
382 } else {
383 return false;
384 }
385 }
386 }