001/** 002 * Copyright 2005-2015 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 */ 016package org.kuali.rice.kew.api.document.search; 017 018import org.apache.commons.lang.StringUtils; 019import org.joda.time.DateTime; 020import org.joda.time.DateTimeZone; 021import org.kuali.rice.core.api.CoreConstants; 022import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 023import org.kuali.rice.core.api.mo.ModelBuilder; 024import org.kuali.rice.core.api.mo.ModelObjectUtils; 025import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter; 026import org.kuali.rice.core.api.util.jaxb.MultiValuedStringMapAdapter; 027import org.kuali.rice.kew.api.document.DocumentStatus; 028import org.kuali.rice.kew.api.document.DocumentStatusCategory; 029import org.springframework.util.CollectionUtils; 030import org.w3c.dom.Element; 031 032import javax.xml.bind.annotation.XmlAccessType; 033import javax.xml.bind.annotation.XmlAccessorType; 034import javax.xml.bind.annotation.XmlAnyElement; 035import javax.xml.bind.annotation.XmlElement; 036import javax.xml.bind.annotation.XmlElementWrapper; 037import javax.xml.bind.annotation.XmlRootElement; 038import javax.xml.bind.annotation.XmlType; 039import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 040import java.io.Serializable; 041import java.util.ArrayList; 042import java.util.Collection; 043import java.util.HashMap; 044import java.util.List; 045import java.util.Map; 046 047/** 048 * An immutable data transfer object implementation of the {@link DocumentSearchCriteriaContract}. Instances of this 049 * class should be constructed using the nested {@link Builder} class. 050 * 051 * @author Kuali Rice Team (rice.collab@kuali.org) 052 */ 053@XmlRootElement(name = DocumentSearchCriteria.Constants.ROOT_ELEMENT_NAME) 054@XmlAccessorType(XmlAccessType.NONE) 055@XmlType(name = DocumentSearchCriteria.Constants.TYPE_NAME, propOrder = { 056 DocumentSearchCriteria.Elements.DOCUMENT_ID, 057 DocumentSearchCriteria.Elements.DOCUMENT_STATUSES, 058 DocumentSearchCriteria.Elements.DOCUMENT_STATUS_CATEGORIES, 059 DocumentSearchCriteria.Elements.TITLE, 060 DocumentSearchCriteria.Elements.APPLICATION_DOCUMENT_ID, 061 DocumentSearchCriteria.Elements.APPLICATION_DOCUMENT_STATUS, 062 DocumentSearchCriteria.Elements.INITIATOR_PRINCIPAL_NAME, 063 DocumentSearchCriteria.Elements.VIEWER_PRINCIPAL_NAME, 064 DocumentSearchCriteria.Elements.GROUP_VIEWER_ID, 065 DocumentSearchCriteria.Elements.GROUP_VIEWER_NAME, 066 DocumentSearchCriteria.Elements.APPROVER_PRINCIPAL_NAME, 067 DocumentSearchCriteria.Elements.ROUTE_NODE_NAME, 068 DocumentSearchCriteria.Elements.ROUTE_NODE_LOOKUP_LOGIC, 069 DocumentSearchCriteria.Elements.DOCUMENT_TYPE_NAME, 070 DocumentSearchCriteria.Elements.ADDITIONAL_DOCUMENT_TYPE_NAMES, 071 DocumentSearchCriteria.Elements.DATE_CREATED_FROM, 072 DocumentSearchCriteria.Elements.DATE_CREATED_TO, 073 DocumentSearchCriteria.Elements.DATE_LAST_MODIFIED_FROM, 074 DocumentSearchCriteria.Elements.DATE_LAST_MODIFIED_TO, 075 DocumentSearchCriteria.Elements.DATE_APPROVED_FROM, 076 DocumentSearchCriteria.Elements.DATE_APPROVED_TO, 077 DocumentSearchCriteria.Elements.DATE_FINALIZED_FROM, 078 DocumentSearchCriteria.Elements.DATE_FINALIZED_TO, 079 DocumentSearchCriteria.Elements.DATE_APPLICATION_DOCUMENT_STATUS_CHANGED_FROM, 080 DocumentSearchCriteria.Elements.DATE_APPLICATION_DOCUMENT_STATUS_CHANGED_TO, 081 DocumentSearchCriteria.Elements.DOCUMENT_ATTRIBUTE_VALUES, 082 DocumentSearchCriteria.Elements.SAVE_NAME, 083 DocumentSearchCriteria.Elements.START_AT_INDEX, 084 DocumentSearchCriteria.Elements.MAX_RESULTS, 085 DocumentSearchCriteria.Elements.IS_ADVANCED_SEARCH, 086 DocumentSearchCriteria.Elements.SEARCH_OPTIONS, 087 DocumentSearchCriteria.Elements.APPLICATION_DOCUMENT_STATUSES, 088 DocumentSearchCriteria.Elements.DOC_SEARCH_USER_ID, 089 DocumentSearchCriteria.Elements.INITIATOR_PRINCIPAL_ID, 090 DocumentSearchCriteria.Elements.VIEWER_PRINCIPAL_ID, 091 DocumentSearchCriteria.Elements.APPROVER_PRINCIPAL_ID, 092 CoreConstants.CommonElements.FUTURE_ELEMENTS 093}) 094public final class DocumentSearchCriteria extends AbstractDataTransferObject implements DocumentSearchCriteriaContract { 095 096 private static final long serialVersionUID = -221440103480740497L; 097 098 @XmlElement(name = Elements.DOCUMENT_ID, required = false) 099 private final String documentId; 100 101 @XmlElementWrapper(name = Elements.DOCUMENT_STATUSES, required = false) 102 @XmlElement(name = Elements.DOCUMENT_STATUS, required = false) 103 private final List<DocumentStatus> documentStatuses; 104 105 @XmlElementWrapper(name = Elements.DOCUMENT_STATUS_CATEGORIES, required = false) 106 @XmlElement(name = Elements.DOCUMENT_STATUS_CATEGORY, required = false) 107 private final List<DocumentStatusCategory> documentStatusCategories; 108 109 @XmlElement(name = Elements.TITLE, required = false) 110 private final String title; 111 112 @XmlElement(name = Elements.APPLICATION_DOCUMENT_ID, required = false) 113 private final String applicationDocumentId; 114 115 @XmlElement(name = Elements.APPLICATION_DOCUMENT_STATUS, required = false) 116 private final String applicationDocumentStatus; 117 118 @XmlElement(name = Elements.INITIATOR_PRINCIPAL_NAME, required = false) 119 private final String initiatorPrincipalName; 120 121 @XmlElement(name = Elements.INITIATOR_PRINCIPAL_ID, required = false) 122 private final String initiatorPrincipalId; 123 124 @XmlElement(name = Elements.VIEWER_PRINCIPAL_NAME, required = false) 125 private final String viewerPrincipalName; 126 127 @XmlElement(name = Elements.VIEWER_PRINCIPAL_ID, required = false) 128 private final String viewerPrincipalId; 129 130 @XmlElement(name = Elements.GROUP_VIEWER_ID, required = false) 131 private final String groupViewerId; 132 133 @XmlElement(name = Elements.GROUP_VIEWER_NAME, required = false) 134 private final String groupViewerName; 135 136 @XmlElement(name = Elements.APPROVER_PRINCIPAL_NAME, required = false) 137 private final String approverPrincipalName; 138 139 @XmlElement(name = Elements.APPROVER_PRINCIPAL_ID, required = false) 140 private final String approverPrincipalId; 141 142 @XmlElement(name = Elements.ROUTE_NODE_NAME, required = false) 143 private final String routeNodeName; 144 145 @XmlElement(name = Elements.ROUTE_NODE_LOOKUP_LOGIC, required = false) 146 private final RouteNodeLookupLogic routeNodeLookupLogic; 147 148 @XmlElement(name = Elements.DOCUMENT_TYPE_NAME, required = false) 149 private final String documentTypeName; 150 151 @XmlElementWrapper(name = Elements.ADDITIONAL_DOCUMENT_TYPE_NAMES, required = false) 152 @XmlElement(name = Elements.ADDITIONAL_DOCUMENT_TYPE_NAME, required = false) 153 private final List<String> additionalDocumentTypeNames; 154 155 @XmlElement(name = Elements.DATE_CREATED_FROM, required = false) 156 @XmlJavaTypeAdapter(DateTimeAdapter.class) 157 private final DateTime dateCreatedFrom; 158 159 @XmlElement(name = Elements.DATE_CREATED_TO, required = false) 160 @XmlJavaTypeAdapter(DateTimeAdapter.class) 161 private final DateTime dateCreatedTo; 162 163 @XmlElement(name = Elements.DATE_LAST_MODIFIED_FROM, required = false) 164 @XmlJavaTypeAdapter(DateTimeAdapter.class) 165 private final DateTime dateLastModifiedFrom; 166 167 @XmlElement(name = Elements.DATE_LAST_MODIFIED_TO, required = false) 168 @XmlJavaTypeAdapter(DateTimeAdapter.class) 169 private final DateTime dateLastModifiedTo; 170 171 @XmlElement(name = Elements.DATE_APPROVED_FROM, required = false) 172 @XmlJavaTypeAdapter(DateTimeAdapter.class) 173 private final DateTime dateApprovedFrom; 174 175 @XmlElement(name = Elements.DATE_APPROVED_TO, required = false) 176 @XmlJavaTypeAdapter(DateTimeAdapter.class) 177 private final DateTime dateApprovedTo; 178 179 @XmlElement(name = Elements.DATE_FINALIZED_FROM, required = false) 180 @XmlJavaTypeAdapter(DateTimeAdapter.class) 181 private final DateTime dateFinalizedFrom; 182 183 @XmlElement(name = Elements.DATE_FINALIZED_TO, required = false) 184 @XmlJavaTypeAdapter(DateTimeAdapter.class) 185 private final DateTime dateFinalizedTo; 186 187 @XmlElement(name = Elements.DATE_APPLICATION_DOCUMENT_STATUS_CHANGED_FROM, required = false) 188 @XmlJavaTypeAdapter(DateTimeAdapter.class) 189 private final DateTime dateApplicationDocumentStatusChangedFrom; 190 191 @XmlElement(name = Elements.DATE_APPLICATION_DOCUMENT_STATUS_CHANGED_TO, required = false) 192 @XmlJavaTypeAdapter(DateTimeAdapter.class) 193 private final DateTime dateApplicationDocumentStatusChangedTo; 194 195 @XmlElement(name = Elements.DOCUMENT_ATTRIBUTE_VALUES, required = false) 196 @XmlJavaTypeAdapter(MultiValuedStringMapAdapter.class) 197 private final Map<String, List<String>> documentAttributeValues; 198 199 @XmlElement(name = Elements.SAVE_NAME, required = false) 200 private final String saveName; 201 202 @XmlElement(name = Elements.START_AT_INDEX, required = false) 203 private final Integer startAtIndex; 204 205 @XmlElement(name = Elements.MAX_RESULTS, required = false) 206 private final Integer maxResults; 207 208 @XmlElement(name = Elements.IS_ADVANCED_SEARCH, required = false) 209 private final String isAdvancedSearch; 210 211 @XmlElement(name = Elements.SEARCH_OPTIONS, required = false) 212 @XmlJavaTypeAdapter(MultiValuedStringMapAdapter.class) 213 private final Map<String, List<String>> searchOptions; 214 215 /** 216 * @since 2.1.2 217 */ 218 @XmlElement(name = Elements.APPLICATION_DOCUMENT_STATUS, required = false) 219 @XmlElementWrapper(name = Elements.APPLICATION_DOCUMENT_STATUSES, required = false) 220 private final List<String> applicationDocumentStatuses; 221 222 @XmlElement(name = Elements.DOC_SEARCH_USER_ID, required = false) 223 private final String docSearchUserId; 224 225 @SuppressWarnings("unused") 226 @XmlAnyElement 227 private final Collection<Element> _futureElements = null; 228 229 /** 230 * Private constructor used only by JAXB. 231 */ 232 private DocumentSearchCriteria() { 233 this.documentId = null; 234 this.documentStatuses = null; 235 this.documentStatusCategories = null; 236 this.title = null; 237 this.applicationDocumentId = null; 238 this.applicationDocumentStatus = null; 239 this.initiatorPrincipalName = null; 240 this.initiatorPrincipalId = null; 241 this.viewerPrincipalName = null; 242 this.viewerPrincipalId = null; 243 this.groupViewerId = null; 244 this.groupViewerName = null; 245 this.approverPrincipalName = null; 246 this.approverPrincipalId = null; 247 this.routeNodeName = null; 248 this.routeNodeLookupLogic = null; 249 this.documentTypeName = null; 250 this.additionalDocumentTypeNames = null; 251 this.dateCreatedFrom = null; 252 this.dateCreatedTo = null; 253 this.dateLastModifiedFrom = null; 254 this.dateLastModifiedTo = null; 255 this.dateApprovedFrom = null; 256 this.dateApprovedTo = null; 257 this.dateFinalizedFrom = null; 258 this.dateFinalizedTo = null; 259 this.dateApplicationDocumentStatusChangedFrom = null; 260 this.dateApplicationDocumentStatusChangedTo = null; 261 this.documentAttributeValues = null; 262 this.searchOptions = null; 263 this.saveName = null; 264 this.startAtIndex = null; 265 this.maxResults = null; 266 this.isAdvancedSearch = null; 267 this.docSearchUserId = null; 268 this.applicationDocumentStatuses = null; 269 } 270 271 private DocumentSearchCriteria(Builder builder) { 272 this.documentId = builder.getDocumentId(); 273 this.documentStatuses = ModelObjectUtils.createImmutableCopy(builder.getDocumentStatuses()); 274 this.documentStatusCategories = ModelObjectUtils.createImmutableCopy(builder.getDocumentStatusCategories()); 275 this.title = builder.getTitle(); 276 this.applicationDocumentId = builder.getApplicationDocumentId(); 277 this.applicationDocumentStatus = builder.getApplicationDocumentStatus(); 278 this.initiatorPrincipalName = builder.getInitiatorPrincipalName(); 279 this.initiatorPrincipalId = builder.getInitiatorPrincipalId(); 280 this.viewerPrincipalName = builder.getViewerPrincipalName(); 281 this.viewerPrincipalId = builder.getViewerPrincipalId(); 282 this.groupViewerId = builder.getGroupViewerId(); 283 this.groupViewerName = builder.getGroupViewerName(); 284 this.approverPrincipalName = builder.getApproverPrincipalName(); 285 this.approverPrincipalId = builder.getApproverPrincipalId(); 286 this.routeNodeName = builder.getRouteNodeName(); 287 this.routeNodeLookupLogic = builder.getRouteNodeLookupLogic(); 288 this.documentTypeName = builder.getDocumentTypeName(); 289 this.additionalDocumentTypeNames = ModelObjectUtils.createImmutableCopy( 290 builder.getAdditionalDocumentTypeNames()); 291 this.dateCreatedFrom = builder.getDateCreatedFrom(); 292 this.dateCreatedTo = builder.getDateCreatedTo(); 293 this.dateLastModifiedFrom = builder.getDateLastModifiedFrom(); 294 this.dateLastModifiedTo = builder.getDateLastModifiedTo(); 295 this.dateApprovedFrom = builder.getDateApprovedFrom(); 296 this.dateApprovedTo = builder.getDateApprovedTo(); 297 this.dateFinalizedFrom = builder.getDateFinalizedFrom(); 298 this.dateFinalizedTo = builder.getDateFinalizedTo(); 299 this.dateApplicationDocumentStatusChangedFrom = builder.getDateApplicationDocumentStatusChangedFrom(); 300 this.dateApplicationDocumentStatusChangedTo = builder.getDateApplicationDocumentStatusChangedTo(); 301 this.documentAttributeValues = ModelObjectUtils.createImmutableCopy(builder.getDocumentAttributeValues()); 302 this.searchOptions = ModelObjectUtils.createImmutableCopy(builder.getSearchOptions()); 303 this.saveName = builder.getSaveName(); 304 this.startAtIndex = builder.getStartAtIndex(); 305 this.maxResults = builder.getMaxResults(); 306 this.isAdvancedSearch = builder.getIsAdvancedSearch(); 307 this.docSearchUserId = builder.getDocSearchUserId(); 308 this.applicationDocumentStatuses = builder.getApplicationDocumentStatuses(); 309 } 310 311 @Override 312 public String getDocumentId() { 313 return this.documentId; 314 } 315 316 @Override 317 public List<DocumentStatus> getDocumentStatuses() { 318 return this.documentStatuses; 319 } 320 321 @Override 322 public List<DocumentStatusCategory> getDocumentStatusCategories() { 323 return this.documentStatusCategories; 324 } 325 326 @Override 327 public String getTitle() { 328 return this.title; 329 } 330 331 @Override 332 public String getApplicationDocumentId() { 333 return this.applicationDocumentId; 334 } 335 336 /** 337 * @deprecated use {@link #getApplicationDocumentStatuses()} instead 338 * @return 339 */ 340 @Deprecated 341 @Override 342 public String getApplicationDocumentStatus() { 343 return this.applicationDocumentStatus; 344 } 345 346 /** 347 * @deprecated use {@link #getInitiatorPrincipalId()} instead 348 */ 349 @Deprecated 350 @Override 351 public String getInitiatorPrincipalName() { 352 return this.initiatorPrincipalName; 353 } 354 355 @Override 356 public String getInitiatorPrincipalId() { 357 return this.initiatorPrincipalId; 358 } 359 360 /** 361 * @deprecated use {@link #getViewerPrincipalId()} instead 362 */ 363 @Deprecated 364 @Override 365 public String getViewerPrincipalName() { 366 return this.viewerPrincipalName; 367 } 368 369 @Override 370 public String getViewerPrincipalId() { 371 return this.viewerPrincipalId; 372 } 373 374 @Override 375 public String getGroupViewerId() { 376 return this.groupViewerId; 377 } 378 379 @Override 380 public String getGroupViewerName() { 381 return this.groupViewerName; 382 } 383 384 /** 385 * @deprecated use {@link #getApproverPrincipalId()} instead 386 */ 387 @Deprecated 388 @Override 389 public String getApproverPrincipalName() { 390 return this.approverPrincipalName; 391 } 392 393 @Override 394 public String getApproverPrincipalId() { 395 return this.approverPrincipalId; 396 } 397 398 @Override 399 public String getRouteNodeName() { 400 return this.routeNodeName; 401 } 402 403 @Override 404 public RouteNodeLookupLogic getRouteNodeLookupLogic() { 405 return this.routeNodeLookupLogic; 406 } 407 408 @Override 409 public String getDocumentTypeName() { 410 return this.documentTypeName; 411 } 412 413 @Override 414 public List<String> getAdditionalDocumentTypeNames() { 415 return this.additionalDocumentTypeNames; 416 } 417 418 @Override 419 public DateTime getDateCreatedFrom() { 420 return this.dateCreatedFrom; 421 } 422 423 @Override 424 public DateTime getDateCreatedTo() { 425 return this.dateCreatedTo; 426 } 427 428 @Override 429 public DateTime getDateLastModifiedFrom() { 430 return this.dateLastModifiedFrom; 431 } 432 433 @Override 434 public DateTime getDateLastModifiedTo() { 435 return this.dateLastModifiedTo; 436 } 437 438 @Override 439 public DateTime getDateApprovedFrom() { 440 return this.dateApprovedFrom; 441 } 442 443 @Override 444 public DateTime getDateApprovedTo() { 445 return this.dateApprovedTo; 446 } 447 448 @Override 449 public DateTime getDateFinalizedFrom() { 450 return this.dateFinalizedFrom; 451 } 452 453 @Override 454 public DateTime getDateFinalizedTo() { 455 return this.dateFinalizedTo; 456 } 457 458 @Override 459 public DateTime getDateApplicationDocumentStatusChangedFrom() { 460 return dateApplicationDocumentStatusChangedFrom; 461 } 462 463 @Override 464 public DateTime getDateApplicationDocumentStatusChangedTo() { 465 return dateApplicationDocumentStatusChangedTo; 466 } 467 468 @Override 469 public Map<String, List<String>> getDocumentAttributeValues() { 470 return this.documentAttributeValues; 471 } 472 473 @Override 474 public Map<String, List<String>> getSearchOptions() { 475 return this.searchOptions; 476 } 477 478 @Override 479 public String getSaveName() { 480 return saveName; 481 } 482 483 @Override 484 public Integer getStartAtIndex() { 485 return this.startAtIndex; 486 } 487 488 @Override 489 public Integer getMaxResults() { 490 return this.maxResults; 491 } 492 493 @Override 494 public String getIsAdvancedSearch() { 495 return this.isAdvancedSearch; 496 } 497 498 /** 499 * @since 2.1.2 500 */ 501 @Override 502 public List<String> getApplicationDocumentStatuses() { 503 return applicationDocumentStatuses; 504 } 505 506 @Override 507 public String getDocSearchUserId(){ 508 return docSearchUserId; 509 } 510 /** 511 * A builder which can be used to construct {@link DocumentSearchCriteria} instances. Enforces the constraints of 512 * the {@link DocumentSearchCriteriaContract}. 513 */ 514 public final static class Builder implements Serializable, ModelBuilder, DocumentSearchCriteriaContract { 515 516 private String documentId; 517 private List<DocumentStatus> documentStatuses; 518 private List<DocumentStatusCategory> documentStatusCategories; 519 private String title; 520 private String applicationDocumentId; 521 private String applicationDocumentStatus; 522 private String initiatorPrincipalName; 523 private String initiatorPrincipalId; 524 private String viewerPrincipalName; 525 private String viewerPrincipalId; 526 private String groupViewerId; 527 private String groupViewerName; 528 private String approverPrincipalName; 529 private String approverPrincipalId; 530 private String routeNodeName; 531 private RouteNodeLookupLogic routeNodeLookupLogic; 532 private String documentTypeName; 533 private List<String> additionalDocumentTypeNames; 534 private DateTime dateCreatedFrom; 535 private DateTime dateCreatedTo; 536 private DateTime dateLastModifiedFrom; 537 private DateTime dateLastModifiedTo; 538 private DateTime dateApprovedFrom; 539 private DateTime dateApprovedTo; 540 private DateTime dateFinalizedFrom; 541 private DateTime dateFinalizedTo; 542 private DateTime dateApplicationDocumentStatusChangedFrom; 543 private DateTime dateApplicationDocumentStatusChangedTo; 544 private Map<String, List<String>> documentAttributeValues; 545 private Map<String, List<String>> searchOptions; 546 private String saveName; 547 private Integer startAtIndex; 548 private Integer maxResults; 549 private String isAdvancedSearch; 550 private String docSearchUserId; 551 private List<String> applicationDocumentStatuses; 552 553 private Builder() { 554 setDocumentStatuses(new ArrayList<DocumentStatus>()); 555 setDocumentStatusCategories(new ArrayList<DocumentStatusCategory>()); 556 setAdditionalDocumentTypeNames(new ArrayList<String>()); 557 setDocumentAttributeValues(new HashMap<String, List<String>>()); 558 setSearchOptions(new HashMap<String, List<String>>()); 559 setApplicationDocumentStatuses(new ArrayList<String>()); 560 } 561 562 /** 563 * Creates an empty builder instance. All collections on the new instance are initialized to empty collections. 564 * 565 * @return a new builder instance 566 */ 567 public static Builder create() { 568 return new Builder(); 569 } 570 571 /** 572 * Creates a new builder instance initialized with copies of the properties from the given contract. 573 * 574 * @param contract the contract from which to copy properties 575 * 576 * @return a builder instance initialized with properties from the given contract 577 * 578 * @throws IllegalArgumentException if the given contract is null 579 */ 580 public static Builder create(DocumentSearchCriteriaContract contract) { 581 if (contract == null) { 582 throw new IllegalArgumentException("contract was null"); 583 } 584 Builder builder = create(); 585 builder.setDocumentId(contract.getDocumentId()); 586 if (contract.getDocumentStatuses() != null) { 587 builder.setDocumentStatuses(new ArrayList<DocumentStatus>(contract.getDocumentStatuses())); 588 } 589 if (contract.getDocumentStatusCategories() != null) { 590 builder.setDocumentStatusCategories(new ArrayList<DocumentStatusCategory>(contract.getDocumentStatusCategories())); 591 } 592 builder.setTitle(contract.getTitle()); 593 builder.setApplicationDocumentId(contract.getApplicationDocumentId()); 594 builder.setInitiatorPrincipalName(contract.getInitiatorPrincipalName()); 595 builder.setInitiatorPrincipalId(contract.getInitiatorPrincipalId()); 596 builder.setViewerPrincipalName(contract.getViewerPrincipalName()); 597 builder.setViewerPrincipalId(contract.getViewerPrincipalId()); 598 builder.setGroupViewerId(contract.getGroupViewerId()); 599 builder.setGroupViewerName(contract.getGroupViewerName()); 600 builder.setApproverPrincipalName(contract.getApproverPrincipalName()); 601 builder.setApproverPrincipalId(contract.getApproverPrincipalId()); 602 builder.setRouteNodeName(contract.getRouteNodeName()); 603 builder.setRouteNodeLookupLogic(contract.getRouteNodeLookupLogic()); 604 builder.setDocumentTypeName(contract.getDocumentTypeName()); 605 if (contract.getAdditionalDocumentTypeNames() != null) { 606 builder.setAdditionalDocumentTypeNames(new ArrayList<String>(contract.getAdditionalDocumentTypeNames())); 607 } 608 builder.setDateCreatedFrom(contract.getDateCreatedFrom()); 609 builder.setDateCreatedTo(contract.getDateCreatedTo()); 610 builder.setDateLastModifiedFrom(contract.getDateLastModifiedFrom()); 611 builder.setDateLastModifiedTo(contract.getDateLastModifiedTo()); 612 builder.setDateApprovedFrom(contract.getDateApprovedFrom()); 613 builder.setDateApprovedTo(contract.getDateApprovedTo()); 614 builder.setDateFinalizedFrom(contract.getDateFinalizedFrom()); 615 builder.setDateFinalizedTo(contract.getDateFinalizedTo()); 616 builder.setDateApplicationDocumentStatusChangedFrom(contract.getDateApplicationDocumentStatusChangedFrom()); 617 builder.setDateApplicationDocumentStatusChangedTo(contract.getDateApplicationDocumentStatusChangedTo()); 618 if (contract.getDocumentAttributeValues() != null) { 619 builder.setDocumentAttributeValues(new HashMap<String, List<String>>(contract.getDocumentAttributeValues())); 620 } 621 if (contract.getSearchOptions() != null) { 622 builder.setSearchOptions(new HashMap<String, List<String>>(contract.getSearchOptions())); 623 } 624 builder.setSaveName(contract.getSaveName()); 625 builder.setStartAtIndex(contract.getStartAtIndex()); 626 builder.setMaxResults(contract.getMaxResults()); 627 builder.setIsAdvancedSearch(contract.getIsAdvancedSearch()); 628 629 // Set applicationDocumentStatuses (plural!) 630 builder.setApplicationDocumentStatuses(contract.getApplicationDocumentStatuses()); 631 // Set applicationDocumentStatus (singular!) 632 builder.setApplicationDocumentStatus(contract.getApplicationDocumentStatus()); 633 builder.setDocSearchUserId(contract.getDocSearchUserId()); 634 635 return builder; 636 } 637 638 @Override 639 public DocumentSearchCriteria build() { 640 if (StringUtils.isNotBlank(routeNodeName) && StringUtils.isBlank(documentTypeName)) { 641 throw new IllegalStateException("documentTypeName must be set if routeNodeName is set."); 642 } 643 return new DocumentSearchCriteria(this); 644 } 645 646 @Override 647 public String getDocumentId() { 648 return this.documentId; 649 } 650 651 @Override 652 public List<DocumentStatus> getDocumentStatuses() { 653 return this.documentStatuses; 654 } 655 656 @Override 657 public List<DocumentStatusCategory> getDocumentStatusCategories() { 658 return this.documentStatusCategories; 659 } 660 661 @Override 662 public String getTitle() { 663 return this.title; 664 } 665 666 @Override 667 public String getApplicationDocumentId() { 668 return this.applicationDocumentId; 669 } 670 671 /** 672 * @deprecated use {@link #getApplicationDocumentStatuses()} instead 673 */ 674 @Deprecated 675 @Override 676 public String getApplicationDocumentStatus() { 677 return this.applicationDocumentStatus; 678 } 679 680 /** 681 * @deprecated use {@link #getInitiatorPrincipalId()} instead 682 */ 683 @Deprecated 684 @Override 685 public String getInitiatorPrincipalName() { 686 return this.initiatorPrincipalName; 687 } 688 689 @Override 690 public String getInitiatorPrincipalId() { 691 return this.initiatorPrincipalId; 692 } 693 694 /** 695 * @deprecated use {@link #getViewerPrincipalId()} instead 696 */ 697 @Deprecated 698 @Override 699 public String getViewerPrincipalName() { 700 return this.viewerPrincipalName; 701 } 702 703 @Override 704 public String getViewerPrincipalId() { 705 return this.viewerPrincipalId; 706 } 707 708 @Override 709 public String getGroupViewerId() { 710 return this.groupViewerId; 711 } 712 713 @Override 714 public String getGroupViewerName() { 715 return this.groupViewerName; 716 } 717 718 /** 719 * @deprecated use {@link #getApproverPrincipalId()} instead 720 */ 721 @Deprecated 722 @Override 723 public String getApproverPrincipalName() { 724 return this.approverPrincipalName; 725 } 726 727 @Override 728 public String getApproverPrincipalId() { 729 return this.approverPrincipalId; 730 } 731 732 @Override 733 public String getRouteNodeName() { 734 return this.routeNodeName; 735 } 736 737 @Override 738 public RouteNodeLookupLogic getRouteNodeLookupLogic() { 739 return this.routeNodeLookupLogic; 740 } 741 742 @Override 743 public String getDocumentTypeName() { 744 return this.documentTypeName; 745 } 746 747 @Override 748 public List<String> getAdditionalDocumentTypeNames() { 749 return additionalDocumentTypeNames; 750 } 751 752 @Override 753 public DateTime getDateCreatedFrom() { 754 return this.dateCreatedFrom; 755 } 756 757 @Override 758 public DateTime getDateCreatedTo() { 759 return this.dateCreatedTo; 760 } 761 762 @Override 763 public DateTime getDateLastModifiedFrom() { 764 return this.dateLastModifiedFrom; 765 } 766 767 @Override 768 public DateTime getDateLastModifiedTo() { 769 return this.dateLastModifiedTo; 770 } 771 772 @Override 773 public DateTime getDateApprovedFrom() { 774 return this.dateApprovedFrom; 775 } 776 777 @Override 778 public DateTime getDateApprovedTo() { 779 return this.dateApprovedTo; 780 } 781 782 @Override 783 public DateTime getDateFinalizedFrom() { 784 return this.dateFinalizedFrom; 785 } 786 787 @Override 788 public DateTime getDateFinalizedTo() { 789 return this.dateFinalizedTo; 790 } 791 792 @Override 793 public DateTime getDateApplicationDocumentStatusChangedFrom() { 794 return dateApplicationDocumentStatusChangedFrom; 795 } 796 797 @Override 798 public DateTime getDateApplicationDocumentStatusChangedTo() { 799 return dateApplicationDocumentStatusChangedTo; 800 } 801 802 @Override 803 public Map<String, List<String>> getDocumentAttributeValues() { 804 return this.documentAttributeValues; 805 } 806 807 @Override 808 public Map<String, List<String>> getSearchOptions() { 809 return this.searchOptions; 810 } 811 812 @Override 813 public String getSaveName() { 814 return this.saveName; 815 } 816 817 @Override 818 public Integer getStartAtIndex() { 819 return this.startAtIndex; 820 } 821 822 @Override 823 public Integer getMaxResults() { 824 return this.maxResults; 825 } 826 827 @Override 828 public String getIsAdvancedSearch() { 829 return this.isAdvancedSearch; 830 } 831 832 public List<String> getApplicationDocumentStatuses() { 833 return applicationDocumentStatuses; 834 } 835 836 public String getDocSearchUserId(){ 837 return docSearchUserId; 838 } 839 840 public void setDocumentId(String documentId) { 841 this.documentId = documentId; 842 } 843 844 public void setDocumentStatuses(List<DocumentStatus> documentStatuses) { 845 this.documentStatuses = documentStatuses; 846 } 847 848 public void setDocumentStatusCategories(List<DocumentStatusCategory> documentStatusCategories) { 849 this.documentStatusCategories = documentStatusCategories; 850 } 851 852 public void setTitle(String title) { 853 this.title = title; 854 } 855 856 public void setApplicationDocumentId(String applicationDocumentId) { 857 this.applicationDocumentId = applicationDocumentId; 858 } 859 860 /** 861 * @deprecated use {@link #setApplicationDocumentStatuses(java.util.List)} instead 862 */ 863 @Deprecated 864 public void setApplicationDocumentStatus(String applicationDocumentStatus) { 865 this.applicationDocumentStatus = applicationDocumentStatus; 866 } 867 868 /** 869 * @deprecated use {@link #setInitiatorPrincipalId(String)} instead 870 * @param initiatorPrincipalName 871 */ 872 public void setInitiatorPrincipalName(String initiatorPrincipalName) { 873 this.initiatorPrincipalName = initiatorPrincipalName; 874 } 875 876 public void setInitiatorPrincipalId(String initiatorPrincipalId) { 877 this.initiatorPrincipalId = initiatorPrincipalId; 878 } 879 880 /** 881 * @deprecated use {@link #setViewerPrincipalId(String)} instead 882 * @param viewerPrincipalName 883 */ 884 @Deprecated 885 public void setViewerPrincipalName(String viewerPrincipalName) { 886 this.viewerPrincipalName = viewerPrincipalName; 887 } 888 889 public void setViewerPrincipalId(String viewerPrincipalId) { 890 this.viewerPrincipalId = viewerPrincipalId; 891 } 892 893 public void setGroupViewerId(String groupViewerId) { 894 this.groupViewerId = groupViewerId; 895 } 896 897 public void setGroupViewerName (String groupViewerName) { 898 this.groupViewerName = groupViewerName; 899 } 900 901 /** 902 * @deprecated use {@link #setApproverPrincipalId(String)} instead 903 * @param approverPrincipalName 904 */ 905 @Deprecated 906 public void setApproverPrincipalName(String approverPrincipalName) { 907 this.approverPrincipalName = approverPrincipalName; 908 } 909 910 public void setApproverPrincipalId(String approverPrincipalId) { 911 this.approverPrincipalId = approverPrincipalId; 912 } 913 914 public void setRouteNodeName(String routeNodeName) { 915 this.routeNodeName = routeNodeName; 916 } 917 918 public void setRouteNodeLookupLogic(RouteNodeLookupLogic routeNodeLookupLogic) { 919 this.routeNodeLookupLogic = routeNodeLookupLogic; 920 } 921 922 public void setDocumentTypeName(String documentTypeName) { 923 this.documentTypeName = documentTypeName; 924 } 925 926 public void setAdditionalDocumentTypeNames(List<String> additionalDocumentTypeNames) { 927 this.additionalDocumentTypeNames = additionalDocumentTypeNames; 928 } 929 930 public void setDateCreatedFrom(DateTime dateCreatedFrom) { 931 this.dateCreatedFrom = dateCreatedFrom; 932 } 933 934 public void setDateCreatedTo(DateTime dateCreatedTo) { 935 this.dateCreatedTo = dateCreatedTo; 936 } 937 938 public void setDateLastModifiedFrom(DateTime dateLastModifiedFrom) { 939 this.dateLastModifiedFrom = dateLastModifiedFrom; 940 } 941 942 public void setDateLastModifiedTo(DateTime dateLastModifiedTo) { 943 this.dateLastModifiedTo = dateLastModifiedTo; 944 } 945 946 public void setDateApprovedFrom(DateTime dateApprovedFrom) { 947 this.dateApprovedFrom = dateApprovedFrom; 948 } 949 950 public void setDateApprovedTo(DateTime dateApprovedTo) { 951 this.dateApprovedTo = dateApprovedTo; 952 } 953 954 public void setDateFinalizedFrom(DateTime dateFinalizedFrom) { 955 this.dateFinalizedFrom = dateFinalizedFrom; 956 } 957 958 public void setDateFinalizedTo(DateTime dateFinalizedTo) { 959 this.dateFinalizedTo = dateFinalizedTo; 960 } 961 962 public void setDateApplicationDocumentStatusChangedFrom(DateTime dateApplicationDocumentStatusChangedFrom) { 963 this.dateApplicationDocumentStatusChangedFrom = dateApplicationDocumentStatusChangedFrom; 964 } 965 966 public void setDateApplicationDocumentStatusChangedTo(DateTime dateApplicationDocumentStatusChangedTo) { 967 this.dateApplicationDocumentStatusChangedTo = dateApplicationDocumentStatusChangedTo; 968 } 969 970 public void setDocumentAttributeValues(Map<String, List<String>> documentAttributeValues) { 971 this.documentAttributeValues = documentAttributeValues; 972 } 973 974 /** 975 * add document attribute value to an internal map 976 * @param name - the attribute name 977 * @param value - the attribute value 978 */ 979 public void addDocumentAttributeValue(String name, String value) { 980 if (StringUtils.isBlank(value)) { 981 throw new IllegalArgumentException("value was null or blank"); 982 } 983 List<String> values = getDocumentAttributeValues().get(name); 984 if (values == null) { 985 values = new ArrayList<String>(); 986 getDocumentAttributeValues().put(name, values); 987 } 988 values.add(value); 989 } 990 991 public void setSearchOptions(Map<String, List<String>> searchOptions) { 992 this.searchOptions = searchOptions; 993 } 994 995 public void setSaveName(String saveName) { 996 this.saveName = saveName; 997 } 998 999 public void setStartAtIndex(Integer startAtIndex) { 1000 this.startAtIndex = startAtIndex; 1001 } 1002 1003 public void setMaxResults(Integer maxResults) { 1004 this.maxResults = maxResults; 1005 } 1006 1007 public void setIsAdvancedSearch(String isAdvancedSearch) { 1008 this.isAdvancedSearch = isAdvancedSearch; 1009 } 1010 1011 /** 1012 * @since 2.1.2 1013 */ 1014 public void setApplicationDocumentStatuses(List<String> applicationDocumentStatuses) { 1015 this.applicationDocumentStatuses = applicationDocumentStatuses; 1016 } 1017 1018 public void setDocSearchUserId(String docSearchUserId){ 1019 this.docSearchUserId = docSearchUserId; 1020 } 1021 /** 1022 * Resets DateTimes to local TimeZone (preserving absolute time) 1023 * 1024 * @see <a href="http://jira.codehaus.org/browse/JACKSON-279">Modify Joda DateTime</a> 1025 */ 1026 public void normalizeDateTimes() { 1027 if (dateCreatedFrom != null) dateCreatedFrom = dateCreatedFrom.withZone(DateTimeZone.getDefault()); 1028 if (dateCreatedTo != null) dateCreatedTo = dateCreatedTo.withZone(DateTimeZone.getDefault()); 1029 if (dateLastModifiedFrom != null) dateLastModifiedFrom = dateLastModifiedFrom.withZone(DateTimeZone.getDefault()); 1030 if (dateLastModifiedTo != null) dateLastModifiedTo = dateLastModifiedTo.withZone(DateTimeZone.getDefault()); 1031 if (dateApprovedFrom != null) dateApprovedFrom = dateApprovedFrom.withZone(DateTimeZone.getDefault()); 1032 if (dateApprovedTo != null) dateApprovedTo = dateApprovedTo.withZone(DateTimeZone.getDefault()); 1033 if (dateFinalizedFrom != null) dateFinalizedFrom = dateFinalizedFrom.withZone(DateTimeZone.getDefault()); 1034 if (dateFinalizedTo != null) dateFinalizedTo = dateFinalizedTo.withZone(DateTimeZone.getDefault()); 1035 if (dateApplicationDocumentStatusChangedFrom != null) dateApplicationDocumentStatusChangedFrom = dateApplicationDocumentStatusChangedFrom.withZone(DateTimeZone.getDefault()); 1036 if (dateApplicationDocumentStatusChangedTo != null) dateApplicationDocumentStatusChangedTo = dateApplicationDocumentStatusChangedTo.withZone(DateTimeZone.getDefault()); 1037 } 1038 1039 } 1040 1041 /** 1042 * Defines some internal constants used on this class. 1043 */ 1044 static class Constants { 1045 final static String ROOT_ELEMENT_NAME = "documentSearchCriteria"; 1046 final static String TYPE_NAME = "DocumentSearchCriteriaType"; 1047 } 1048 1049 /** 1050 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML. 1051 */ 1052 static class Elements { 1053 final static String DOCUMENT_ID = "documentId"; 1054 final static String DOCUMENT_STATUSES = "documentStatuses"; 1055 final static String DOCUMENT_STATUS = "documentStatus"; 1056 final static String DOCUMENT_STATUS_CATEGORIES = "documentStatusCategories"; 1057 final static String DOCUMENT_STATUS_CATEGORY = "documentStatusCategory"; 1058 final static String TITLE = "title"; 1059 final static String APPLICATION_DOCUMENT_ID = "applicationDocumentId"; 1060 final static String APPLICATION_DOCUMENT_STATUS = "applicationDocumentStatus"; 1061 final static String INITIATOR_PRINCIPAL_NAME = "initiatorPrincipalName"; 1062 final static String INITIATOR_PRINCIPAL_ID = "initiatorPrincipalId"; 1063 final static String VIEWER_PRINCIPAL_NAME = "viewerPrincipalName"; 1064 final static String VIEWER_PRINCIPAL_ID = "viewerPrincipalId"; 1065 final static String GROUP_VIEWER_ID = "groupViewerId"; 1066 final static String GROUP_VIEWER_NAME = "groupViewerName"; 1067 final static String APPROVER_PRINCIPAL_NAME = "approverPrincipalName"; 1068 final static String APPROVER_PRINCIPAL_ID = "approverPrincipalId"; 1069 final static String ROUTE_NODE_NAME = "routeNodeName"; 1070 final static String ROUTE_NODE_LOOKUP_LOGIC = "routeNodeLookupLogic"; 1071 final static String DOCUMENT_TYPE_NAME = "documentTypeName"; 1072 final static String ADDITIONAL_DOCUMENT_TYPE_NAMES = "additionalDocumentTypeNames"; 1073 final static String ADDITIONAL_DOCUMENT_TYPE_NAME = "additionalDocumentTypeName"; 1074 final static String DATE_CREATED_FROM = "dateCreatedFrom"; 1075 final static String DATE_CREATED_TO = "dateCreatedTo"; 1076 final static String DATE_LAST_MODIFIED_FROM = "dateLastModifiedFrom"; 1077 final static String DATE_LAST_MODIFIED_TO = "dateLastModifiedTo"; 1078 final static String DATE_APPROVED_FROM = "dateApprovedFrom"; 1079 final static String DATE_APPROVED_TO = "dateApprovedTo"; 1080 final static String DATE_FINALIZED_FROM = "dateFinalizedFrom"; 1081 final static String DATE_FINALIZED_TO = "dateFinalizedTo"; 1082 final static String DATE_APPLICATION_DOCUMENT_STATUS_CHANGED_FROM = "dateApplicationDocumentStatusChangedFrom"; 1083 final static String DATE_APPLICATION_DOCUMENT_STATUS_CHANGED_TO = "dateApplicationDocumentStatusChangedTo"; 1084 final static String DOCUMENT_ATTRIBUTE_VALUES = "documentAttributeValues"; 1085 final static String SAVE_NAME = "saveName"; 1086 final static String START_AT_INDEX = "startAtIndex"; 1087 final static String MAX_RESULTS = "maxResults"; 1088 final static String IS_ADVANCED_SEARCH = "isAdvancedSearch"; 1089 final static String SEARCH_OPTIONS = "searchOptions"; 1090 final static String APPLICATION_DOCUMENT_STATUSES = "applicationDocumentStatuses"; 1091 final static String DOC_SEARCH_USER_ID = "docSearchUserId"; 1092 } 1093 1094}