001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.kew.rule;
017
018import org.apache.commons.lang.ObjectUtils;
019import org.apache.commons.lang.builder.HashCodeBuilder;
020import org.hibernate.annotations.GenericGenerator;
021import org.hibernate.annotations.Parameter;
022import org.kuali.rice.core.api.exception.RiceRuntimeException;
023import org.kuali.rice.core.api.reflect.ObjectDefinition;
024import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
025import org.kuali.rice.kew.actionrequest.ActionRequestValue;
026import org.kuali.rice.kew.actionrequest.KimGroupRecipient;
027import org.kuali.rice.kew.actionrequest.KimPrincipalRecipient;
028import org.kuali.rice.kew.actionrequest.Recipient;
029import org.kuali.rice.kew.api.rule.RuleResponsibilityContract;
030import org.kuali.rice.kew.service.KEWServiceLocator;
031import org.kuali.rice.kew.api.KewApiConstants;
032import org.kuali.rice.kew.user.RoleRecipient;
033import org.kuali.rice.kim.api.group.Group;
034import org.kuali.rice.kim.api.identity.principal.Principal;
035import org.kuali.rice.kim.api.services.KimApiServiceLocator;
036import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
037
038import javax.persistence.Column;
039import javax.persistence.Entity;
040import javax.persistence.FetchType;
041import javax.persistence.GeneratedValue;
042import javax.persistence.Id;
043import javax.persistence.JoinColumn;
044import javax.persistence.ManyToOne;
045import javax.persistence.Table;
046import java.util.List;
047
048
049/**
050 * A model bean representing the responsibility of a user, workgroup, or role
051 * to perform some action on a document.  Used by the rule system to
052 * identify the appropriate responsibile parties to generate
053 * {@link ActionRequestValue}s to.
054 *
055 * @author Kuali Rice Team (rice.collab@kuali.org)
056 */
057@Entity
058@Table(name="KREW_RULE_RSP_T")
059//@Sequence(name="KREW_RSP_S", property="id")
060public class RuleResponsibilityBo extends PersistableBusinessObjectBase implements RuleResponsibilityContract {
061
062        private static final long serialVersionUID = -1565688857123316797L;
063        @Id
064        @GeneratedValue(generator="KREW_RSP_S")
065        @GenericGenerator(name="KREW_RSP_S",strategy="org.hibernate.id.enhanced.SequenceStyleGenerator",parameters={
066                        @Parameter(name="sequence_name",value="KREW_RSP_S"),
067                        @Parameter(name="value_column",value="id")
068        })
069        @Column(name="RULE_RSP_ID")
070        private String id;
071    @Column(name="RSP_ID")
072        private String responsibilityId;
073    @Column(name="RULE_ID", insertable=false, updatable=false)
074    private String ruleBaseValuesId;
075    @Column(name="ACTN_RQST_CD")
076        private String actionRequestedCd;
077    @Column(name="NM")
078        private String ruleResponsibilityName;
079    @Column(name="TYP")
080        private String ruleResponsibilityType;
081    @Column(name="PRIO")
082        private Integer priority;
083    @Column(name="APPR_PLCY")
084        private String approvePolicy;
085
086    @ManyToOne(fetch=FetchType.EAGER)
087        @JoinColumn(name="RULE_ID")
088        private RuleBaseValues ruleBaseValues;
089    //@OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE},
090    //        mappedBy="ruleResponsibility")
091    //private List<RuleDelegation> delegationRules = new ArrayList<RuleDelegation>();
092
093    public Principal getPrincipal()
094    {
095        if (isUsingPrincipal()) {
096                return KEWServiceLocator.getIdentityHelperService().getPrincipal(ruleResponsibilityName);
097        }
098        return null;
099    }
100
101    public Group getGroup() {
102        if (isUsingGroup()) {
103                return KimApiServiceLocator.getGroupService().getGroup(ruleResponsibilityName);
104        }
105        return null;
106    }
107
108    public String getRole() {
109        if (isUsingRole()) {
110            return ruleResponsibilityName;
111        }
112        return null;
113    }
114
115    public String getResolvedRoleName() {
116        if (isUsingRole()) {
117            return getRole().substring(getRole().indexOf("!") + 1, getRole().length());
118        }
119        return null;
120    }
121
122    public String getRoleAttributeName() {
123            return getRole().substring(0, getRole().indexOf("!"));
124    }
125    
126    public RoleAttribute resolveRoleAttribute() {
127        if (isUsingRole()) {
128            String attributeName = getRoleAttributeName();
129            return (RoleAttribute) GlobalResourceLoader.getResourceLoader().getObject(new ObjectDefinition(attributeName));
130        }
131        return null;
132    }
133
134    @Override
135    public boolean isUsingRole() {
136        return (ruleResponsibilityName != null && ruleResponsibilityType != null && ruleResponsibilityType.equals(KewApiConstants.RULE_RESPONSIBILITY_ROLE_ID));
137    }
138
139    @Override
140    public boolean isUsingPrincipal() {
141        return (ruleResponsibilityName != null && !ruleResponsibilityName.trim().equals("") && ruleResponsibilityType != null && ruleResponsibilityType.equals(KewApiConstants.RULE_RESPONSIBILITY_WORKFLOW_ID));
142    }
143
144    @Override
145    public boolean isUsingGroup() {
146        return (ruleResponsibilityName != null && !ruleResponsibilityName.trim().equals("") && ruleResponsibilityType != null && ruleResponsibilityType.equals(KewApiConstants.RULE_RESPONSIBILITY_GROUP_ID));
147    }
148
149    public String getRuleBaseValuesId() {
150        return ruleBaseValuesId;
151    }
152
153    public void setRuleBaseValuesId(String ruleBaseValuesId) {
154        this.ruleBaseValuesId = ruleBaseValuesId;
155    }
156
157    public RuleBaseValues getRuleBaseValues() {
158        return ruleBaseValues;
159    }
160
161    public void setRuleBaseValues(RuleBaseValues ruleBaseValues) {
162        this.ruleBaseValues = ruleBaseValues;
163    }
164
165    public String getActionRequestedCd() {
166        return actionRequestedCd;
167    }
168
169    public void setActionRequestedCd(String actionRequestedCd) {
170        this.actionRequestedCd = actionRequestedCd;
171    }
172
173    public String getId() {
174        return id;
175    }
176
177    public void setId(String ruleResponsibilityId) {
178        this.id = ruleResponsibilityId;
179    }
180    public Integer getPriority() {
181        return priority;
182    }
183
184    public void setPriority(Integer priority) {
185        this.priority = priority;
186    }
187
188    public String getApprovePolicy() {
189        return approvePolicy;
190    }
191
192    public void setApprovePolicy(String approvePolicy) {
193        this.approvePolicy = approvePolicy;
194    }
195
196    public Object copy(boolean preserveKeys) {
197        RuleResponsibilityBo ruleResponsibilityClone = new RuleResponsibilityBo();
198        ruleResponsibilityClone.setApprovePolicy(getApprovePolicy());
199        if (actionRequestedCd != null) {
200            ruleResponsibilityClone.setActionRequestedCd(actionRequestedCd);
201        }
202        if (id != null && preserveKeys) {
203            ruleResponsibilityClone.setId(id);
204        }
205
206        if (responsibilityId != null) {
207            ruleResponsibilityClone.setResponsibilityId(responsibilityId);
208        }
209
210        if (ruleResponsibilityName != null) {
211            ruleResponsibilityClone.setRuleResponsibilityName(ruleResponsibilityName);
212        }
213        if (ruleResponsibilityType != null) {
214            ruleResponsibilityClone.setRuleResponsibilityType(ruleResponsibilityType);
215        }
216        if (priority != null) {
217            ruleResponsibilityClone.setPriority(priority);
218        }
219//        if (delegationRules != null) {
220//            for (Iterator iter = delegationRules.iterator(); iter.hasNext();) {
221//                RuleDelegation delegation = (RuleDelegation) iter.next();
222//                RuleDelegation delegationClone = (RuleDelegation)delegation.copy(preserveKeys);
223//                delegationClone.setRuleResponsibility(ruleResponsibilityClone);
224//                ruleResponsibilityClone.getDelegationRules().add(delegationClone);
225//
226//            }
227//        }
228        return ruleResponsibilityClone;
229    }
230
231    public String getRuleResponsibilityName() {
232        return ruleResponsibilityName;
233    }
234
235    public void setRuleResponsibilityName(String ruleResponsibilityName) {
236        this.ruleResponsibilityName = ruleResponsibilityName;
237    }
238
239    public String getRuleResponsibilityType() {
240        return ruleResponsibilityType;
241    }
242
243    public void setRuleResponsibilityType(String ruleResponsibilityType) {
244        this.ruleResponsibilityType = ruleResponsibilityType;
245    }
246
247    public String getResponsibilityId() {
248        return responsibilityId;
249    }
250    public void setResponsibilityId(String responsibilityId) {
251        this.responsibilityId = responsibilityId;
252    }
253    
254    public List<RuleDelegationBo> getDelegationRules() {
255        return KEWServiceLocator.getRuleDelegationService().findByResponsibilityId(getResponsibilityId());
256    }
257    
258    public RuleDelegationBo getDelegationRule(int index) {
259        return getDelegationRules().get(index);
260    }
261    
262//    public boolean isDelegating() {
263//        return !getDelegationRules().isEmpty();
264//    }
265//
266//    public List getDelegationRules() {
267//        return delegationRules;
268//    }
269//    public void setDelegationRules(List delegationRules) {
270//        this.delegationRules = delegationRules;
271//    }
272//
273//    public RuleDelegation getDelegationRule(int index) {
274//        while (getDelegationRules().size() <= index) {
275//            RuleDelegation ruleDelegation = new RuleDelegation();
276//            ruleDelegation.setRuleResponsibility(this);
277//            ruleDelegation.setDelegationRuleBaseValues(new RuleBaseValues());
278//            getDelegationRules().add(ruleDelegation);
279//        }
280//        return (RuleDelegation) getDelegationRules().get(index);
281//    }
282    
283    // convenience methods for the web-tier
284    
285    public String getActionRequestedDisplayValue() {
286        return KewApiConstants.ACTION_REQUEST_CODES.get(getActionRequestedCd());
287    }
288    
289    public String getRuleResponsibilityTypeDisplayValue() {
290        return KewApiConstants.RULE_RESPONSIBILITY_TYPES.get(getRuleResponsibilityType());
291    }
292    
293    public boolean equals(Object o) {
294        if (o == null) return false;
295        if (!(o instanceof RuleResponsibilityBo)) return false;
296        RuleResponsibilityBo pred = (RuleResponsibilityBo) o;
297        return ObjectUtils.equals(ruleResponsibilityName, pred.getRuleResponsibilityName()) &&
298               ObjectUtils.equals(actionRequestedCd, pred.getActionRequestedCd()) &&
299               ObjectUtils.equals(priority, pred.getPriority()) &&
300               ObjectUtils.equals(approvePolicy, pred.getApprovePolicy());
301    }
302    
303    /**
304         * @see java.lang.Object#hashCode()
305         */
306        @Override
307        public int hashCode() {
308                return new HashCodeBuilder()
309                .append(this.actionRequestedCd)
310                .append(this.approvePolicy)
311                .append(this.priority)
312                .append(this.ruleResponsibilityName).toHashCode();
313        }
314
315    @Override
316    public String getGroupId() {
317        if (!isUsingGroup()) {
318            return null;
319        }
320        return getGroup().getId();
321    }
322
323    @Override
324    public String getPrincipalId() {
325        if (getPrincipal() == null) {
326            return null;
327        }
328        return getPrincipal().getPrincipalId();
329    }
330
331    @Override
332    public String getRoleName() {
333        return getRole();
334    }
335
336    /**
337     * Convenience method to return the Recipient for this RuleResponsibility
338     * @return the Recipient for this RuleResponsibility
339     */
340    public Recipient getRecipient() {
341        if (isUsingPrincipal()) {
342            return new KimPrincipalRecipient(getPrincipal());
343        } else if (isUsingGroup()) {
344            return new KimGroupRecipient(getGroup());
345        } else if (isUsingRole()) {
346            return new RoleRecipient(getRole());
347        } else {
348            return null;
349        }
350    }
351
352    public static org.kuali.rice.kew.api.rule.RuleResponsibility to(RuleResponsibilityBo bo) {
353        if (bo == null) {
354            return null;
355        }
356        return org.kuali.rice.kew.api.rule.RuleResponsibility.Builder.create(bo).build();
357        /*org.kuali.rice.kew.api.rule.RuleResponsibility.Builder builder = org.kuali.rice.kew.api.rule.RuleResponsibility.Builder.create();
358        builder.setPriority(bo.getPriority());
359        builder.setResponsibilityId(bo.getResponsibilityId());
360        builder.setActionRequestedCd(bo.getActionRequestedCd());
361        builder.setApprovePolicy(bo.getApprovePolicy());
362        builder.setPrincipalId(bo.getPrincipal() == null ? null : bo.getPrincipal().getPrincipalId());
363        builder.setGroupId(bo.getGroup() == null ? null : bo.getGroup().getId());
364        builder.setRoleName(bo.getResolvedRoleName());
365        if (CollectionUtils.isNotEmpty(bo.getDelegationRules())) {
366            List<org.kuali.rice.kew.api.rule.RuleDelegation.Builder> delegationRuleBuilders =
367                    new ArrayList<org.kuali.rice.kew.api.rule.RuleDelegation.Builder>();
368            for (RuleDelegation delegationRule : bo.getDelegationRules()) {
369                delegationRuleBuilders.add(
370                        org.kuali.rice.kew.api.rule.RuleDelegation.Builder.create(RuleDelegation.to(delegationRule)));
371            }
372            builder.setDelegationRules(delegationRuleBuilders);
373        } else {
374            builder.setDelegationRules(Collections.<org.kuali.rice.kew.api.rule.RuleDelegation.Builder>emptyList());
375        }
376        return builder.build();*/
377    }
378}