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.rule;
017    
018    import org.apache.commons.lang.ObjectUtils;
019    import org.apache.commons.lang.builder.HashCodeBuilder;
020    import org.hibernate.annotations.GenericGenerator;
021    import org.hibernate.annotations.Parameter;
022    import org.kuali.rice.core.api.reflect.ObjectDefinition;
023    import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
024    import org.kuali.rice.kew.actionrequest.ActionRequestValue;
025    import org.kuali.rice.kew.api.rule.RuleResponsibilityContract;
026    import org.kuali.rice.kew.service.KEWServiceLocator;
027    import org.kuali.rice.kew.api.KewApiConstants;
028    import org.kuali.rice.kim.api.group.Group;
029    import org.kuali.rice.kim.api.identity.principal.Principal;
030    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
031    import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
032    
033    import javax.persistence.Column;
034    import javax.persistence.Entity;
035    import javax.persistence.FetchType;
036    import javax.persistence.GeneratedValue;
037    import javax.persistence.Id;
038    import javax.persistence.JoinColumn;
039    import javax.persistence.ManyToOne;
040    import javax.persistence.Table;
041    import java.util.List;
042    
043    
044    /**
045     * A model bean representing the responsibility of a user, workgroup, or role
046     * to perform some action on a document.  Used by the rule system to
047     * identify the appropriate responsibile parties to generate
048     * {@link ActionRequestValue}s to.
049     *
050     * @author Kuali Rice Team (rice.collab@kuali.org)
051     */
052    @Entity
053    @Table(name="KREW_RULE_RSP_T")
054    //@Sequence(name="KREW_RSP_S", property="id")
055    public class RuleResponsibilityBo extends PersistableBusinessObjectBase implements RuleResponsibilityContract {
056    
057            private static final long serialVersionUID = -1565688857123316797L;
058            @Id
059            @GeneratedValue(generator="KREW_RSP_S")
060            @GenericGenerator(name="KREW_RSP_S",strategy="org.hibernate.id.enhanced.SequenceStyleGenerator",parameters={
061                            @Parameter(name="sequence_name",value="KREW_RSP_S"),
062                            @Parameter(name="value_column",value="id")
063            })
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        public static org.kuali.rice.kew.api.rule.RuleResponsibility to(RuleResponsibilityBo bo) {
332            if (bo == null) {
333                return null;
334            }
335            return org.kuali.rice.kew.api.rule.RuleResponsibility.Builder.create(bo).build();
336            /*org.kuali.rice.kew.api.rule.RuleResponsibility.Builder builder = org.kuali.rice.kew.api.rule.RuleResponsibility.Builder.create();
337            builder.setPriority(bo.getPriority());
338            builder.setResponsibilityId(bo.getResponsibilityId());
339            builder.setActionRequestedCd(bo.getActionRequestedCd());
340            builder.setApprovePolicy(bo.getApprovePolicy());
341            builder.setPrincipalId(bo.getPrincipal() == null ? null : bo.getPrincipal().getPrincipalId());
342            builder.setGroupId(bo.getGroup() == null ? null : bo.getGroup().getId());
343            builder.setRoleName(bo.getResolvedRoleName());
344            if (CollectionUtils.isNotEmpty(bo.getDelegationRules())) {
345                List<org.kuali.rice.kew.api.rule.RuleDelegation.Builder> delegationRuleBuilders =
346                        new ArrayList<org.kuali.rice.kew.api.rule.RuleDelegation.Builder>();
347                for (RuleDelegation delegationRule : bo.getDelegationRules()) {
348                    delegationRuleBuilders.add(
349                            org.kuali.rice.kew.api.rule.RuleDelegation.Builder.create(RuleDelegation.to(delegationRule)));
350                }
351                builder.setDelegationRules(delegationRuleBuilders);
352            } else {
353                builder.setDelegationRules(Collections.<org.kuali.rice.kew.api.rule.RuleDelegation.Builder>emptyList());
354            }
355            return builder.build();*/
356        }
357    }