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.framework.document.search;
17  
18  import org.kuali.rice.kew.api.document.search.DocumentSearchCriteria;
19  import org.kuali.rice.kew.api.document.search.DocumentSearchResult;
20  
21  import java.util.List;
22  
23  /**
24   * Provides various mechanisms for an application to customize the behavior of the Document Search functionality for
25   * their document types.  Client applications should provide implementations of this interface if they need to
26   * enact some of these customizations on document searches.  These customizers then get mapped to the appropriate
27   * document types via the KEW extension framework (see
28   * {@link org.kuali.rice.kew.api.extension.ExtensionRepositoryService}).
29   *
30   * <p>The customization functionality provided by this interface includes:</p>
31   *
32   * <ul>
33   *     <li>The ability to customize document search criteria before it gets submitted.</li>
34   *     <li>The ability to customize how document search criteria is cleared.</li>
35   *     <li>The ability to customize how result data is processed and presented.</li>
36   * </ul>
37   *
38   * <p>Only one {@code DocumentSearchCustomizer} is supported for a given document type.  It is important to note however
39   * that it is permitted that an implementation of this interface could be tied to more than one document type via the
40   * extension framework.  This is why information about the specific document type for which the customizations is being
41   * applied is passed to all methods on this interface (note that the document type information is available from the
42   * {@code DocumentSearchCriteria} as well.</p>
43   *
44   * <p>Furthermore, the customization hooks afforded by this interface will only be executed when a valid document type
45   * has been specified as input to the document search.  This is because the customizer is tied to the document type and
46   * the document search must therefore be able to resolve a valid document type from the user-supplied criteria in order
47   * to perform these customizations.</p>
48   *
49   * <p>Since some of the operations on this component could potentially add expense to the overall search process in the
50   * cases where customization is only done on certain document types or only certain customization features are being
51   * utilized, this interface provides for a set of boolean operations which indicate which customization
52   * features should be activated by the document search framework for a given document type.  It's expected that KEW
53   * will check each of these flags prior to invoking the corresponding method that it "gaurds" and, if the customization
54   * flag is disabled, it should refrain from executing that method.</p>
55   *
56   * <p></p>Implementations of this interface are expected to return "true" for any of these operations for which they
57   * provide a custom implementation.  <strong>It is important to note that callers are permitted to cache the results
58   * returned from these boolean methods for an unspecified length of time.</strong>  So if there is any possibility that,
59   * for a given document type, the implementation might perform a particular customization, then "true" should be
60   * returned from the appropriate boolean method.</p>
61   *
62   * @author Kuali Rice Team (rice.collab@kuali.org)
63   */
64  public interface DocumentSearchCustomizer {
65  
66      /**
67       * Performs customization on the given document search criteria.  This method should return the customized version
68       * of the criteria, or null if no customizations were performed.  This customization is invoked prior the actual
69       * search being executed, and the resulting customized criteria is what gets passed to the search implementation.
70       * It is also invoked in situtations where the document search is performed via the api or via the user interface.
71       *
72       * <p>It is guaranteed that the document type name on the given criteria will never be null and will always
73       * represent a valid document type.</p>
74       *
75       * @param documentSearchCriteria the original criteria against which to perform customization, will never be null
76       *
77       * @return the customized criteria, or null if no customization was performed
78       */
79      DocumentSearchCriteria customizeCriteria(DocumentSearchCriteria documentSearchCriteria);
80  
81      /**
82       * Performs a customized "clear" of the given document search criteria.  Clearing of the criteria is typically
83       * invoked whenever the user of the document search user interface clicks the "clear" button.  By default all of
84       * the search criteria is cleared, but this method allows for certain criteria data to be preserved on a clear if
85       * desired.
86       *
87       * <p>A common use of this feature is to preserve the document type that has been selected when clearing criteria
88       * for a customized document search.
89       *
90       * <p>It is guaranteed that the document type name on the given criteria will never be null and will always
91       * represent a valid document type.</p>
92       *
93       * @param documentSearchCriteria the criteria to clear
94       *
95       * @return the cleared criteria, or null if no custom criteria clearing was performed
96       */
97      DocumentSearchCriteria customizeClearCriteria(DocumentSearchCriteria documentSearchCriteria);
98  
99      /**
100      * Performs customization of the given list of document search results.  This method is invoked after the search is
101      * executed but before results are returned to the caller.  It is executed when a document search is executed via
102      * the api or from the document search user interface.
103      *
104      * <p>This method returns a {@code DocumentSearchResultValues} object which contains a list of
105      * {@link DocumentSearchResultValue} objects.  Each of these result values maps to a specific document id and
106      * contains a list of {@link org.kuali.rice.kew.api.document.attribute.DocumentAttribute} values which can be used
107      * to modify existing document attributes or create new ones that are included as part of the search results.  It
108      * is important to note that in order for these custom attribute values to be displayed in the result set in the
109      * document search user interface, there must be a corresponding entry in the
110      * {@link DocumentSearchResultSetConfiguration} returned by the
111      * {@link #customizeResultSetConfiguration(org.kuali.rice.kew.api.document.search.DocumentSearchCriteria)} method
112      * on this customizer implementation.</p>
113      *
114      * <p>It is permissible that implementations of this method may not return result values for all of the document
115      * provided in the given list of document search results.  It is important to note however that ommision from the
116      * returned result values does not filter or remove the result from the search results.  Generally speaking, this
117      * method cannot be used to remove results from the result set.</p>
118      *
119      * <p>It is guaranteed that the document type name on the given criteria will never be null and will always
120      * represent a valid document type.</p>
121      *
122      * @param documentSearchCriteria the criteria against which the document search was executed
123      * @param defaultResults the results that were returned by the execution of the document search
124      * 
125      * @return customized search result values for any of the document results requiring custom values, or null if no
126      * customization was performed
127      */
128     DocumentSearchResultValues customizeResults(DocumentSearchCriteria documentSearchCriteria, List<DocumentSearchResult> defaultResults);
129 
130     /**
131      * Performs customization of what result fields should be displayed in the result set.  Allows for hiding of
132      * standard fields, addition of custom fields, and the ability to override the default behavior of searchable
133      * attributes that are defined for the document type.  Generally speaking, this controls which "columns" of data are
134      * displayed in the document search results.
135      *
136      * <p>This method is only invoked by the document search user interface whenever it is rendering document search
137      * results.  It is not invoked when invoking document search using only the api.</p>
138      *
139      * <p>It is guaranteed that the document type name on the given criteria will never be null and will always
140      * represent a valid document type.</p>
141      *
142      * @param documentSearchCriteria the criteria against which the document search was executed
143      * @return the customized result set configuration, or null if no customization was performed
144      */
145     DocumentSearchResultSetConfiguration customizeResultSetConfiguration(DocumentSearchCriteria documentSearchCriteria);
146 
147     /**
148      * Indicates if the {@link #customizeCriteria(org.kuali.rice.kew.api.document.search.DocumentSearchCriteria)} on
149      * this customizer should be invoked for the document type with the given name.  The caller of this method is
150      * permitted to cache the return value for a length of time of their choosing.
151      *
152      * @param documentTypeName the name of the document type against which this customizer is being applied
153      * @return true if the customization method should be executed, false otherwise
154      */
155     boolean isCustomizeCriteriaEnabled(String documentTypeName);
156 
157     /**
158      * Indicates if the {@link #customizeClearCriteria(org.kuali.rice.kew.api.document.search.DocumentSearchCriteria)}
159      * on this customizer should be invoked for the document type with the given name.  The caller of this method is
160      * permitted to cache the return value for a length of time of their choosing.
161      *
162      * @param documentTypeName the name of the document type against which this customizer is being applied
163      * @return true if the customization method should be executed, false otherwise
164      */
165     boolean isCustomizeClearCriteriaEnabled(String documentTypeName);
166 
167     /**
168      * Indicates if the {@link #customizeResults(org.kuali.rice.kew.api.document.search.DocumentSearchCriteria, java.util.List)}
169      * on this customizer should be invoked for the document type with the given name.  The caller of this method is
170      * permitted to cache the return value for a length of time of their choosing.
171      *
172      * @param documentTypeName the name of the document type against which this customizer is being applied
173      * @return true if the customization method should be executed, false otherwise
174      */
175     boolean isCustomizeResultsEnabled(String documentTypeName);
176 
177     /**
178      * Indicates if the {@link #customizeResultSetConfiguration(org.kuali.rice.kew.api.document.search.DocumentSearchCriteria)}
179      * on this customizer should be invoked for the document type with the given name.  The caller of this method is
180      * permitted to cache the return value for a length of time of their choosing.
181      *
182      * @param documentTypeName the name of the document type against which this customizer is being applied
183      * @return true if the customization method should be executed, false otherwise
184      */
185     boolean isCustomizeResultSetFieldsEnabled(String documentTypeName);
186 
187 }