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.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.exception.RiceRuntimeException; 023 import org.kuali.rice.core.api.reflect.ObjectDefinition; 024 import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader; 025 import org.kuali.rice.kew.actionrequest.ActionRequestValue; 026 import org.kuali.rice.kew.actionrequest.KimGroupRecipient; 027 import org.kuali.rice.kew.actionrequest.KimPrincipalRecipient; 028 import org.kuali.rice.kew.actionrequest.Recipient; 029 import org.kuali.rice.kew.api.rule.RuleResponsibilityContract; 030 import org.kuali.rice.kew.service.KEWServiceLocator; 031 import org.kuali.rice.kew.api.KewApiConstants; 032 import org.kuali.rice.kew.user.RoleRecipient; 033 import org.kuali.rice.kim.api.group.Group; 034 import org.kuali.rice.kim.api.identity.principal.Principal; 035 import org.kuali.rice.kim.api.services.KimApiServiceLocator; 036 import org.kuali.rice.krad.bo.PersistableBusinessObjectBase; 037 038 import javax.persistence.Column; 039 import javax.persistence.Entity; 040 import javax.persistence.FetchType; 041 import javax.persistence.GeneratedValue; 042 import javax.persistence.Id; 043 import javax.persistence.JoinColumn; 044 import javax.persistence.ManyToOne; 045 import javax.persistence.Table; 046 import 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") 060 public 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 }