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.kim.api.responsibility; 017 018 import com.google.common.collect.Maps; 019 import org.apache.commons.lang.StringUtils; 020 import org.kuali.rice.core.api.CoreConstants; 021 import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 022 import org.kuali.rice.core.api.mo.ModelBuilder; 023 import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter; 024 import org.kuali.rice.kim.api.common.delegate.DelegateType; 025 import org.kuali.rice.kim.api.common.delegate.DelegateTypeContract; 026 import org.w3c.dom.Element; 027 028 import javax.xml.bind.annotation.XmlAccessType; 029 import javax.xml.bind.annotation.XmlAccessorType; 030 import javax.xml.bind.annotation.XmlAnyElement; 031 import javax.xml.bind.annotation.XmlElement; 032 import javax.xml.bind.annotation.XmlElementWrapper; 033 import javax.xml.bind.annotation.XmlRootElement; 034 import javax.xml.bind.annotation.XmlType; 035 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 036 import java.io.Serializable; 037 import java.util.ArrayList; 038 import java.util.Collection; 039 import java.util.Collections; 040 import java.util.List; 041 import java.util.Map; 042 043 @XmlRootElement(name = ResponsibilityAction.Constants.ROOT_ELEMENT_NAME) 044 @XmlAccessorType(XmlAccessType.NONE) 045 @XmlType(name = ResponsibilityAction.Constants.TYPE_NAME, propOrder = { 046 ResponsibilityAction.Elements.PRINCIPAL_ID, 047 ResponsibilityAction.Elements.ROLE_RESPONSIBILITY_ACTION_ID, 048 ResponsibilityAction.Elements.PARALLEL_ROUTING_GROUPING_CODE, 049 ResponsibilityAction.Elements.ACTION_TYPE_CODE, 050 ResponsibilityAction.Elements.ACTION_POLICY_CODE, 051 ResponsibilityAction.Elements.PRIORITY_NUMBER, 052 ResponsibilityAction.Elements.GROUP_ID, 053 ResponsibilityAction.Elements.MEMBER_ROLE_ID, 054 ResponsibilityAction.Elements.RESPONSIBILITY_NAME, 055 ResponsibilityAction.Elements.RESPONSIBILITY_ID, 056 ResponsibilityAction.Elements.RESPONSIBILITY_NAMESPACE_CODE, 057 ResponsibilityAction.Elements.FORCE_ACTION, 058 ResponsibilityAction.Elements.QUALIFIER, 059 ResponsibilityAction.Elements.DELEGATES, 060 ResponsibilityAction.Elements.ROLE_ID, 061 CoreConstants.CommonElements.FUTURE_ELEMENTS 062 }) 063 public final class ResponsibilityAction extends AbstractDataTransferObject 064 implements ResponsibilityActionContract { 065 066 @XmlElement(name = Elements.PRINCIPAL_ID, required = false) 067 private final String principalId; 068 069 @XmlElement(name = Elements.ROLE_RESPONSIBILITY_ACTION_ID, required = false) 070 private final String roleResponsibilityActionId; 071 072 @XmlElement(name = Elements.PARALLEL_ROUTING_GROUPING_CODE, required = false) 073 private final String parallelRoutingGroupingCode; 074 075 @XmlElement(name = Elements.ACTION_TYPE_CODE, required = false) 076 private final String actionTypeCode; 077 078 @XmlElement(name = Elements.ACTION_POLICY_CODE, required = false) 079 private final String actionPolicyCode; 080 081 @XmlElement(name = Elements.PRIORITY_NUMBER, required = false) 082 private final Integer priorityNumber; 083 084 @XmlElement(name = Elements.GROUP_ID, required = true) 085 private final String groupId; 086 087 @XmlElement(name = Elements.MEMBER_ROLE_ID, required = true) 088 private final String memberRoleId; 089 090 @XmlElement(name = Elements.RESPONSIBILITY_NAME, required = true) 091 private final String responsibilityName; 092 093 @XmlElement(name = Elements.RESPONSIBILITY_ID, required = true) 094 private final String responsibilityId; 095 096 @XmlElement(name = Elements.RESPONSIBILITY_NAMESPACE_CODE, required = true) 097 private final String responsibilityNamespaceCode; 098 099 @XmlElement(name = Elements.FORCE_ACTION, required = true) 100 private final boolean forceAction; 101 102 @XmlElement(name = Elements.QUALIFIER, required = true) 103 @XmlJavaTypeAdapter(value = MapStringStringAdapter.class) 104 private final Map<String, String> qualifier; 105 106 @XmlElementWrapper(name = Elements.DELEGATES, required = false) 107 @XmlElement(name = Elements.DELEGATE, required = true) 108 private final List<DelegateType> delegates; 109 110 @XmlElement(name = Elements.ROLE_ID, required = true) 111 private final String roleId; 112 113 @SuppressWarnings("unused") 114 @XmlAnyElement 115 private final Collection<Element> _futureElements = null; 116 117 /** 118 * Private constructor used only by JAXB. 119 */ 120 private ResponsibilityAction() { 121 this.principalId = null; 122 this.roleResponsibilityActionId = null; 123 this.parallelRoutingGroupingCode = null; 124 this.actionTypeCode = null; 125 this.actionPolicyCode = null; 126 this.priorityNumber = null; 127 this.groupId = null; 128 this.memberRoleId = null; 129 this.responsibilityName = null; 130 this.responsibilityId = null; 131 this.responsibilityNamespaceCode = null; 132 this.forceAction = false; 133 this.qualifier = null; 134 this.delegates = null; 135 this.roleId = null; 136 } 137 138 private ResponsibilityAction(Builder builder) { 139 this.principalId = builder.getPrincipalId(); 140 this.roleResponsibilityActionId = builder.getRoleResponsibilityActionId(); 141 this.parallelRoutingGroupingCode = builder.getParallelRoutingGroupingCode(); 142 this.actionTypeCode = builder.getActionTypeCode(); 143 this.actionPolicyCode = builder.getActionPolicyCode(); 144 this.priorityNumber = builder.getPriorityNumber(); 145 this.groupId = builder.getGroupId(); 146 this.memberRoleId = builder.getMemberRoleId(); 147 this.responsibilityName = builder.getResponsibilityName(); 148 this.responsibilityId = builder.getResponsibilityId(); 149 this.responsibilityNamespaceCode = builder.getResponsibilityNamespaceCode(); 150 this.forceAction = builder.isForceAction(); 151 this.qualifier = builder.getQualifier(); 152 final List<DelegateType> ds = new ArrayList<DelegateType>(); 153 for (DelegateType.Builder d : builder.getDelegates()) { 154 if (d != null) { 155 ds.add(d.build()); 156 } 157 } 158 this.delegates = ds; 159 this.roleId = builder.getRoleId(); 160 } 161 162 @Override 163 public String getPrincipalId() { 164 return this.principalId; 165 } 166 167 @Override 168 public String getRoleResponsibilityActionId() { 169 return this.roleResponsibilityActionId; 170 } 171 172 @Override 173 public String getParallelRoutingGroupingCode() { 174 return this.parallelRoutingGroupingCode; 175 } 176 177 @Override 178 public String getActionTypeCode() { 179 return this.actionTypeCode; 180 } 181 182 @Override 183 public String getActionPolicyCode() { 184 return this.actionPolicyCode; 185 } 186 187 @Override 188 public Integer getPriorityNumber() { 189 return this.priorityNumber; 190 } 191 192 @Override 193 public String getGroupId() { 194 return this.groupId; 195 } 196 197 @Override 198 public String getMemberRoleId() { 199 return this.memberRoleId; 200 } 201 202 @Override 203 public String getResponsibilityName() { 204 return this.responsibilityName; 205 } 206 207 @Override 208 public String getResponsibilityId() { 209 return this.responsibilityId; 210 } 211 212 @Override 213 public String getResponsibilityNamespaceCode() { 214 return this.responsibilityNamespaceCode; 215 } 216 217 @Override 218 public boolean isForceAction() { 219 return this.forceAction; 220 } 221 222 @Override 223 public Map<String, String> getQualifier() { 224 return this.qualifier; 225 } 226 227 @Override 228 public List<DelegateType> getDelegates() { 229 return Collections.unmodifiableList(this.delegates); 230 } 231 232 @Override 233 public String getRoleId() { 234 return this.roleId; 235 } 236 237 238 /** 239 * A builder which can be used to construct {@link ResponsibilityAction} instances. Enforces the constraints of the {@link ResponsibilityActionContract}. 240 */ 241 public final static class Builder 242 implements Serializable, ModelBuilder, ResponsibilityActionContract { 243 244 private String principalId; 245 private String roleResponsibilityActionId; 246 private String parallelRoutingGroupingCode; 247 private String actionTypeCode; 248 private String actionPolicyCode; 249 private Integer priorityNumber; 250 private String groupId; 251 private String memberRoleId; 252 private String responsibilityName; 253 private String responsibilityId; 254 private String responsibilityNamespaceCode; 255 private boolean forceAction; 256 private Map<String, String> qualifier; 257 private List<DelegateType.Builder> delegates; 258 private String roleId; 259 260 private Builder() { 261 } 262 263 /** 264 * All required fields are enforced in the {@link org.kuali.rice.kim.api.responsibility.ResponsibilityAction.Builder#build()} 265 * method. Please see {@link ResponsibilityActionContract} to see what fields are required. 266 * 267 * @return a new builder, not yet in a valid state 268 */ 269 public static Builder create() { 270 //there is a lot of required fields - require fields are enforced at build time 271 return new Builder(); 272 } 273 274 public static Builder create(ResponsibilityActionContract contract) { 275 if (contract == null) { 276 throw new IllegalArgumentException("contract was null"); 277 } 278 Builder builder = create(); 279 builder.setPrincipalId(contract.getPrincipalId()); 280 builder.setRoleResponsibilityActionId(contract.getRoleResponsibilityActionId()); 281 builder.setParallelRoutingGroupingCode(contract.getParallelRoutingGroupingCode()); 282 builder.setActionTypeCode(contract.getActionTypeCode()); 283 builder.setActionPolicyCode(contract.getActionPolicyCode()); 284 builder.setPriorityNumber(contract.getPriorityNumber()); 285 builder.setGroupId(contract.getGroupId()); 286 builder.setMemberRoleId(contract.getMemberRoleId()); 287 builder.setResponsibilityName(contract.getResponsibilityName()); 288 builder.setResponsibilityId(contract.getResponsibilityId()); 289 builder.setResponsibilityNamespaceCode(contract.getResponsibilityNamespaceCode()); 290 builder.setForceAction(contract.isForceAction()); 291 builder.setQualifier(contract.getQualifier()); 292 final List<DelegateType.Builder> dbs = new ArrayList<DelegateType.Builder>(); 293 for (DelegateTypeContract d : contract.getDelegates()) { 294 if (d != null) { 295 dbs.add(DelegateType.Builder.create(d)); 296 } 297 } 298 builder.setDelegates(dbs); 299 builder.setRoleId(contract.getRoleId()); 300 return builder; 301 } 302 303 public ResponsibilityAction build() { 304 //validate required fields 305 final boolean requiredSet = (groupId != null ^ principalId != null) && 306 memberRoleId != null && 307 responsibilityName != null && 308 responsibilityId != null && 309 responsibilityNamespaceCode != null && 310 delegates != null && 311 roleId != null; 312 313 if (!requiredSet) { 314 throw new IllegalStateException("all the required fields are not set"); 315 } 316 return new ResponsibilityAction(this); 317 } 318 319 @Override 320 public String getPrincipalId() { 321 return this.principalId; 322 } 323 324 @Override 325 public String getRoleResponsibilityActionId() { 326 return this.roleResponsibilityActionId; 327 } 328 329 @Override 330 public String getParallelRoutingGroupingCode() { 331 return this.parallelRoutingGroupingCode; 332 } 333 334 @Override 335 public String getActionTypeCode() { 336 return this.actionTypeCode; 337 } 338 339 @Override 340 public String getActionPolicyCode() { 341 return this.actionPolicyCode; 342 } 343 344 @Override 345 public Integer getPriorityNumber() { 346 return this.priorityNumber; 347 } 348 349 @Override 350 public String getGroupId() { 351 return this.groupId; 352 } 353 354 @Override 355 public String getMemberRoleId() { 356 return this.memberRoleId; 357 } 358 359 @Override 360 public String getResponsibilityName() { 361 return this.responsibilityName; 362 } 363 364 @Override 365 public String getResponsibilityId() { 366 return this.responsibilityId; 367 } 368 369 @Override 370 public String getResponsibilityNamespaceCode() { 371 return this.responsibilityNamespaceCode; 372 } 373 374 @Override 375 public boolean isForceAction() { 376 return this.forceAction; 377 } 378 379 @Override 380 public Map<String, String> getQualifier() { 381 return this.qualifier; 382 } 383 384 @Override 385 public List<DelegateType.Builder> getDelegates() { 386 return Collections.unmodifiableList(this.delegates); 387 } 388 389 @Override 390 public String getRoleId() { 391 return this.roleId; 392 } 393 394 public void setPrincipalId(String principalId) { 395 this.principalId = principalId; 396 } 397 398 public void setRoleResponsibilityActionId(String roleResponsibilityActionId) { 399 this.roleResponsibilityActionId = roleResponsibilityActionId; 400 } 401 402 public void setParallelRoutingGroupingCode(String parallelRoutingGroupingCode) { 403 this.parallelRoutingGroupingCode = parallelRoutingGroupingCode; 404 } 405 406 public void setActionTypeCode(String actionTypeCode) { 407 this.actionTypeCode = actionTypeCode; 408 } 409 410 public void setActionPolicyCode(String actionPolicyCode) { 411 this.actionPolicyCode = actionPolicyCode; 412 } 413 414 public void setPriorityNumber(Integer priorityNumber) { 415 this.priorityNumber = priorityNumber; 416 } 417 418 public void setGroupId(String groupId) { 419 this.groupId = groupId; 420 } 421 422 public void setMemberRoleId(String memberRoleId) { 423 if (StringUtils.isBlank(memberRoleId)) { 424 throw new IllegalArgumentException("memberRoleId is blank"); 425 } 426 427 this.memberRoleId = memberRoleId; 428 } 429 430 public void setResponsibilityName(String responsibilityName) { 431 if (StringUtils.isBlank(responsibilityName)) { 432 throw new IllegalArgumentException("responsibilityName is blank"); 433 } 434 435 this.responsibilityName = responsibilityName; 436 } 437 438 public void setResponsibilityId(String responsibilityId) { 439 if (StringUtils.isBlank(responsibilityId)) { 440 throw new IllegalArgumentException("responsibilityId is blank"); 441 } 442 443 this.responsibilityId = responsibilityId; 444 } 445 446 public void setResponsibilityNamespaceCode(String responsibilityNamespaceCode) { 447 if (StringUtils.isBlank(responsibilityNamespaceCode)) { 448 throw new IllegalArgumentException("responsibilityNamespaceCode is blank"); 449 } 450 this.responsibilityNamespaceCode = responsibilityNamespaceCode; 451 } 452 453 public void setForceAction(boolean forceAction) { 454 this.forceAction = forceAction; 455 } 456 457 public void setQualifier(Map<String, String> qualifier) { 458 this.qualifier = (qualifier != null) ? Collections.unmodifiableMap(Maps.newHashMap(qualifier)) : qualifier; 459 } 460 461 public void setDelegates(List<DelegateType.Builder> delegates) { 462 if (delegates == null) { 463 throw new IllegalArgumentException("delegates is null"); 464 } 465 this.delegates = new ArrayList<DelegateType.Builder>(delegates); 466 } 467 468 public void setRoleId(String roleId) { 469 if (StringUtils.isBlank(roleId)) { 470 throw new IllegalArgumentException("roleId is blank"); 471 } 472 this.roleId = roleId; 473 } 474 475 } 476 477 478 /** 479 * Defines some internal constants used on this class. 480 */ 481 static class Constants { 482 483 final static String ROOT_ELEMENT_NAME = "responsibilityAction"; 484 final static String TYPE_NAME = "ResponsibilityActionType"; 485 } 486 487 488 /** 489 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML. 490 */ 491 static class Elements { 492 493 final static String PRINCIPAL_ID = "principalId"; 494 final static String ROLE_RESPONSIBILITY_ACTION_ID = "roleResponsibilityActionId"; 495 final static String PARALLEL_ROUTING_GROUPING_CODE = "parallelRoutingGroupingCode"; 496 final static String ACTION_TYPE_CODE = "actionTypeCode"; 497 final static String ACTION_POLICY_CODE = "actionPolicyCode"; 498 final static String PRIORITY_NUMBER = "priorityNumber"; 499 final static String GROUP_ID = "groupId"; 500 final static String MEMBER_ROLE_ID = "memberRoleId"; 501 final static String RESPONSIBILITY_NAME = "responsibilityName"; 502 final static String RESPONSIBILITY_ID = "responsibilityId"; 503 final static String RESPONSIBILITY_NAMESPACE_CODE = "responsibilityNamespaceCode"; 504 final static String FORCE_ACTION = "forceAction"; 505 final static String QUALIFIER = "qualifier"; 506 final static String DELEGATES = "delegates"; 507 final static String DELEGATE = "delegate"; 508 final static String ROLE_ID = "roleId"; 509 510 } 511 512 }