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