1 /**
2 * Copyright 2005-2013 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 }