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.kew.api.document.search;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.joda.time.DateTime;
020    import org.joda.time.DateTimeZone;
021    import org.kuali.rice.core.api.CoreConstants;
022    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
023    import org.kuali.rice.core.api.mo.ModelBuilder;
024    import org.kuali.rice.core.api.mo.ModelObjectUtils;
025    import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter;
026    import org.kuali.rice.core.api.util.jaxb.MultiValuedStringMapAdapter;
027    import org.kuali.rice.kew.api.document.DocumentStatus;
028    import org.kuali.rice.kew.api.document.DocumentStatusCategory;
029    import org.w3c.dom.Element;
030    
031    import javax.xml.bind.annotation.XmlAccessType;
032    import javax.xml.bind.annotation.XmlAccessorType;
033    import javax.xml.bind.annotation.XmlAnyElement;
034    import javax.xml.bind.annotation.XmlElement;
035    import javax.xml.bind.annotation.XmlElementWrapper;
036    import javax.xml.bind.annotation.XmlRootElement;
037    import javax.xml.bind.annotation.XmlType;
038    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
039    import java.io.Serializable;
040    import java.util.ArrayList;
041    import java.util.Collection;
042    import java.util.Collections;
043    import java.util.HashMap;
044    import java.util.List;
045    import 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        CoreConstants.CommonElements.FUTURE_ELEMENTS
087    })
088    public final class DocumentSearchCriteria extends AbstractDataTransferObject implements DocumentSearchCriteriaContract {
089    
090        private static final long serialVersionUID = -221440103480740497L;
091        
092        @XmlElement(name = Elements.DOCUMENT_ID, required = false)
093        private final String documentId;
094    
095        @XmlElementWrapper(name = Elements.DOCUMENT_STATUSES, required = false)
096        @XmlElement(name = Elements.DOCUMENT_STATUS, required = false)
097        private final List<DocumentStatus> documentStatuses;
098    
099        @XmlElementWrapper(name = Elements.DOCUMENT_STATUS_CATEGORIES, required = false)
100        @XmlElement(name = Elements.DOCUMENT_STATUS_CATEGORY, required = false)
101        private final List<DocumentStatusCategory> documentStatusCategories;
102    
103        @XmlElement(name = Elements.TITLE, required = false)
104        private final String title;
105    
106        @XmlElement(name = Elements.APPLICATION_DOCUMENT_ID, required = false)
107        private final String applicationDocumentId;
108    
109        @XmlElement(name = Elements.APPLICATION_DOCUMENT_STATUS, required = false)
110        private final String applicationDocumentStatus;
111    
112        @XmlElement(name = Elements.INITIATOR_PRINCIPAL_NAME, required = false)
113        private final String initiatorPrincipalName;
114    
115        @XmlElement(name = Elements.VIEWER_PRINCIPAL_NAME, required = false)
116        private final String viewerPrincipalName;
117    
118        @XmlElement(name = Elements.GROUP_VIEWER_ID, required = false)
119        private final String groupViewerId;
120    
121        @XmlElement(name = Elements.GROUP_VIEWER_NAME, required = false)
122        private final String groupViewerName;
123        
124        @XmlElement(name = Elements.APPROVER_PRINCIPAL_NAME, required = false)
125        private final String approverPrincipalName;
126    
127        @XmlElement(name = Elements.ROUTE_NODE_NAME, required = false)
128        private final String routeNodeName;
129    
130        @XmlElement(name = Elements.ROUTE_NODE_LOOKUP_LOGIC, required = false)
131        private final RouteNodeLookupLogic routeNodeLookupLogic;
132    
133        @XmlElement(name = Elements.DOCUMENT_TYPE_NAME, required = false)
134        private final String documentTypeName;
135    
136        @XmlElementWrapper(name = Elements.ADDITIONAL_DOCUMENT_TYPE_NAMES, required = false)
137        @XmlElement(name = Elements.ADDITIONAL_DOCUMENT_TYPE_NAME, required = false)
138        private final List<String> additionalDocumentTypeNames;
139    
140    
141        @XmlElement(name = Elements.DATE_CREATED_FROM, required = false)
142        @XmlJavaTypeAdapter(DateTimeAdapter.class)
143        private final DateTime dateCreatedFrom;
144    
145        @XmlElement(name = Elements.DATE_CREATED_TO, required = false)
146        @XmlJavaTypeAdapter(DateTimeAdapter.class)
147        private final DateTime dateCreatedTo;
148    
149        @XmlElement(name = Elements.DATE_LAST_MODIFIED_FROM, required = false)
150        @XmlJavaTypeAdapter(DateTimeAdapter.class)
151        private final DateTime dateLastModifiedFrom;
152    
153        @XmlElement(name = Elements.DATE_LAST_MODIFIED_TO, required = false)
154        @XmlJavaTypeAdapter(DateTimeAdapter.class)
155        private final DateTime dateLastModifiedTo;
156    
157        @XmlElement(name = Elements.DATE_APPROVED_FROM, required = false)
158        @XmlJavaTypeAdapter(DateTimeAdapter.class)
159        private final DateTime dateApprovedFrom;
160    
161        @XmlElement(name = Elements.DATE_APPROVED_TO, required = false)
162        @XmlJavaTypeAdapter(DateTimeAdapter.class)
163        private final DateTime dateApprovedTo;
164    
165        @XmlElement(name = Elements.DATE_FINALIZED_FROM, required = false)
166        @XmlJavaTypeAdapter(DateTimeAdapter.class)
167        private final DateTime dateFinalizedFrom;
168    
169        @XmlElement(name = Elements.DATE_FINALIZED_TO, required = false)
170        @XmlJavaTypeAdapter(DateTimeAdapter.class)
171        private final DateTime dateFinalizedTo;
172    
173        @XmlElement(name = Elements.DATE_APPLICATION_DOCUMENT_STATUS_CHANGED_FROM, required = false)
174        @XmlJavaTypeAdapter(DateTimeAdapter.class)
175        private final DateTime dateApplicationDocumentStatusChangedFrom;
176    
177        @XmlElement(name = Elements.DATE_APPLICATION_DOCUMENT_STATUS_CHANGED_TO, required = false)
178        @XmlJavaTypeAdapter(DateTimeAdapter.class)
179        private final DateTime dateApplicationDocumentStatusChangedTo;
180    
181        @XmlElement(name = Elements.DOCUMENT_ATTRIBUTE_VALUES, required = false)
182        @XmlJavaTypeAdapter(MultiValuedStringMapAdapter.class)
183        private final Map<String, List<String>> documentAttributeValues;
184    
185        @XmlElement(name = Elements.SAVE_NAME, required = false)
186        private final String saveName;
187    
188        @XmlElement(name = Elements.START_AT_INDEX, required = false)
189        private final Integer startAtIndex;
190    
191        @XmlElement(name = Elements.MAX_RESULTS, required = false)
192        private final Integer maxResults;
193    
194        @XmlElement(name = Elements.IS_ADVANCED_SEARCH, required = false)
195        private final String isAdvancedSearch;
196        
197        @SuppressWarnings("unused")
198        @XmlAnyElement
199        private final Collection<Element> _futureElements = null;
200    
201        /**
202         * Private constructor used only by JAXB.
203         */
204        private DocumentSearchCriteria() {
205            this.documentId = null;
206            this.documentStatuses = null;
207            this.documentStatusCategories = null;
208            this.title = null;
209            this.applicationDocumentId = null;
210            this.applicationDocumentStatus = null;
211            this.initiatorPrincipalName = null;
212            this.viewerPrincipalName = null;
213            this.groupViewerId = null;
214            this.groupViewerName = null;
215            this.approverPrincipalName = null;
216            this.routeNodeName = null;
217            this.routeNodeLookupLogic = null;
218            this.documentTypeName = null;
219            this.additionalDocumentTypeNames = null;
220            this.dateCreatedFrom = null;
221            this.dateCreatedTo = null;
222            this.dateLastModifiedFrom = null;
223            this.dateLastModifiedTo = null;
224            this.dateApprovedFrom = null;
225            this.dateApprovedTo = null;
226            this.dateFinalizedFrom = null;
227            this.dateFinalizedTo = null;
228            this.dateApplicationDocumentStatusChangedFrom = null;
229            this.dateApplicationDocumentStatusChangedTo = null;
230            this.documentAttributeValues = null;
231            this.saveName = null;
232            this.startAtIndex = null;
233            this.maxResults = null;
234            this.isAdvancedSearch = null;
235        }
236    
237        private DocumentSearchCriteria(Builder builder) {
238            this.documentId = builder.getDocumentId();
239            this.documentStatuses = ModelObjectUtils.createImmutableCopy(builder.getDocumentStatuses());
240            this.documentStatusCategories = ModelObjectUtils.createImmutableCopy(builder.getDocumentStatusCategories());
241            this.title = builder.getTitle();
242            this.applicationDocumentId = builder.getApplicationDocumentId();
243            this.applicationDocumentStatus = builder.getApplicationDocumentStatus();
244            this.initiatorPrincipalName = builder.getInitiatorPrincipalName();
245            this.viewerPrincipalName = builder.getViewerPrincipalName();
246            this.groupViewerId = builder.getGroupViewerId();
247            this.groupViewerName = builder.getGroupViewerName();
248            this.approverPrincipalName = builder.getApproverPrincipalName();
249            this.routeNodeName = builder.getRouteNodeName();
250            this.routeNodeLookupLogic = builder.getRouteNodeLookupLogic();
251            this.documentTypeName = builder.getDocumentTypeName();
252            this.additionalDocumentTypeNames = ModelObjectUtils.createImmutableCopy(
253                    builder.getAdditionalDocumentTypeNames());
254            this.dateCreatedFrom = builder.getDateCreatedFrom();
255            this.dateCreatedTo = builder.getDateCreatedTo();
256            this.dateLastModifiedFrom = builder.getDateLastModifiedFrom();
257            this.dateLastModifiedTo = builder.getDateLastModifiedTo();
258            this.dateApprovedFrom = builder.getDateApprovedFrom();
259            this.dateApprovedTo = builder.getDateApprovedTo();
260            this.dateFinalizedFrom = builder.getDateFinalizedFrom();
261            this.dateFinalizedTo = builder.getDateFinalizedTo();
262            this.dateApplicationDocumentStatusChangedFrom = builder.getDateApplicationDocumentStatusChangedFrom();
263            this.dateApplicationDocumentStatusChangedTo = builder.getDateApplicationDocumentStatusChangedTo();
264            this.documentAttributeValues = ModelObjectUtils.createImmutableCopy(builder.getDocumentAttributeValues());
265            this.saveName = builder.getSaveName();
266            this.startAtIndex = builder.getStartAtIndex();
267            this.maxResults = builder.getMaxResults();
268            this.isAdvancedSearch = builder.getIsAdvancedSearch();
269        }
270    
271        @Override
272        public String getDocumentId() {
273            return this.documentId;
274        }
275    
276        @Override
277        public List<DocumentStatus> getDocumentStatuses() {
278            return this.documentStatuses;
279        }
280    
281        @Override
282        public List<DocumentStatusCategory> getDocumentStatusCategories() {
283            return this.documentStatusCategories;
284        }
285    
286        @Override
287        public String getTitle() {
288            return this.title;
289        }
290    
291        @Override
292        public String getApplicationDocumentId() {
293            return this.applicationDocumentId;
294        }
295    
296        @Override
297        public String getApplicationDocumentStatus() {
298            return this.applicationDocumentStatus;
299        }
300    
301        @Override
302        public String getInitiatorPrincipalName() {
303            return this.initiatorPrincipalName;
304        }
305    
306        @Override
307        public String getViewerPrincipalName() {
308            return this.viewerPrincipalName;
309        }
310    
311        @Override
312        public String getGroupViewerId() {
313            return this.groupViewerId;
314        }
315        
316        @Override
317        public String getGroupViewerName() {
318            return this.groupViewerName;
319        }
320    
321        @Override
322        public String getApproverPrincipalName() {
323            return this.approverPrincipalName;
324        }
325    
326        @Override
327        public String getRouteNodeName() {
328            return this.routeNodeName;
329        }
330    
331        @Override
332        public RouteNodeLookupLogic getRouteNodeLookupLogic() {
333            return this.routeNodeLookupLogic;
334        }
335    
336        @Override
337        public String getDocumentTypeName() {
338            return this.documentTypeName;
339        }
340    
341        @Override
342        public List<String> getAdditionalDocumentTypeNames() {
343            return this.additionalDocumentTypeNames;
344        }
345    
346        @Override
347        public DateTime getDateCreatedFrom() {
348            return this.dateCreatedFrom;
349        }
350    
351        @Override
352        public DateTime getDateCreatedTo() {
353            return this.dateCreatedTo;
354        }
355    
356        @Override
357        public DateTime getDateLastModifiedFrom() {
358            return this.dateLastModifiedFrom;
359        }
360    
361        @Override
362        public DateTime getDateLastModifiedTo() {
363            return this.dateLastModifiedTo;
364        }
365    
366        @Override
367        public DateTime getDateApprovedFrom() {
368            return this.dateApprovedFrom;
369        }
370    
371        @Override
372        public DateTime getDateApprovedTo() {
373            return this.dateApprovedTo;
374        }
375    
376        @Override
377        public DateTime getDateFinalizedFrom() {
378            return this.dateFinalizedFrom;
379        }
380    
381        @Override
382        public DateTime getDateFinalizedTo() {
383            return this.dateFinalizedTo;
384        }
385    
386        @Override
387        public DateTime getDateApplicationDocumentStatusChangedFrom() {
388            return dateApplicationDocumentStatusChangedFrom;
389        }
390    
391        @Override
392        public DateTime getDateApplicationDocumentStatusChangedTo() {
393            return dateApplicationDocumentStatusChangedTo;
394        }
395    
396        @Override
397        public Map<String, List<String>> getDocumentAttributeValues() {
398            return this.documentAttributeValues;
399        }
400    
401        @Override
402        public String getSaveName() {
403            return saveName;
404        }
405    
406        @Override
407        public Integer getStartAtIndex() {
408            return this.startAtIndex;
409        }
410    
411        @Override
412        public Integer getMaxResults() {
413            return this.maxResults;
414        }
415    
416        @Override
417        public String getIsAdvancedSearch() {
418            return this.isAdvancedSearch;
419        }
420    
421        /**
422         * A builder which can be used to construct {@link DocumentSearchCriteria} instances.  Enforces the constraints of
423         * the {@link DocumentSearchCriteriaContract}.
424         */
425        public final static class Builder implements Serializable, ModelBuilder, DocumentSearchCriteriaContract {
426    
427            private String documentId;
428            private List<DocumentStatus> documentStatuses;
429            private List<DocumentStatusCategory> documentStatusCategories;
430            private String title;
431            private String applicationDocumentId;
432            private String applicationDocumentStatus;
433            private String initiatorPrincipalName;
434            private String viewerPrincipalName;
435            private String groupViewerId;
436            private String groupViewerName;
437            private String approverPrincipalName;
438            private String routeNodeName;
439            private RouteNodeLookupLogic routeNodeLookupLogic;
440            private String documentTypeName;
441            private List<String> additionalDocumentTypeNames;
442            private DateTime dateCreatedFrom;
443            private DateTime dateCreatedTo;
444            private DateTime dateLastModifiedFrom;
445            private DateTime dateLastModifiedTo;
446            private DateTime dateApprovedFrom;
447            private DateTime dateApprovedTo;
448            private DateTime dateFinalizedFrom;
449            private DateTime dateFinalizedTo;
450            private DateTime dateApplicationDocumentStatusChangedFrom;
451            private DateTime dateApplicationDocumentStatusChangedTo;
452            private Map<String, List<String>> documentAttributeValues;
453            private String saveName;
454            private Integer startAtIndex;
455            private Integer maxResults;
456            private String isAdvancedSearch;
457    
458            private Builder() {
459                setDocumentStatuses(new ArrayList<DocumentStatus>());
460                setDocumentStatusCategories(new ArrayList<DocumentStatusCategory>());
461                setAdditionalDocumentTypeNames(new ArrayList<String>());
462                setDocumentAttributeValues(new HashMap<String, List<String>>());
463            }
464    
465            /**
466             * Creates an empty builder instance.  All collections on the new instance are initialized to empty collections.
467             *
468             * @return a new builder instance
469             */
470            public static Builder create() {
471                return new Builder();
472            }
473    
474            /**
475             * Creates a new builder instance initialized with copies of the properties from the given contract.
476             *
477             * @param contract the contract from which to copy properties
478             *
479             * @return a builder instance initialized with properties from the given contract
480             *
481             * @throws IllegalArgumentException if the given contract is null
482             */
483            public static Builder create(DocumentSearchCriteriaContract contract) {
484                if (contract == null) {
485                    throw new IllegalArgumentException("contract was null");
486                }
487                Builder builder = create();
488                builder.setDocumentId(contract.getDocumentId());
489                if (contract.getDocumentStatuses() != null) {
490                    builder.setDocumentStatuses(new ArrayList<DocumentStatus>(contract.getDocumentStatuses()));
491                }
492                if (contract.getDocumentStatusCategories() != null) {
493                    builder.setDocumentStatusCategories(new ArrayList<DocumentStatusCategory>(contract.getDocumentStatusCategories()));
494                }
495                builder.setTitle(contract.getTitle());
496                builder.setApplicationDocumentId(contract.getApplicationDocumentId());
497                builder.setApplicationDocumentStatus(contract.getApplicationDocumentStatus());
498                builder.setInitiatorPrincipalName(contract.getInitiatorPrincipalName());
499                builder.setViewerPrincipalName(contract.getViewerPrincipalName());
500                builder.setGroupViewerId(contract.getGroupViewerId());
501                builder.setGroupViewerName(contract.getGroupViewerName());
502                builder.setApproverPrincipalName(contract.getApproverPrincipalName());
503                builder.setRouteNodeName(contract.getRouteNodeName());
504                builder.setRouteNodeLookupLogic(contract.getRouteNodeLookupLogic());
505                builder.setDocumentTypeName(contract.getDocumentTypeName());
506                if (contract.getAdditionalDocumentTypeNames() != null) {
507                    builder.setAdditionalDocumentTypeNames(new ArrayList<String>(contract.getAdditionalDocumentTypeNames()));
508                }
509                builder.setDateCreatedFrom(contract.getDateCreatedFrom());
510                builder.setDateCreatedTo(contract.getDateCreatedTo());
511                builder.setDateLastModifiedFrom(contract.getDateLastModifiedFrom());
512                builder.setDateLastModifiedTo(contract.getDateLastModifiedTo());
513                builder.setDateApprovedFrom(contract.getDateApprovedFrom());
514                builder.setDateApprovedTo(contract.getDateApprovedTo());
515                builder.setDateFinalizedFrom(contract.getDateFinalizedFrom());
516                builder.setDateFinalizedTo(contract.getDateFinalizedTo());
517                builder.setDateApplicationDocumentStatusChangedFrom(contract.getDateApplicationDocumentStatusChangedFrom());
518                builder.setDateApplicationDocumentStatusChangedTo(contract.getDateApplicationDocumentStatusChangedTo());
519                if (contract.getDocumentAttributeValues() != null) {
520                    builder.setDocumentAttributeValues(new HashMap<String, List<String>>(contract.getDocumentAttributeValues()));
521                }
522                builder.setSaveName(contract.getSaveName());
523                builder.setStartAtIndex(contract.getStartAtIndex());
524                builder.setMaxResults(contract.getMaxResults());
525                builder.setIsAdvancedSearch(contract.getIsAdvancedSearch());
526                return builder;
527            }
528    
529            @Override
530            public DocumentSearchCriteria build() {
531                if (StringUtils.isNotBlank(routeNodeName) && StringUtils.isBlank(documentTypeName)) {
532                    throw new IllegalStateException("documentTypeName must be set if routeNodeName is set.");
533                }
534                return new DocumentSearchCriteria(this);
535            }
536    
537            @Override
538            public String getDocumentId() {
539                return this.documentId;
540            }
541    
542            @Override
543            public List<DocumentStatus> getDocumentStatuses() {
544                return this.documentStatuses;
545            }
546    
547            @Override
548            public List<DocumentStatusCategory> getDocumentStatusCategories() {
549                return this.documentStatusCategories;
550            }
551    
552            @Override
553            public String getTitle() {
554                return this.title;
555            }
556    
557            @Override
558            public String getApplicationDocumentId() {
559                return this.applicationDocumentId;
560            }
561    
562            @Override
563            public String getApplicationDocumentStatus() {
564                return this.applicationDocumentStatus;
565            }
566    
567            @Override
568            public String getInitiatorPrincipalName() {
569                return this.initiatorPrincipalName;
570            }
571    
572            @Override
573            public String getViewerPrincipalName() {
574                return this.viewerPrincipalName;
575            }
576    
577            @Override
578            public String getGroupViewerId() {
579                return this.groupViewerId;
580            }
581    
582            @Override
583            public String getGroupViewerName() {
584                return this.groupViewerName;
585            }
586            
587            @Override
588            public String getApproverPrincipalName() {
589                return this.approverPrincipalName;
590            }
591    
592            @Override
593            public String getRouteNodeName() {
594                return this.routeNodeName;
595            }
596    
597            @Override
598            public RouteNodeLookupLogic getRouteNodeLookupLogic() {
599                return this.routeNodeLookupLogic;
600            }
601    
602            @Override
603            public String getDocumentTypeName() {
604                return this.documentTypeName;
605            }
606    
607            @Override
608            public List<String> getAdditionalDocumentTypeNames() {
609                return additionalDocumentTypeNames;
610            }
611    
612            @Override
613            public DateTime getDateCreatedFrom() {
614                return this.dateCreatedFrom;
615            }
616    
617            @Override
618            public DateTime getDateCreatedTo() {
619                return this.dateCreatedTo;
620            }
621    
622            @Override
623            public DateTime getDateLastModifiedFrom() {
624                return this.dateLastModifiedFrom;
625            }
626    
627            @Override
628            public DateTime getDateLastModifiedTo() {
629                return this.dateLastModifiedTo;
630            }
631    
632            @Override
633            public DateTime getDateApprovedFrom() {
634                return this.dateApprovedFrom;
635            }
636    
637            @Override
638            public DateTime getDateApprovedTo() {
639                return this.dateApprovedTo;
640            }
641    
642            @Override
643            public DateTime getDateFinalizedFrom() {
644                return this.dateFinalizedFrom;
645            }
646    
647            @Override
648            public DateTime getDateFinalizedTo() {
649                return this.dateFinalizedTo;
650            }
651    
652            @Override
653            public DateTime getDateApplicationDocumentStatusChangedFrom() {
654                return dateApplicationDocumentStatusChangedFrom;
655            }
656    
657            @Override
658            public DateTime getDateApplicationDocumentStatusChangedTo() {
659                return dateApplicationDocumentStatusChangedTo;
660            }
661    
662            @Override
663            public Map<String, List<String>> getDocumentAttributeValues() {
664                return this.documentAttributeValues;
665            }
666    
667            @Override
668            public String getSaveName() {
669                return this.saveName;
670            }
671    
672            @Override
673            public Integer getStartAtIndex() {
674                return this.startAtIndex;
675            }
676    
677            @Override
678            public Integer getMaxResults() {
679                return this.maxResults;
680            }
681    
682            @Override
683            public String getIsAdvancedSearch() {
684                return this.isAdvancedSearch;
685            }
686    
687            public void setDocumentId(String documentId) {
688                this.documentId = documentId;
689            }
690    
691            public void setDocumentStatuses(List<DocumentStatus> documentStatuses) {
692                this.documentStatuses = documentStatuses;
693            }
694    
695            public void setDocumentStatusCategories(List<DocumentStatusCategory> documentStatusCategories) {
696                this.documentStatusCategories = documentStatusCategories;
697            }
698    
699            public void setTitle(String title) {
700                this.title = title;
701            }
702    
703            public void setApplicationDocumentId(String applicationDocumentId) {
704                this.applicationDocumentId = applicationDocumentId;
705            }
706    
707            public void setApplicationDocumentStatus(String applicationDocumentStatus) {
708                this.applicationDocumentStatus = applicationDocumentStatus;
709            }
710    
711            public void setInitiatorPrincipalName(String initiatorPrincipalName) {
712                this.initiatorPrincipalName = initiatorPrincipalName;
713            }
714    
715            public void setViewerPrincipalName(String viewerPrincipalName) {
716                this.viewerPrincipalName = viewerPrincipalName;
717            }
718    
719            public void setGroupViewerId(String groupViewerId) {
720                this.groupViewerId = groupViewerId;
721            }
722            
723            public void setGroupViewerName (String groupViewerName) {
724                this.groupViewerName = groupViewerName;
725            }
726    
727            public void setApproverPrincipalName(String approverPrincipalName) {
728                this.approverPrincipalName = approverPrincipalName;
729            }
730    
731            public void setRouteNodeName(String routeNodeName) {
732                this.routeNodeName = routeNodeName;
733            }
734    
735            public void setRouteNodeLookupLogic(RouteNodeLookupLogic routeNodeLookupLogic) {
736                this.routeNodeLookupLogic = routeNodeLookupLogic;
737            }
738    
739            public void setDocumentTypeName(String documentTypeName) {
740                this.documentTypeName = documentTypeName;
741            }
742    
743            public void setAdditionalDocumentTypeNames(List<String> additionalDocumentTypeNames) {
744                this.additionalDocumentTypeNames = additionalDocumentTypeNames;
745            }
746    
747            public void setDateCreatedFrom(DateTime dateCreatedFrom) {
748                this.dateCreatedFrom = dateCreatedFrom;
749            }
750    
751            public void setDateCreatedTo(DateTime dateCreatedTo) {
752                this.dateCreatedTo = dateCreatedTo;
753            }
754    
755            public void setDateLastModifiedFrom(DateTime dateLastModifiedFrom) {
756                this.dateLastModifiedFrom = dateLastModifiedFrom;
757            }
758    
759            public void setDateLastModifiedTo(DateTime dateLastModifiedTo) {
760                this.dateLastModifiedTo = dateLastModifiedTo;
761            }
762    
763            public void setDateApprovedFrom(DateTime dateApprovedFrom) {
764                this.dateApprovedFrom = dateApprovedFrom;
765            }
766    
767            public void setDateApprovedTo(DateTime dateApprovedTo) {
768                this.dateApprovedTo = dateApprovedTo;
769            }
770    
771            public void setDateFinalizedFrom(DateTime dateFinalizedFrom) {
772                this.dateFinalizedFrom = dateFinalizedFrom;
773            }
774    
775            public void setDateFinalizedTo(DateTime dateFinalizedTo) {
776                this.dateFinalizedTo = dateFinalizedTo;
777            }
778    
779            public void setDateApplicationDocumentStatusChangedFrom(DateTime dateApplicationDocumentStatusChangedFrom) {
780                this.dateApplicationDocumentStatusChangedFrom = dateApplicationDocumentStatusChangedFrom;
781            }
782    
783            public void setDateApplicationDocumentStatusChangedTo(DateTime dateApplicationDocumentStatusChangedTo) {
784                this.dateApplicationDocumentStatusChangedTo = dateApplicationDocumentStatusChangedTo;
785            }
786    
787            public void setDocumentAttributeValues(Map<String, List<String>> documentAttributeValues) {
788                this.documentAttributeValues = documentAttributeValues;
789            }
790    
791            public void addDocumentAttributeValue(String name, String value) {
792                if (StringUtils.isBlank(value)) {
793                    throw new IllegalArgumentException("value was null or blank");
794                }
795                List<String> values = getDocumentAttributeValues().get(name);
796                if (values == null) {
797                    values = new ArrayList<String>();
798                    getDocumentAttributeValues().put(name, values);
799                }
800                values.add(value);
801            }
802    
803            public void setSaveName(String saveName) {
804                this.saveName = saveName;
805            }
806    
807            public void setStartAtIndex(Integer startAtIndex) {
808                this.startAtIndex = startAtIndex;
809            }
810    
811            public void setMaxResults(Integer maxResults) {
812                this.maxResults = maxResults;
813            }
814    
815            public void setIsAdvancedSearch(String isAdvancedSearch) {
816                this.isAdvancedSearch = isAdvancedSearch;
817            }
818    
819            /**
820             * Resets DateTimes to local TimeZone (preserving absolute time)
821             * @see {@link http://jira.codehaus.org/browse/JACKSON-279}
822             * @see {@link org.kuali.rice.core.util.JacksonRiceModule}
823             */
824            public void normalizeDateTimes() {
825                if (dateCreatedFrom != null) dateCreatedFrom = dateCreatedFrom.withZone(DateTimeZone.getDefault());
826                if (dateCreatedTo != null) dateCreatedTo = dateCreatedTo.withZone(DateTimeZone.getDefault());
827                if (dateLastModifiedFrom != null) dateLastModifiedFrom = dateLastModifiedFrom.withZone(DateTimeZone.getDefault());
828                if (dateLastModifiedTo != null) dateLastModifiedTo = dateLastModifiedTo.withZone(DateTimeZone.getDefault());
829                if (dateApprovedFrom != null) dateApprovedFrom = dateApprovedFrom.withZone(DateTimeZone.getDefault());
830                if (dateApprovedTo != null) dateApprovedTo = dateApprovedTo.withZone(DateTimeZone.getDefault());
831                if (dateFinalizedFrom != null) dateFinalizedFrom = dateFinalizedFrom.withZone(DateTimeZone.getDefault());
832                if (dateFinalizedTo != null) dateFinalizedTo = dateFinalizedTo.withZone(DateTimeZone.getDefault());
833                if (dateApplicationDocumentStatusChangedFrom != null) dateApplicationDocumentStatusChangedFrom = dateApplicationDocumentStatusChangedFrom.withZone(DateTimeZone.getDefault());
834                if (dateApplicationDocumentStatusChangedTo != null) dateApplicationDocumentStatusChangedTo = dateApplicationDocumentStatusChangedTo.withZone(DateTimeZone.getDefault());
835            }
836    
837        }
838    
839        /**
840         * Defines some internal constants used on this class.
841         */
842        static class Constants {
843            final static String ROOT_ELEMENT_NAME = "documentSearchCriteria";
844            final static String TYPE_NAME = "DocumentSearchCriteriaType";
845        }
846    
847        /**
848         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
849         */
850        static class Elements {
851            final static String DOCUMENT_ID = "documentId";
852            final static String DOCUMENT_STATUSES = "documentStatuses";
853            final static String DOCUMENT_STATUS = "documentStatus";
854            final static String DOCUMENT_STATUS_CATEGORIES = "documentStatusCategories";
855            final static String DOCUMENT_STATUS_CATEGORY = "documentStatusCategory";
856            final static String TITLE = "title";
857            final static String APPLICATION_DOCUMENT_ID = "applicationDocumentId";
858            final static String APPLICATION_DOCUMENT_STATUS = "applicationDocumentStatus";
859            final static String INITIATOR_PRINCIPAL_NAME = "initiatorPrincipalName";
860            final static String VIEWER_PRINCIPAL_NAME = "viewerPrincipalName";
861            final static String GROUP_VIEWER_ID = "groupViewerId";
862            final static String GROUP_VIEWER_NAME = "groupViewerName";
863            final static String APPROVER_PRINCIPAL_NAME = "approverPrincipalName";
864            final static String ROUTE_NODE_NAME = "routeNodeName";
865            final static String ROUTE_NODE_LOOKUP_LOGIC = "routeNodeLookupLogic";
866            final static String DOCUMENT_TYPE_NAME = "documentTypeName";
867            final static String ADDITIONAL_DOCUMENT_TYPE_NAMES = "additionalDocumentTypeNames";
868            final static String ADDITIONAL_DOCUMENT_TYPE_NAME = "additionalDocumentTypeName";
869            final static String DATE_CREATED_FROM = "dateCreatedFrom";
870            final static String DATE_CREATED_TO = "dateCreatedTo";
871            final static String DATE_LAST_MODIFIED_FROM = "dateLastModifiedFrom";
872            final static String DATE_LAST_MODIFIED_TO = "dateLastModifiedTo";
873            final static String DATE_APPROVED_FROM = "dateApprovedFrom";
874            final static String DATE_APPROVED_TO = "dateApprovedTo";
875            final static String DATE_FINALIZED_FROM = "dateFinalizedFrom";
876            final static String DATE_FINALIZED_TO = "dateFinalizedTo";
877            final static String DATE_APPLICATION_DOCUMENT_STATUS_CHANGED_FROM = "dateApplicationDocumentStatusChangedFrom";
878            final static String DATE_APPLICATION_DOCUMENT_STATUS_CHANGED_TO = "dateApplicationDocumentStatusChangedTo";
879            final static String DOCUMENT_ATTRIBUTE_VALUES = "documentAttributeValues";
880            final static String SAVE_NAME = "saveName";
881            final static String START_AT_INDEX = "startAtIndex";
882            final static String MAX_RESULTS = "maxResults";
883            final static String IS_ADVANCED_SEARCH = "isAdvancedSearch";
884        }
885    
886    }