View Javadoc
1   /**
2    * Copyright 2005-2014 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kew.api.document.search;
17  
18  import org.joda.time.DateTime;
19  import org.kuali.rice.kew.api.document.DocumentStatus;
20  import org.kuali.rice.kew.api.document.DocumentStatusCategory;
21  
22  import java.util.List;
23  import java.util.Map;
24  
25  /**
26   * Defines the contract for criteria used to perform lookups of workflow document data.  None of the elements that can
27   * be defined on the criteria are required.  Therefore, any method on this class may return a null value, though in the
28   * case of collections, an empty collection will be returned instead.
29   *
30   * <p>In general, the different  values on the criteria allow the standard lookup "operators" as defined by
31   * {@link org.kuali.rice.core.api.search.SearchOperator} unless otherwise noted.  The primary place where this differs
32   * is on principal name-based criteria (see below).</p>
33   *
34   * <p><On criteria which contains a principal name, the rules are as follows:</p>
35   *
36   * <ul>
37   *   <li>only literal principal names that resolve to a valid principal are allowed</li>
38   *   <li>however, if the principal names don't resolve to valid prinicpals, this simply means the lookup will return no results</li>
39   *   <li>"!" is allowed before a principal name</li>
40   *   <li>when wanting to search for more than one principal, "|" and "&&" is allowed though they cannot be used together</li>
41   * </ul>
42   *
43   * <p>Wildcards, ranges, and other "inequality" operators (such as ">", "<", etc.) are not permitted on principal names.</p>
44   *
45   * <p>In cases where a criteria element takes a list of values, this should be treated as an implicit "OR" by the lookup
46   * implementation.  This is true of document attribute values as well, which are passed as a map keyed off the
47   * document attribute name with a list of values representing the document attribute values to be searched for.</p>
48   *
49   * <p>The optional "save name" on the search defines a name under which the criteria can be stored so that it can be
50   * recalled and reused later.</p>
51   *
52   * @author Kuali Rice Team (rice.collab@kuali.org)
53   */
54  public interface DocumentSearchCriteriaContract {
55  
56      /**
57       * Returns the document id criteria to search against when executing the document search.
58       *
59       * @return the document id criteria
60       */
61      String getDocumentId();
62  
63      /**
64       * Returns an unmodifiable list of document statuses to search against when executing the document search.  If there
65       * is more than one of these, then the search should treat this as an "OR" case (i.e. search for documents with one
66       * or more of these statuses).
67       *
68       * @return the document status criteria
69       */
70      List<DocumentStatus> getDocumentStatuses();
71  
72      /**
73       * Returns an unmodifiable list of document status categories to search against when executing the document search.
74       * If there is more than one of these, then the search should treat this as an "OR" case (i.e. search for documents
75       * that have a status contained in one or more of these categories).
76       *
77       * @return the document status category criteria
78       */
79      List<DocumentStatusCategory> getDocumentStatusCategories();
80  
81      /**
82       * Returns the document title criteria to search against when executing the document search.
83       *
84       * @return the title criteria
85       */
86      String getTitle();
87  
88      /**
89       * Returns the application document id criteria to search against when executing the document search.
90       *
91       * @return the application document id criteria
92       */
93      String getApplicationDocumentId();
94  
95      /**
96       * Returns the application document status criteria to search against when executing the document search.
97       *
98       * @return the application document status criteria
99       * @deprecated please use {@link #getApplicationDocumentStatuses()} instead
100      */
101     @Deprecated
102     String getApplicationDocumentStatus();
103 
104     /**
105      * Returns the criteria for the principal name of the document initiator to search against when executing the
106      * document search.  Follows the rules for principal name criteria (see class-level documentation).
107      *
108      * @return the initiator principal name criteria
109      */
110     String getInitiatorPrincipalName();
111 
112     /**
113      * Returns the criteria for the principal id of the document initiator to search against when executing the
114      * document search.
115      *
116      * @return the initiator principal id criteria
117      */
118     String getInitiatorPrincipalId();
119 
120     /**
121      * Returns the criteria for the principal name of a "viewer" of a document (someone who received an action request
122      * related to the document) to search against when executing the document search.  Follows the rules for principal
123      * name criteria (see class-level documentation).
124      *
125      * @return the viewer principal name criteria
126      */
127     String getViewerPrincipalName();
128 
129     /**
130      * Returns the criteria for the principal id of a "viewer" of a document (someone who received an action request
131      * related to the document) to search against when executing the document search.
132      *
133      * @return the viewer principal id criteria
134      */
135     String getViewerPrincipalId();
136 
137     /**
138      * Returns the criteria for the id of a group who is a "viewer" of a document (a group who received an action request
139      * related to the document) to search against when executing the document search.  Group id criteria follows rules
140      * similar to principal name criteria:
141      *
142      * <ul>
143      *   <li>only literal group ids that resolve to a valid group are allowed</li>
144      *   <li>however, if the group ids don't resolve to valid groups, this simply means the search will return no results</li>
145      *   <li>"!" is allowed before a group id</li>
146      *   <li>when wanting to search on more than one viewer group id, use of "|" and "&&" is allowed, though they cannot be used together</li>
147      * </ul>
148      *
149      * @return the viewer principal name criteria
150      */
151     String getGroupViewerId();
152     
153     /**
154      * Returns the criteria for the name of a group who is a "viewer" of a document (a group who received an action request
155      * related to the document) to search against when executing the document search.  Group name criteria follows rules
156      * similar to principal name criteria:
157      *
158      * <ul>
159      *   <li>only literal group names that resolve to a valid group are allowed</li>
160      *   <li>however, if the group names don't resolve to valid groups, this simply means the search will return no results</li>
161      *   <li>"!" is allowed before a group id</li>
162      *   <li>when wanting to search on more than one viewer group name, use of "|" and "&&" is allowed, though they cannot be used together</li>
163      * </ul>
164      *
165      * @return the viewer principal name criteria
166      */
167     String getGroupViewerName();
168 
169     /**
170      * Returns the criteria for the principal name of an "approver" of a document (someone who took action against
171      * the document) to search against when executing the document search.  Follows the rules for principal name
172      * criteria (see class-level documentation).
173      *
174      * @return the viewer principal name criteria
175      */
176     String getApproverPrincipalName();
177 
178     /**
179      * Returns the criteria for the principal id of an "approver" of a document (someone who took action against
180      * the document) to search against when executing the document search.
181      *
182      * @return the viewer principal id criteria
183      */
184     String getApproverPrincipalId();
185 
186     /**
187      * Returns the route node name criteria to search against when executing the document search.  By default this will
188      * match only documents which are at the node with the given name, unless {@link #getRouteNodeLookupLogic()} returns
189      * a non-null value that specifies different criteria for how the route node-based lookup should be performed.
190      *
191      * @return the route node name criteria
192      */
193     String getRouteNodeName();
194 
195     /**
196      * Returns the logic that should be used when performing a document search against the route name.  This essentially
197      * allows for the criteria to specify whether or not it should look at documents which are currently before, exactly
198      * at, or after the specified route node.  This value only has an effect if the route node name is also defined
199      * on this criteria.
200      *
201      * @return the route node lookup logic to use in conjunction with the route node name criteria
202      */
203     RouteNodeLookupLogic getRouteNodeLookupLogic();
204 
205     /**
206      * Returns the document type name criteria to search against when executing the document search.  If the document
207      * type name matches a single document type exactly, this might trigger document search customizations which are
208      * tied to that document type (assuming the document type has such customizations configured).
209      *
210      * <p>In order for the map of document attribute values to be properly searchable, this document type name should
211      * result to a valid document type.  This is because the document type itself defines information about custom
212      * document attributes and the parameters around how searches against those attributes can be executed.</p>
213      *
214      * <p>Note that searches against a document type name should be document type hierarchy-aware.  Meaning that the
215      * search should also return results for any documents that have document types that are children of the specified
216      * document type name (assuming that the specified document type name is valid and not wildcarded at all).</p>
217      *
218      * @return the document type name criteria
219      */
220     String getDocumentTypeName();
221 
222     /**
223      * Returns an optional list of additional document type name criteria against which to search.  The search should
224      * effectively return all documents that have a document type name within the set of the main document type name on
225      * the criteria as well as any additional document type names.
226      *
227      * <p>As with {@link #getDocumentTypeName()}, the additional document type name criteria is document type hierarchy
228      * aware.</p>
229      *
230      * @return the list of additional document type names to use on the search criteria
231      */
232     List<String> getAdditionalDocumentTypeNames();
233 
234     /**
235      * Returns the inclusive lower end of the date created criteria to search against when executing the document search.
236      *
237      * @return the date created "from" criteria
238      */
239     DateTime getDateCreatedFrom();
240 
241     /**
242      * Returns the inclusive upper end of the date created criteria to search against when executing the document search.
243      *
244      * @return the date created "to" criteria
245      */
246     DateTime getDateCreatedTo();
247 
248     /**
249      * Returns the inclusive lower end of the date last modified criteria to search against when executing the document search.
250      *
251      * @return the date last modified "from" criteria
252      */
253     DateTime getDateLastModifiedFrom();
254 
255     /**
256      * Returns the inclusive upper end of the date last modified criteria to search against when executing the document search.
257      *
258      * @return the date last modified "to" criteria
259      */
260     DateTime getDateLastModifiedTo();
261 
262     /**
263      * Returns the inclusive lower end of the date approved criteria to search against when executing the document search.
264      *
265      * @return the date approved "from" criteria
266      */
267     DateTime getDateApprovedFrom();
268 
269     /**
270      * Returns the inclusive upper end of the date approved criteria to search against when executing the document search.
271      *
272      * @return the date approved "tp" criteria
273      */
274     DateTime getDateApprovedTo();
275 
276     /**
277      * Returns the inclusive lower end of the date finalized criteria to search against when executing the document search.
278      *
279      * @return the date finalized "from" criteria
280      */
281     DateTime getDateFinalizedFrom();
282 
283     /**
284      * Returns the inclusive upper end of the date finalized criteria to search against when executing the document search.
285      *
286      * @return the date finalized "to" criteria
287      */
288     DateTime getDateFinalizedTo();
289 
290     /**
291      * Returns the inclusive lower end of the date of application document status change criteria to search against when executing the document search.
292      *
293      * @return the date application document status changed "from" criteria
294      */
295     DateTime getDateApplicationDocumentStatusChangedFrom();
296 
297     /**
298      * Returns the inclusive upper end of the date of application document status change criteria to search against when executing the document search.
299      *
300      * @return the date application document status changed "to" criteria
301      */
302     DateTime getDateApplicationDocumentStatusChangedTo();
303 
304     /**
305      * Returns a map of document attribute values to search against when executing the document search.  The key of the
306      * map is the name of the document attribute, while the list of values contains values of those attributes to search
307      * against.  These individual attribute values support the different search operations where appropriate.  The
308      * resulting List of criteria values however should ultimately be "or"-ed together when executing the document
309      * search.
310      *
311      * <p>In order for the document attribute values to be processed as part of the criteria during the search, the
312      * {@link #getDocumentTypeName()} must return a valid name of a document type which is configured to understand the
313      * attributes passed as part of the document attribute values map.</p>
314      * @return
315      */
316     Map<String, List<String>> getDocumentAttributeValues();
317 
318     /**
319      * Returns a map of custom options for document search when either executing the document search or returning results.
320      * The key of the map is the name of the document attribute, while the list of values contains values of those
321      * attributes to customize against.
322      *
323      * <p>In order for the search options to be processed as part of the criteria during the search, a custom document
324      * search customizer must be used to fill and process these values.
325      * @since 2.1.1
326      * @return
327      */
328     Map<String, List<String>> getSearchOptions();
329 
330     /**
331      * Return the name under which to save this criteria so that it can be recalled and used again in the future.  If no
332      * save name is specified, then this criteria will not be saved for future use.
333      * @return
334      */
335     String getSaveName();
336 
337     /**
338      * Returns the 0-based index in the result set at which to start returning results from a document search which is
339      * performed using this criteria.  If not specified, results from the search should be returned starting at the
340      * beginning of the result set.  If this index is larger then the total number of results returned by the actual
341      * search, then no values should be returned.
342      *
343      * @return the index in the result set at which to begin returning results
344      */
345 	Integer getStartAtIndex();
346 
347     /**
348      * Returns the requested maximum number of documents that should be returned from a document search performed using this
349      * criteria.  If not specified, it is up to the document search implementation to decide how many results to return.
350      * It is likely in such cases that the implementation will use a default result cap in order to prevent too many
351      * documents from being returned.
352      *
353      * <p>It is important to note that this value is meant simply as a request to the document search for the number of
354      * results to return.  The implementation may return fewer results then requested if it decides to impose it's own
355      * internal cap on results.</p>
356      *
357      * @return the requested number of maximum document results that should be returned from the search
358      */
359 	Integer getMaxResults();
360 
361     /**
362      * Returns a string that indicates if a query was run in advanced mode.
363      *
364      * @return whether or not the search was run in advanced mode
365      */
366     String getIsAdvancedSearch();
367 
368     /**
369      * Return the list of application document statuses to match when executing the document search.
370      *
371      * @since 2.1.2
372      * @return the list of application document statuses to match
373      */
374     List<String> getApplicationDocumentStatuses();
375 
376     /**
377      * Returns the principalId of the user performing the search
378      *
379      * @since 2.1.2
380      * @return
381      */
382     String getDocSearchUserId();
383 }