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;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.hibernate.annotations.Fetch;
020    import org.hibernate.annotations.FetchMode;
021    import org.hibernate.annotations.GenericGenerator;
022    import org.hibernate.annotations.Parameter;
023    import org.joda.time.DateTime;
024    import org.kuali.rice.core.api.util.RiceConstants;
025    import org.kuali.rice.core.framework.persistence.jpa.OrmUtils;
026    import org.kuali.rice.kew.actionrequest.ActionRequestValue;
027    import org.kuali.rice.kew.actionrequest.KimGroupRecipient;
028    import org.kuali.rice.kew.actionrequest.KimPrincipalRecipient;
029    import org.kuali.rice.kew.actionrequest.Recipient;
030    import org.kuali.rice.kew.actionrequest.service.ActionRequestService;
031    import org.kuali.rice.kew.api.action.ActionTaken;
032    import org.kuali.rice.kew.api.action.ActionType;
033    import org.kuali.rice.kew.api.util.CodeTranslator;
034    import org.kuali.rice.kew.service.KEWServiceLocator;
035    import org.kuali.rice.kew.api.KewApiConstants;
036    import org.kuali.rice.kim.api.group.Group;
037    import org.kuali.rice.kim.api.identity.principal.Principal;
038    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
039    
040    import javax.persistence.Column;
041    import javax.persistence.Entity;
042    import javax.persistence.FetchType;
043    import javax.persistence.GeneratedValue;
044    import javax.persistence.Id;
045    import javax.persistence.OneToMany;
046    import javax.persistence.Table;
047    import javax.persistence.Transient;
048    import javax.persistence.Version;
049    import java.io.Serializable;
050    import java.sql.Timestamp;
051    import java.util.ArrayList;
052    import java.util.Collection;
053    
054    
055    /**
056     * Model object mapped to ojb for representing actions taken on documents by
057     * users.
058     *
059     * @author Kuali Rice Team (rice.collab@kuali.org)
060     */
061    @Entity
062    //@Sequence(name="KREW_ACTN_TKN_S", property="actionTakenId")
063    @Table(name="KREW_ACTN_TKN_T")
064    public class ActionTakenValue implements Serializable {
065    
066        /**
067             *
068             */
069            private static final long serialVersionUID = -81505450567067594L;
070            @Id
071            @GeneratedValue(generator="KREW_ACTN_TKN_S")
072            @GenericGenerator(name="KREW_ACTN_TKN_S",strategy="org.hibernate.id.enhanced.SequenceStyleGenerator",parameters={
073                            @Parameter(name="sequence_name",value="KREW_ACTN_TKN_S"),
074                            @Parameter(name="value_column",value="id")
075            })
076            @Column(name="ACTN_TKN_ID")
077        private String actionTakenId;
078        @Column(name="DOC_HDR_ID")//,insertable=false, updatable=false)
079            private String documentId;
080        @Column(name="ACTN_CD")
081            private String actionTaken;
082            @Column(name="ACTN_DT")
083            private Timestamp actionDate;
084        @Column(name="ANNOTN")
085        private String annotation = "";
086        @Column(name="DOC_VER_NBR")
087            private Integer docVersion;
088        @Version
089            @Column(name="VER_NBR")
090            private Integer lockVerNbr;
091        @Column(name="PRNCPL_ID")
092            private String principalId;
093        @Column(name="DLGTR_PRNCPL_ID")
094            private String delegatorPrincipalId;
095        @Column(name="DLGTR_GRP_ID")
096            private String delegatorGroupId;
097        //@ManyToOne(fetch=FetchType.EAGER, cascade={CascadeType.PERSIST})
098        //@JoinColumn(name="DOC_HDR_ID")
099        //private DocumentRouteHeaderValue routeHeader;
100        @OneToMany(fetch=FetchType.EAGER, mappedBy="actionTaken")
101        @Fetch(value = FetchMode.SELECT)
102            private Collection<ActionRequestValue> actionRequests;
103        @Column(name="CUR_IND")
104        private Boolean currentIndicator = Boolean.TRUE;
105        @Transient
106        private String actionDateString;
107    
108        public Principal getPrincipal() {
109            return getPrincipalForId( principalId );
110        }
111        
112            //@PrePersist
113            public void beforeInsert(){
114                    OrmUtils.populateAutoIncValue(this, KEWServiceLocator.getEntityManagerFactory().createEntityManager());         
115            }
116    
117        public String getPrincipalDisplayName() {
118            // TODO this stinks to have to have a dependency on UserSession here
119            return KEWServiceLocator.getIdentityHelperService().getPerson(getPrincipalId()).getName();
120        }
121    
122        public Principal getDelegatorPrincipal() {
123            return getPrincipalForId(delegatorPrincipalId);
124        }
125    
126        public Group getDelegatorGroup()
127        {
128                return KimApiServiceLocator.getGroupService()
129                        .getGroup(String.valueOf(delegatorGroupId));
130        }
131    
132        public void setDelegator(Recipient recipient) {
133            if (recipient instanceof KimPrincipalRecipient) {
134                setDelegatorPrincipalId(((KimPrincipalRecipient)recipient).getPrincipalId());
135            } else if (recipient instanceof KimGroupRecipient) {
136                setDelegatorGroupId(((KimGroupRecipient)recipient).getGroup().getId());
137            } else {
138                setDelegatorPrincipalId(null);
139                setDelegatorGroupId(null);
140            }
141        }
142    
143        public boolean isForDelegator() {
144            return getDelegatorPrincipalId() != null || getDelegatorGroupId() != null;
145        }
146    
147        public String getDelegatorDisplayName() {
148            if (! isForDelegator()) {
149                return "";
150            }
151            if (getDelegatorPrincipalId() != null) {
152                    // TODO this stinks to have to have a dependency on UserSession here
153                    return KEWServiceLocator.getIdentityHelperService().getPerson(this.getDelegatorPrincipalId()).getName();
154            } else {
155                return getDelegatorGroup().getName();
156          }
157        }
158        
159        private Principal getPrincipalForId(String principalId) {
160            Principal principal = null;
161            
162            if (!StringUtils.isBlank(principalId)) {
163                    principal = KEWServiceLocator.getIdentityHelperService().getPrincipal(principalId);
164            }
165            
166            return principal;
167        }
168    
169        public String getActionTakenLabel() {
170            return CodeTranslator.getActionTakenLabel(actionTaken);
171        }
172    
173        public Collection<ActionRequestValue> getActionRequests() {
174            if (actionRequests == null) {
175                setActionRequests(new ArrayList<ActionRequestValue>());
176            }
177            return actionRequests;
178        }
179    
180        public void setActionRequests(Collection<ActionRequestValue> actionRequests) {
181            this.actionRequests = actionRequests;
182        }
183    
184        //public DocumentRouteHeaderValue getRouteHeader() {
185        //    return routeHeader;
186        //}
187    
188        //public void setRouteHeader(DocumentRouteHeaderValue routeHeader) {
189        //    this.routeHeader = routeHeader;
190        //}
191    
192        public Timestamp getActionDate() {
193            return actionDate;
194        }
195    
196    
197        public void setActionDate(Timestamp actionDate) {
198            this.actionDate = actionDate;
199        }
200    
201    
202        public String getActionTaken() {
203            return actionTaken;
204        }
205    
206    
207        public void setActionTaken(String actionTaken) {
208            this.actionTaken = actionTaken;
209        }
210    
211    
212        public String getActionTakenId() {
213            return actionTakenId;
214        }
215    
216        public void setActionTakenId(String actionTakenId) {
217            this.actionTakenId = actionTakenId;
218        }
219    
220        public String getAnnotation() {
221            return annotation;
222        }
223    
224        public void setAnnotation(String annotation) {
225            this.annotation = annotation;
226        }
227    
228        public String getDelegatorPrincipalId() {
229            return delegatorPrincipalId;
230        }
231    
232        public void setDelegatorPrincipalId(String delegatorPrincipalId) {
233            this.delegatorPrincipalId = delegatorPrincipalId;
234        }
235    
236        public String getDelegatorGroupId() {
237            return delegatorGroupId;
238        }
239        public void setDelegatorGroupId(String delegatorGroupId) {
240            this.delegatorGroupId = delegatorGroupId;
241        }
242        public Integer getDocVersion() {
243            return docVersion;
244        }
245    
246        public void setDocVersion(Integer docVersion) {
247            this.docVersion = docVersion;
248        }
249    
250        public Integer getLockVerNbr() {
251            return lockVerNbr;
252        }
253    
254        public void setLockVerNbr(Integer lockVerNbr) {
255            this.lockVerNbr = lockVerNbr;
256        }
257    
258        public String getDocumentId() {
259            return documentId;
260        }
261    
262        public void setDocumentId(String documentId) {
263            this.documentId = documentId;
264        }
265    
266        public String getPrincipalId() {
267            return principalId;
268        }
269        
270        public void setPrincipalId(String principalId) {
271            this.principalId = principalId;
272        }
273    
274        public Boolean getCurrentIndicator() {
275            return currentIndicator;
276        }
277    
278        public void setCurrentIndicator(Boolean currentIndicator) {
279            this.currentIndicator = currentIndicator;
280        }
281    
282        public Collection getRootActionRequests() {
283            return getActionRequestService().getRootRequests(getActionRequests());
284        }
285    
286        private ActionRequestService getActionRequestService() {
287            return (ActionRequestService) KEWServiceLocator.getService(KEWServiceLocator.ACTION_REQUEST_SRV);
288        }
289    
290        public String getActionDateString() {
291            if(actionDateString == null || actionDateString.trim().equals("")){
292                return RiceConstants.getDefaultDateFormat().format(getActionDate());
293            } else {
294                return actionDateString;
295            }
296        }
297        public void setActionDateString(String actionDateString) {
298            this.actionDateString = actionDateString;
299        }
300    
301        public boolean isApproval() {
302            return KewApiConstants.ACTION_TAKEN_APPROVED_CD.equals(getActionTaken());
303        }
304    
305        public boolean isCompletion() {
306            return KewApiConstants.ACTION_TAKEN_COMPLETED_CD.equals(getActionTaken());
307        }
308        
309        public static ActionTaken to(ActionTakenValue actionTakenBo) {
310            if (actionTakenBo == null) {
311                    return null;
312            }
313            ActionTaken.Builder builder = ActionTaken.Builder.create(actionTakenBo.getActionTakenId(),
314                            actionTakenBo.getDocumentId(),
315                            actionTakenBo.getPrincipalId(),
316                            ActionType.fromCode(actionTakenBo.getActionTaken()));
317            if (actionTakenBo.getActionDate() != null) {
318                builder.setActionDate(new DateTime(actionTakenBo.getActionDate().getTime()));
319            }
320            builder.setAnnotation(actionTakenBo.getAnnotation());
321            builder.setCurrent(actionTakenBo.getCurrentIndicator().booleanValue());
322            builder.setDelegatorGroupId(actionTakenBo.getDelegatorGroupId());
323            builder.setDelegatorPrincipalId(actionTakenBo.getDelegatorPrincipalId());
324            return builder.build();
325        }
326        
327    }