001 /** 002 * Copyright 2005-2013 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.action; 017 018 import org.apache.commons.collections.CollectionUtils; 019 import org.apache.commons.lang.StringUtils; 020 import org.joda.time.DateTime; 021 import org.kuali.rice.core.api.CoreConstants; 022 import org.kuali.rice.core.api.delegation.DelegationType; 023 import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 024 import org.kuali.rice.core.api.mo.ModelBuilder; 025 import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter; 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.XmlRootElement; 033 import javax.xml.bind.annotation.XmlType; 034 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 035 import java.io.Serializable; 036 import java.util.Collection; 037 import java.util.Collections; 038 039 @XmlRootElement(name = ActionItem.Constants.ROOT_ELEMENT_NAME) 040 @XmlAccessorType(XmlAccessType.NONE) 041 @XmlType(name = ActionItem.Constants.TYPE_NAME, propOrder = { 042 ActionItem.Elements.ID, 043 ActionItem.Elements.DATE_TIME_ASSIGNED, 044 ActionItem.Elements.ACTION_REQUEST_CD, 045 ActionItem.Elements.ACTION_REQUEST_ID, 046 ActionItem.Elements.DOCUMENT_ID, 047 ActionItem.Elements.DOC_TITLE, 048 ActionItem.Elements.DOC_LABEL, 049 ActionItem.Elements.DOC_HANDLER_U_R_L, 050 ActionItem.Elements.DOC_NAME, 051 ActionItem.Elements.RESPONSIBILITY_ID, 052 ActionItem.Elements.ROLE_NAME, 053 ActionItem.Elements.DELEGATION_TYPE, 054 ActionItem.Elements.GROUP_ID, 055 ActionItem.Elements.PRINCIPAL_ID, 056 ActionItem.Elements.DELEGATOR_GROUP_ID, 057 ActionItem.Elements.DELEGATOR_PRINCIPAL_ID, 058 ActionItem.Elements.DATE_TIME_ASSIGNED_VALUE, 059 CoreConstants.CommonElements.FUTURE_ELEMENTS 060 }) 061 public final class ActionItem 062 extends AbstractDataTransferObject 063 implements ActionItemContract 064 { 065 066 @XmlElement(name = Elements.ID, required = false) 067 private final String id; 068 @Deprecated 069 @XmlElement(name = Elements.DATE_TIME_ASSIGNED, required = false) 070 private final DateTime dateTimeAssigned; 071 @XmlElement(name = Elements.ACTION_REQUEST_CD, required = true) 072 private final String actionRequestCd; 073 @XmlElement(name = Elements.ACTION_REQUEST_ID, required = true) 074 private final String actionRequestId; 075 @XmlElement(name = Elements.DOCUMENT_ID, required = true) 076 private final String documentId; 077 @XmlElement(name = Elements.DOC_TITLE, required = false) 078 private final String docTitle; 079 @XmlElement(name = Elements.DOC_LABEL, required = true) 080 private final String docLabel; 081 @XmlElement(name = Elements.DOC_HANDLER_U_R_L, required = true) 082 private final String docHandlerURL; 083 @XmlElement(name = Elements.DOC_NAME, required = true) 084 private final String docName; 085 @XmlElement(name = Elements.RESPONSIBILITY_ID, required = true) 086 private final String responsibilityId; 087 @XmlElement(name = Elements.ROLE_NAME, required = false) 088 private final String roleName; 089 @XmlElement(name = Elements.DELEGATION_TYPE, required = false) 090 private final String delegationType; 091 @XmlElement(name = Elements.GROUP_ID, required = false) 092 private final String groupId; 093 @XmlElement(name = Elements.PRINCIPAL_ID, required = true) 094 private final String principalId; 095 @XmlElement(name = Elements.DELEGATOR_GROUP_ID, required = false) 096 private final String delegatorGroupId; 097 @XmlElement(name = Elements.DELEGATOR_PRINCIPAL_ID, required = false) 098 private final String delegatorPrincipalId; 099 @XmlElement(name = Elements.DATE_TIME_ASSIGNED_VALUE, required = false) 100 @XmlJavaTypeAdapter(DateTimeAdapter.class) 101 private final DateTime dateTimeAssignedValue; 102 @SuppressWarnings("unused") 103 @XmlAnyElement 104 private final Collection<Element> _futureElements = null; 105 106 /** 107 * Private constructor used only by JAXB. 108 * 109 */ 110 private ActionItem() { 111 this.id = null; 112 this.dateTimeAssigned = null; 113 this.dateTimeAssignedValue = null; 114 this.actionRequestCd = null; 115 this.actionRequestId = null; 116 this.documentId = null; 117 this.docTitle = null; 118 this.docLabel = null; 119 this.docHandlerURL = null; 120 this.docName = null; 121 this.responsibilityId = null; 122 this.roleName = null; 123 this.delegationType = null; 124 this.groupId = null; 125 this.principalId = null; 126 this.delegatorGroupId = null; 127 this.delegatorPrincipalId = null; 128 } 129 130 private ActionItem(Builder builder) { 131 this.id = builder.getId(); 132 this.dateTimeAssigned = builder.getDateTimeAssigned(); 133 this.dateTimeAssignedValue = builder.getDateTimeAssigned(); 134 this.actionRequestCd = builder.getActionRequestCd(); 135 this.actionRequestId = builder.getActionRequestId(); 136 this.documentId = builder.getDocumentId(); 137 this.docTitle = builder.getDocTitle(); 138 this.docLabel = builder.getDocLabel(); 139 this.docHandlerURL = builder.getDocHandlerURL(); 140 this.docName = builder.getDocName(); 141 this.responsibilityId = builder.getResponsibilityId(); 142 this.roleName = builder.getRoleName(); 143 this.delegationType = builder.getDelegationType() != null ? builder.getDelegationType().getCode() : null; 144 this.groupId = builder.getGroupId(); 145 this.principalId = builder.getPrincipalId(); 146 this.delegatorGroupId = builder.getDelegatorGroupId(); 147 this.delegatorPrincipalId = builder.getDelegatorPrincipalId(); 148 } 149 150 @Override 151 public String getId() { 152 return this.id; 153 } 154 155 @Override 156 public DateTime getDateTimeAssigned() { 157 return this.dateTimeAssignedValue == null ? this.dateTimeAssigned : this.dateTimeAssignedValue; 158 } 159 160 @Override 161 public String getActionRequestCd() { 162 return this.actionRequestCd; 163 } 164 165 @Override 166 public String getActionRequestId() { 167 return this.actionRequestId; 168 } 169 170 @Override 171 public String getDocumentId() { 172 return this.documentId; 173 } 174 175 @Override 176 public String getDocTitle() { 177 return this.docTitle; 178 } 179 180 @Override 181 public String getDocLabel() { 182 return this.docLabel; 183 } 184 185 @Override 186 public String getDocHandlerURL() { 187 return this.docHandlerURL; 188 } 189 190 @Override 191 public String getDocName() { 192 return this.docName; 193 } 194 195 @Override 196 public String getResponsibilityId() { 197 return this.responsibilityId; 198 } 199 200 @Override 201 public String getRoleName() { 202 return this.roleName; 203 } 204 205 @Deprecated 206 @Override 207 public String getDateAssignedString() { 208 // deprecated, always return null (see the contract javadoc for more details) 209 return null; 210 } 211 212 @Deprecated 213 @Override 214 public String getActionToTake() { 215 // deprecated, always return null (see the contract javadoc for more details) 216 return null; 217 } 218 219 @Deprecated 220 @Override 221 public Integer getActionItemIndex() { 222 // deprecated, always return null (see the contract javadoc for more details) 223 return null; 224 } 225 226 @Override 227 public DelegationType getDelegationType() { 228 return DelegationType.fromCode(this.delegationType); 229 } 230 231 232 233 @Override 234 public String getGroupId() { 235 return this.groupId; 236 } 237 238 @Override 239 public String getPrincipalId() { 240 return this.principalId; 241 } 242 243 @Override 244 public String getDelegatorGroupId() { 245 return this.delegatorGroupId; 246 } 247 248 @Override 249 public String getDelegatorPrincipalId() { 250 return this.delegatorPrincipalId; 251 } 252 253 254 /** 255 * A builder which can be used to construct {@link ActionItem} instances. Enforces the constraints of the {@link ActionItemContract}. 256 * 257 */ 258 public final static class Builder 259 implements Serializable, ModelBuilder, ActionItemContract 260 { 261 262 private String id; 263 private DateTime dateTimeAssigned; 264 private String actionRequestCd; 265 private String actionRequestId; 266 private String documentId; 267 private String docTitle; 268 private String docLabel; 269 private String docHandlerURL; 270 private String docName; 271 private String responsibilityId; 272 private String roleName; 273 private DelegationType delegationType; 274 private String groupId; 275 private String principalId; 276 private String delegatorGroupId; 277 private String delegatorPrincipalId; 278 279 private Builder(String documentId, String actionRequestCd, String actionRequestId, 280 DateTime dateTimeAssigned, String docLabel, String docHanderlURL, 281 String docName, String responsibilityId, String principalId) { 282 setDocumentId(documentId); 283 setActionRequestCd(actionRequestCd); 284 setActionRequestId(actionRequestId); 285 setDateTimeAssigned(dateTimeAssigned); 286 setDocLabel(docLabel); 287 setDocHandlerURL(docHanderlURL); 288 setDocName(docName); 289 setResponsibilityId(responsibilityId); 290 setPrincipalId(principalId); 291 } 292 293 public static Builder create(String documentId, String actionRequestCd, String actionRequestId, 294 DateTime dateTimeAssigned, String docLabel, String docHanderlURL, 295 String docName, String responsibilityId, String principalId) { 296 return new Builder(documentId, actionRequestCd, actionRequestId, dateTimeAssigned, docLabel, 297 docHanderlURL, docName, responsibilityId, principalId); 298 } 299 300 public static Builder create(ActionItemContract contract) { 301 if (contract == null) { 302 throw new IllegalArgumentException("contract was null"); 303 } 304 Builder builder = create(contract.getDocumentId(), contract.getActionRequestCd(), contract.getActionRequestId(), 305 contract.getDateTimeAssigned(), contract.getDocLabel(), contract.getDocHandlerURL(), contract.getDocName(), 306 contract.getResponsibilityId(), contract.getPrincipalId()); 307 builder.setId(contract.getId()); 308 builder.setRoleName(contract.getRoleName()); 309 builder.setDocTitle(contract.getDocTitle()); 310 builder.setDelegationType(contract.getDelegationType()); 311 builder.setGroupId(contract.getGroupId()); 312 builder.setPrincipalId(contract.getPrincipalId()); 313 builder.setDelegatorGroupId(contract.getDelegatorGroupId()); 314 builder.setDelegatorPrincipalId(contract.getDelegatorPrincipalId()); 315 return builder; 316 } 317 318 public ActionItem build() { 319 return new ActionItem(this); 320 } 321 322 @Override 323 public String getId() { 324 return this.id; 325 } 326 327 @Override 328 public DateTime getDateTimeAssigned() { 329 return this.dateTimeAssigned; 330 } 331 332 @Override 333 public String getActionRequestCd() { 334 return this.actionRequestCd; 335 } 336 337 @Override 338 public String getActionRequestId() { 339 return this.actionRequestId; 340 } 341 342 @Override 343 public String getDocumentId() { 344 return this.documentId; 345 } 346 347 @Override 348 public String getDocTitle() { 349 return this.docTitle; 350 } 351 352 @Override 353 public String getDocLabel() { 354 return this.docLabel; 355 } 356 357 @Override 358 public String getDocHandlerURL() { 359 return this.docHandlerURL; 360 } 361 362 @Override 363 public String getDocName() { 364 return this.docName; 365 } 366 367 @Override 368 public String getResponsibilityId() { 369 return this.responsibilityId; 370 } 371 372 @Override 373 public String getRoleName() { 374 return this.roleName; 375 } 376 377 @Deprecated 378 @Override 379 public String getDateAssignedString() { 380 // deprecated, always return null (see the contract javadoc for more details) 381 return null; 382 } 383 384 @Deprecated 385 @Override 386 public String getActionToTake() { 387 // deprecated, always return null (see the contract javadoc for more details) 388 return null; 389 } 390 391 @Deprecated 392 @Override 393 public Integer getActionItemIndex() { 394 // deprecated, always return null (see the contract javadoc for more details) 395 return null; 396 } 397 398 @Override 399 public DelegationType getDelegationType() { 400 return this.delegationType; 401 } 402 403 @Override 404 public String getGroupId() { 405 return this.groupId; 406 } 407 408 @Override 409 public String getPrincipalId() { 410 return this.principalId; 411 } 412 413 @Override 414 public String getDelegatorGroupId() { 415 return this.delegatorGroupId; 416 } 417 418 @Override 419 public String getDelegatorPrincipalId() { 420 return this.delegatorPrincipalId; 421 } 422 423 public void setId(String id) { 424 if (StringUtils.isWhitespace(id)) { 425 throw new IllegalArgumentException("id is blank"); 426 } 427 this.id = id; 428 } 429 430 public void setDateTimeAssigned(DateTime dateTimeAssigned) { 431 if (dateTimeAssigned == null) { 432 throw new IllegalArgumentException("dateTimeAssigned is null"); 433 } 434 this.dateTimeAssigned = dateTimeAssigned; 435 } 436 437 public void setActionRequestCd(String actionRequestCd) { 438 if (StringUtils.isBlank(actionRequestCd)) { 439 throw new IllegalArgumentException("actionRequestCd is blank"); 440 } 441 this.actionRequestCd = actionRequestCd; 442 } 443 444 public void setActionRequestId(String actionRequestId) { 445 if (StringUtils.isBlank(actionRequestId)) { 446 throw new IllegalArgumentException("actionRequestId is blank"); 447 } 448 this.actionRequestId = actionRequestId; 449 } 450 451 public void setDocumentId(String documentId) { 452 if (StringUtils.isBlank(documentId)) { 453 throw new IllegalArgumentException("documentId is blank"); 454 } 455 this.documentId = documentId; 456 } 457 458 public void setDocTitle(String docTitle) { 459 this.docTitle = docTitle; 460 } 461 462 public void setDocLabel(String docLabel) { 463 if (StringUtils.isBlank(docLabel)) { 464 throw new IllegalArgumentException("docLabel is blank"); 465 } 466 this.docLabel = docLabel; 467 } 468 469 public void setDocHandlerURL(String docHandlerURL) { 470 // can be empty, but not null 471 if (docHandlerURL == null) { 472 throw new IllegalArgumentException("docHandlerURL is null"); 473 } 474 this.docHandlerURL = docHandlerURL; 475 } 476 477 public void setDocName(String docName) { 478 if (StringUtils.isBlank(docName)) { 479 throw new IllegalArgumentException("docName is blank"); 480 } 481 this.docName = docName; 482 } 483 484 public void setResponsibilityId(String responsibilityId) { 485 if (StringUtils.isBlank(responsibilityId)) { 486 throw new IllegalArgumentException("responsibilityId is blank"); 487 } 488 this.responsibilityId = responsibilityId; 489 } 490 491 public void setRoleName(String roleName) { 492 this.roleName = roleName; 493 } 494 495 /** 496 * This method has been deprecated and should not be called. If it is, then it will have no effect. 497 * It was mistakenly added to this interface when it was created and has been left here for compatibility 498 * purposes. 499 * 500 * @deprecated dateAssignedString is never used 501 */ 502 @Deprecated 503 public void setDateAssignedString(String dateAssignedString) { 504 // deprecated, does nothing 505 } 506 507 /** 508 * This method has been deprecated and should not be called. If it is, then it will have no effect. 509 * It was mistakenly added to this interface when it was created and has been left here for compatibility 510 * purposes. 511 * 512 * @deprecated actionToTake is never used 513 */ 514 @Deprecated 515 public void setActionToTake(String actionToTake) { 516 // deprecated, does nothing 517 } 518 519 public void setDelegationType(DelegationType delegationType) { 520 this.delegationType = delegationType; 521 } 522 523 /** 524 * This method has been deprecated and should not be called. If it is, then it will have no effect. 525 * It was mistakenly added to this interface when it was created and has been left here for compatibility 526 * purposes. 527 * 528 * @deprecated actionItemIndex is never used 529 */ 530 @Deprecated 531 public void setActionItemIndex(Integer actionItemIndex) { 532 // deprecated, does nothing 533 } 534 535 public void setGroupId(String groupId) { 536 this.groupId = groupId; 537 } 538 539 public void setPrincipalId(String principalId) { 540 if (StringUtils.isBlank(principalId)) { 541 throw new IllegalArgumentException("principalId is blank"); 542 } 543 this.principalId = principalId; 544 } 545 546 public void setDelegatorGroupId(String delegatorGroupId) { 547 this.delegatorGroupId = delegatorGroupId; 548 } 549 550 public void setDelegatorPrincipalId(String delegatorPrincipalId) { 551 this.delegatorPrincipalId = delegatorPrincipalId; 552 } 553 554 } 555 556 @Override 557 public boolean equals(Object obj) { 558 return equalsExcludeFields(obj, Constants.excludeFields); 559 } 560 561 @Override 562 public int hashCode() { 563 return hashCodeExcludeFields(Constants.excludeFields); 564 } 565 566 /** 567 * Defines some internal constants used on this class. 568 * 569 */ 570 static class Constants { 571 572 final static String ROOT_ELEMENT_NAME = "actionItem"; 573 final static String TYPE_NAME = "ActionItemType"; 574 575 576 final static Collection<String> excludeFields; 577 578 static { 579 excludeFields = Collections.unmodifiableCollection( (Collection<String>) 580 CollectionUtils.union( 581 Collections.singletonList("dateTimeAssigned"), 582 getDefaultHashCodeEqualsExcludeFields() 583 ) 584 ); 585 } 586 } 587 588 589 /** 590 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML. 591 * 592 */ 593 static class Elements { 594 595 final static String ID = "id"; 596 final static String DATE_TIME_ASSIGNED = "dateTimeAssigned"; 597 final static String DATE_TIME_ASSIGNED_VALUE = "dateTimeAssignedValue"; 598 final static String ACTION_REQUEST_CD = "actionRequestCd"; 599 final static String ACTION_REQUEST_ID = "actionRequestId"; 600 final static String DOCUMENT_ID = "documentId"; 601 final static String DOC_TITLE = "docTitle"; 602 final static String DOC_LABEL = "docLabel"; 603 final static String DOC_HANDLER_U_R_L = "docHandlerURL"; 604 final static String DOC_NAME = "docName"; 605 final static String RESPONSIBILITY_ID = "responsibilityId"; 606 final static String ROLE_NAME = "roleName"; 607 final static String DELEGATION_TYPE = "delegationType"; 608 final static String GROUP_ID = "groupId"; 609 final static String PRINCIPAL_ID = "principalId"; 610 final static String DELEGATOR_GROUP_ID = "delegatorGroupId"; 611 final static String DELEGATOR_PRINCIPAL_ID = "delegatorPrincipalId"; 612 613 } 614 615 }