001 /** 002 * Copyright 2005-2011 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.api.rule; 017 018 import java.io.Serializable; 019 import java.lang.reflect.Type; 020 import java.util.ArrayList; 021 import java.util.Collection; 022 import java.util.Collections; 023 import java.util.List; 024 import javax.xml.bind.annotation.XmlAccessType; 025 import javax.xml.bind.annotation.XmlAccessorType; 026 import javax.xml.bind.annotation.XmlAnyElement; 027 import javax.xml.bind.annotation.XmlElement; 028 import javax.xml.bind.annotation.XmlRootElement; 029 import javax.xml.bind.annotation.XmlType; 030 031 import org.apache.commons.collections.CollectionUtils; 032 import org.apache.commons.lang.ObjectUtils; 033 import org.apache.commons.lang.StringUtils; 034 import org.apache.commons.lang.math.NumberUtils; 035 import org.kuali.rice.core.api.CoreConstants; 036 import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 037 import org.kuali.rice.core.api.mo.ModelBuilder; 038 import org.kuali.rice.kew.api.KewApiConstants; 039 import org.w3c.dom.Element; 040 041 @XmlRootElement(name = RuleResponsibility.Constants.ROOT_ELEMENT_NAME) 042 @XmlAccessorType(XmlAccessType.NONE) 043 @XmlType(name = RuleResponsibility.Constants.TYPE_NAME, propOrder = { 044 RuleResponsibility.Elements.ID, 045 RuleResponsibility.Elements.PRIORITY, 046 RuleResponsibility.Elements.RESPONSIBILITY_ID, 047 RuleResponsibility.Elements.ACTION_REQUESTED_CD, 048 RuleResponsibility.Elements.APPROVE_POLICY, 049 RuleResponsibility.Elements.PRINCIPAL_ID, 050 RuleResponsibility.Elements.GROUP_ID, 051 RuleResponsibility.Elements.ROLE_NAME, 052 RuleResponsibility.Elements.DELEGATION_RULES, 053 RuleResponsibility.Elements.USING_ROLE, 054 RuleResponsibility.Elements.USING_GROUP, 055 RuleResponsibility.Elements.USING_PRINCIPAL, 056 CoreConstants.CommonElements.VERSION_NUMBER, 057 CoreConstants.CommonElements.OBJECT_ID, 058 CoreConstants.CommonElements.FUTURE_ELEMENTS 059 }) 060 public final class RuleResponsibility 061 extends AbstractDataTransferObject 062 implements RuleResponsibilityContract 063 { 064 @XmlElement(name = Elements.ID, required = false) 065 private final String id; 066 @XmlElement(name = Elements.PRIORITY, required = false) 067 private final Integer priority; 068 @XmlElement(name = Elements.RESPONSIBILITY_ID, required = true) 069 private final String responsibilityId; 070 @XmlElement(name = Elements.ACTION_REQUESTED_CD, required = false) 071 private final String actionRequestedCd; 072 @XmlElement(name = Elements.APPROVE_POLICY, required = false) 073 private final String approvePolicy; 074 @XmlElement(name = Elements.PRINCIPAL_ID, required = false) 075 private final String principalId; 076 @XmlElement(name = Elements.GROUP_ID, required = false) 077 private final String groupId; 078 @XmlElement(name = Elements.ROLE_NAME, required = false) 079 private final String roleName; 080 @XmlElement(name = Elements.DELEGATION_RULES, required = false) 081 private final List<RuleDelegation> delegationRules; 082 @XmlElement(name = Elements.USING_ROLE, required = false) 083 private final boolean usingRole; 084 @XmlElement(name = Elements.USING_PRINCIPAL, required = false) 085 private final boolean usingPrincipal; 086 @XmlElement(name = Elements.USING_GROUP, required = false) 087 private final boolean usingGroup; 088 @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false) 089 private final Long versionNumber; 090 @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false) 091 private final String objectId; 092 @SuppressWarnings("unused") 093 @XmlAnyElement 094 private final Collection<Element> _futureElements = null; 095 096 /** 097 * Private constructor used only by JAXB. 098 * 099 */ 100 private RuleResponsibility() { 101 this.id = null; 102 this.priority = null; 103 this.responsibilityId = null; 104 this.actionRequestedCd = null; 105 this.approvePolicy = null; 106 this.principalId = null; 107 this.groupId = null; 108 this.roleName = null; 109 this.delegationRules = null; 110 this.usingGroup = false; 111 this.usingPrincipal = false; 112 this.usingRole = false; 113 this.versionNumber = null; 114 this.objectId = null; 115 } 116 117 private RuleResponsibility(Builder builder) { 118 this.id = builder.getId(); 119 this.priority = builder.getPriority(); 120 this.responsibilityId = builder.getResponsibilityId(); 121 this.actionRequestedCd = builder.getActionRequestedCd(); 122 this.approvePolicy = builder.getApprovePolicy(); 123 this.principalId = builder.getPrincipalId(); 124 this.groupId = builder.getGroupId(); 125 this.roleName = builder.getRoleName(); 126 if (CollectionUtils.isNotEmpty(builder.getDelegationRules())) { 127 List<RuleDelegation> delegationList = new ArrayList<RuleDelegation>(); 128 for (RuleDelegation.Builder b : builder.getDelegationRules()) { 129 delegationList.add(b.build()); 130 } 131 this.delegationRules = delegationList; 132 } else { 133 this.delegationRules = Collections.emptyList(); 134 } 135 this.usingGroup = builder.isUsingGroup(); 136 this.usingPrincipal = builder.isUsingPrincipal(); 137 this.usingRole = builder.isUsingRole(); 138 versionNumber = builder.getVersionNumber(); 139 objectId = builder.getObjectId(); 140 } 141 142 @Override 143 public String getId() { 144 return this.id; 145 } 146 147 @Override 148 public Integer getPriority() { 149 return this.priority; 150 } 151 152 @Override 153 public String getResponsibilityId() { 154 return this.responsibilityId; 155 } 156 157 @Override 158 public String getActionRequestedCd() { 159 return this.actionRequestedCd; 160 } 161 162 @Override 163 public String getApprovePolicy() { 164 return this.approvePolicy; 165 } 166 167 @Override 168 public String getPrincipalId() { 169 return this.principalId; 170 } 171 172 @Override 173 public String getGroupId() { 174 return this.groupId; 175 } 176 177 @Override 178 public String getRoleName() { 179 return this.roleName; 180 } 181 182 @Override 183 public List<RuleDelegation> getDelegationRules() { 184 return this.delegationRules; 185 } 186 187 @Override 188 public boolean isUsingRole() { 189 return this.usingRole; 190 } 191 192 @Override 193 public boolean isUsingPrincipal() { 194 return this.usingPrincipal; 195 } 196 197 @Override 198 public boolean isUsingGroup() { 199 return this.usingGroup; 200 } 201 202 @Override 203 public Long getVersionNumber() { 204 return versionNumber; 205 } 206 207 @Override 208 public String getObjectId() { 209 return objectId; 210 } 211 212 public String getRoleAttributeName() { 213 return getRoleName().substring(0, getRoleName().indexOf("!")); 214 } 215 216 public String getResolvedRoleName() { 217 if (isUsingRole()) { 218 return getRoleName().substring(getRoleName().indexOf("!") + 1, getRoleName().length()); 219 } 220 return null; 221 } 222 223 /** 224 * A builder which can be used to construct {@link RuleResponsibility} instances. Enforces the constraints of the {@link RuleResponsibilityContract}. 225 * 226 */ 227 public final static class Builder 228 implements Serializable, ModelBuilder, RuleResponsibilityContract 229 { 230 private String id; 231 private Integer priority; 232 private String responsibilityId; 233 private String actionRequestedCd; 234 private String approvePolicy; 235 private String principalId; 236 private String groupId; 237 private String roleName; 238 private List<RuleDelegation.Builder> delegationRules; 239 private boolean usingRole = false; 240 private boolean usingPrincipal = false; 241 private boolean usingGroup = false; 242 private Long versionNumber; 243 private String objectId; 244 245 private Builder() { 246 } 247 248 public static Builder create() { 249 return new Builder(); 250 } 251 252 public static Builder create(RuleResponsibilityContract contract) { 253 if (contract == null) { 254 throw new IllegalArgumentException("contract was null"); 255 } 256 Builder builder = create(); 257 builder.setId(contract.getId()); 258 builder.setPriority(contract.getPriority()); 259 builder.setResponsibilityId(contract.getResponsibilityId()); 260 builder.setActionRequestedCd(contract.getActionRequestedCd()); 261 builder.setApprovePolicy(contract.getApprovePolicy()); 262 builder.setPrincipalId(contract.getPrincipalId()); 263 builder.setGroupId(contract.getGroupId()); 264 builder.setRoleName(contract.getRoleName()); 265 if (CollectionUtils.isNotEmpty(contract.getDelegationRules())) { 266 List<RuleDelegation.Builder> builders = new ArrayList<RuleDelegation.Builder>(); 267 for (RuleDelegationContract delegationContract : contract.getDelegationRules()) { 268 builders.add(RuleDelegation.Builder.create(delegationContract)); 269 } 270 builder.setDelegationRules(builders); 271 } else { 272 builder.setDelegationRules(Collections.<RuleDelegation.Builder>emptyList()); 273 } 274 builder.setUsingGroup(contract.isUsingGroup()); 275 builder.setUsingPrincipal(contract.isUsingPrincipal()); 276 builder.setUsingRole(contract.isUsingRole()); 277 builder.setVersionNumber(contract.getVersionNumber()); 278 builder.setObjectId(contract.getObjectId()); 279 return builder; 280 } 281 282 public RuleResponsibility build() { 283 return new RuleResponsibility(this); 284 } 285 286 @Override 287 public String getId() { 288 return this.id; 289 } 290 291 @Override 292 public Integer getPriority() { 293 return this.priority; 294 } 295 296 @Override 297 public String getResponsibilityId() { 298 return this.responsibilityId; 299 } 300 301 @Override 302 public String getActionRequestedCd() { 303 return this.actionRequestedCd; 304 } 305 306 @Override 307 public String getApprovePolicy() { 308 return this.approvePolicy; 309 } 310 311 @Override 312 public String getPrincipalId() { 313 return this.principalId; 314 } 315 316 @Override 317 public String getGroupId() { 318 return this.groupId; 319 } 320 321 @Override 322 public String getRoleName() { 323 return this.roleName; 324 } 325 326 @Override 327 public List<RuleDelegation.Builder> getDelegationRules() { 328 return this.delegationRules; 329 } 330 331 @Override 332 public boolean isUsingRole() { 333 return this.usingRole; 334 } 335 336 @Override 337 public boolean isUsingPrincipal() { 338 return this.usingPrincipal; 339 } 340 341 @Override 342 public boolean isUsingGroup() { 343 return this.usingGroup; 344 } 345 346 @Override 347 public Long getVersionNumber() { 348 return versionNumber; 349 } 350 351 @Override 352 public String getObjectId() { 353 return objectId; 354 } 355 356 public void setId(String id) { 357 if (StringUtils.isWhitespace(id)) { 358 throw new IllegalArgumentException("id is whitespace"); 359 } 360 this.id = id; 361 } 362 public void setPriority(Integer priority) { 363 this.priority = priority; 364 } 365 366 public void setResponsibilityId(String responsibilityId) { 367 this.responsibilityId = responsibilityId; 368 } 369 370 public void setActionRequestedCd(String actionRequestedCd) { 371 this.actionRequestedCd = actionRequestedCd; 372 } 373 374 public void setApprovePolicy(String approvePolicy) { 375 this.approvePolicy = approvePolicy; 376 } 377 378 public void setPrincipalId(String principalId) { 379 this.principalId = principalId; 380 } 381 382 public void setGroupId(String groupId) { 383 this.groupId = groupId; 384 } 385 386 public void setRoleName(String roleName) { 387 this.roleName = roleName; 388 } 389 390 public void setDelegationRules(List<RuleDelegation.Builder> delegationRules) { 391 this.delegationRules = delegationRules; 392 } 393 394 private void setUsingRole(boolean usingRole) { 395 this.usingRole = usingRole; 396 } 397 398 private void setUsingPrincipal(boolean usingPrincipal) { 399 this.usingPrincipal = usingPrincipal; 400 } 401 402 private void setUsingGroup(boolean usingGroup) { 403 this.usingGroup = usingGroup; 404 } 405 406 public void setVersionNumber(Long versionNumber) { 407 this.versionNumber = versionNumber; 408 } 409 410 public void setObjectId(String objectId) { 411 this.objectId = objectId; 412 } 413 414 415 } 416 417 @Override 418 public boolean equals(Object o) { 419 if (o == null) { return false; } 420 if (!(o instanceof RuleResponsibilityContract)) { return false; } 421 RuleResponsibilityContract resp = (RuleResponsibilityContract) o; 422 return StringUtils.equals(getPrincipalId(), resp.getPrincipalId()) && 423 StringUtils.equals(getRoleName(), resp.getRoleName()) && 424 StringUtils.equals(getGroupId(), resp.getGroupId()) && 425 StringUtils.equals(getActionRequestedCd(), resp.getActionRequestedCd()) && 426 ObjectUtils.equals(getPriority(), resp.getPriority()) && 427 StringUtils.equals(getApprovePolicy(), resp.getApprovePolicy()); 428 } 429 430 /** 431 * Defines some internal constants used on this class. 432 * 433 */ 434 static class Constants { 435 436 final static String ROOT_ELEMENT_NAME = "ruleResponsibility"; 437 final static String TYPE_NAME = "RuleResponsibilityType"; 438 439 } 440 441 442 /** 443 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML. 444 * 445 */ 446 static class Elements { 447 final static String ID = "id"; 448 final static String PRIORITY = "priority"; 449 final static String RESPONSIBILITY_ID = "responsibilityId"; 450 final static String ACTION_REQUESTED_CD = "actionRequestedCd"; 451 final static String APPROVE_POLICY = "approvePolicy"; 452 final static String PRINCIPAL_ID = "principalId"; 453 final static String GROUP_ID = "groupId"; 454 final static String ROLE_NAME = "roleName"; 455 final static String DELEGATION_RULES = "delegationRules"; 456 final static String USING_ROLE = "usingRole"; 457 final static String USING_PRINCIPAL = "usingPrincipal"; 458 final static String USING_GROUP = "usingGroup"; 459 } 460 461 public static class Cache { 462 public static final String NAME = KewApiConstants.Namespaces.KEW_NAMESPACE_2_0 + "/" + RuleResponsibility.Constants.TYPE_NAME; 463 } 464 }