View Javadoc
1   /**
2    * Copyright 2005-2015 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.attribute;
17  
18  import org.kuali.rice.core.api.uif.RemotableAttributeError;
19  import org.kuali.rice.core.api.uif.RemotableAttributeField;
20  import org.kuali.rice.kew.api.KewApiConstants;
21  import org.kuali.rice.kew.api.document.DocumentWithContent;
22  import org.kuali.rice.kew.api.document.attribute.DocumentAttribute;
23  import org.kuali.rice.kew.api.document.attribute.WorkflowAttributeDefinition;
24  import org.kuali.rice.kew.api.document.search.DocumentSearchCriteria;
25  import org.kuali.rice.kew.api.extension.ExtensionDefinition;
26  
27  import javax.jws.WebMethod;
28  import javax.jws.WebParam;
29  import javax.jws.WebResult;
30  import javax.jws.WebService;
31  import javax.jws.soap.SOAPBinding;
32  import javax.xml.bind.annotation.XmlElement;
33  import javax.xml.bind.annotation.XmlElementWrapper;
34  import java.util.List;
35  
36  /**
37   * Allows for definition of custom attributes on a document that should be indexed along with that document and made
38   * searchable when performing document searches.  Applications who want to index and expose these custom attributes on
39   * their documents can implement this interface and configure their document type to point to the searchable attributes
40   * that it should use.
41   *
42   * <p>A searchable attribute provides the following basic functions:</p>
43   *
44   * <ul>
45   *     <li>The ability to generate XML content that can be associated with the document and used for indexing purposes.</li>
46   *     <li>The ability to extract attribute values from the document and supply them to the indexer for indexing.</li>
47   *     <li>The ability to define how custom search attributes will be presented in the document search user interface.</li>
48   *     <li>The ability to define validation for custom search attribute criteria which is executed from the document search user interface.</li>
49   * </ul>
50   *
51   * <p>Searchable attributes are mapped to document types via the KEW extension framework (see
52   * {@link org.kuali.rice.kew.api.extension.ExtensionRepositoryService}).
53   *
54   * <p>Through this extension mechanism, searchable attributes are designed to allow for re-use if desired.  To
55   * facilitate this, the name of the document type for which the operation is being performed is included for all such
56   * methods which might make use of it.  Additionally, all of the operations on a searchable attribute are passed the
57   * {@link ExtensionDefinition} which was used to define the instance of the searchable attribute and link it to the
58   * document type.  The extension definition can be defined to include additional configuration which can be used by the
59   * various methods on the searchable attribute implementation.  This allows for creating a single
60   * {@code SearchableAttribute} implementation which can then be parameterized externally by reusing the implementation
61   * in the extension repository, but parameterizing it via one ore more extension definitions.</p>
62   *
63   * <p>This interface is annotated to allow for it to be exposed as a JAXWS web service, so client applications
64   * wanting to publish their own searchable attribute implementations may do so by publishing their search attribute
65   * implementations on the bus.  However, this is optional as it is possible to declare an extension definition for a searchable
66   * attribute which uses the class name instead of a service name.  In these cases, searchable attribute implementations
67   * will be located and invoked via an application's
68   * {@link org.kuali.rice.kew.framework.document.search.DocumentSearchCustomizationHandlerService} endpoint assuming that
69   * the proper application id is associated with the extension definition.</p>
70   *
71   * @see org.kuali.rice.kew.framework.document.search.DocumentSearchCustomizationHandlerService
72   * @see org.kuali.rice.kew.api.extension.ExtensionRepositoryService
73   * @see ExtensionDefinition
74   * @see WorkflowAttributeDefinition
75   *
76   * @author Kuali Rice Team (rice.collab@kuali.org)
77   */
78  @WebService(name = "searchableAttributeService", targetNamespace = KewApiConstants.Namespaces.KEW_NAMESPACE_2_0)
79  @SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
80  public interface SearchableAttribute {
81  
82      /**
83       * Allows for generation of custom XML for this searchable attribute.  The trigger for invocation of custom XML
84       * generation happens via the workflow API whenever a document action is taken and a request is submitted to update
85       * document XML based on searchable attribute definitions (see
86       * {@link org.kuali.rice.kew.api.document.DocumentContentUpdate}).  This XML is ultimately included as part of the
87       * document's content.
88       *
89       * <p>It is intended that this XML can be used by the {@code extractDocumentAttributes} method in order to pull
90       * values out for indexing, though this method is free to use any source available to it for extracting data for
91       * indexing alongside a document.</p>
92       *
93       * <p>A null or blank value may be returned from this method to indicate that no XML was generated.</p>
94       *
95       * @param extensionDefinition the extension definition which was used to locate and load this searchable attribute
96       * implementation
97       * @param documentTypeName the name of the document type for which this method is being invoked
98       * @param attributeDefinition contains parameters and properties that can be used to inform generation of the XML,
99       * these are supplied by the user of the workflow API when the document's searchable XML content is requested to be
100      * updated
101      * 
102      * @return a String containing valid XML that should be included in the searchable attribute XML section of the
103      * document's XML content
104      */
105     @WebMethod(operationName = "generateSearchContent")
106     @WebResult(name = "searchContent")
107     public String generateSearchContent(
108             @WebParam(name = "extensionDefinition") ExtensionDefinition extensionDefinition,
109             @WebParam(name = "documentTypeName") String documentTypeName,
110             @WebParam(name = "attributeDefinition") WorkflowAttributeDefinition attributeDefinition
111     );
112 
113     /**
114      * Extracts and returns document attributes for the given document in order to allow indexing of those values for
115      * association with the document and use in document searches.  The document and it's XML content is passed to this
116      * method as that is a common source of data for indexing purposes, though implementations are free to pull data for
117      * indexing from any readily accessible source.
118      *
119      * <p>There are a finite set of {@link DocumentAttribute} implementations which can be returned and interpreted
120      * correctly.  Client application's should <strong>not</strong> create custom extensions of the
121      * {@code DocumentAttribute} abstract class but should preferably use the
122      * {@link org.kuali.rice.kew.api.document.attribute.DocumentAttributeFactory} to construct strongly-typed document
123      * attribute instances for indexing.</p>
124      *
125      * @param extensionDefinition the extension definition which was used to locate and load this searchable attribute
126      * implementation
127      * @param documentWithContent the workflow document and it's XML content
128      * 
129      * @return a list of document attribute values that should be indexed for the given document, or a null or empty
130      * list if no attributes should be indexed
131      *
132      * @see org.kuali.rice.kew.api.document.attribute.DocumentAttributeFactory
133      */
134     @WebMethod(operationName = "extractDocumentAttributes")
135     @WebResult(name = "documentAttributes")
136     @XmlElementWrapper(name = "documentAttributes", required = false)
137     @XmlElement(name = "documentAttribute", required = false)
138     public List<DocumentAttribute> extractDocumentAttributes(
139             @WebParam(name = "extensionDefinition") ExtensionDefinition extensionDefinition,
140             @WebParam(name = "documentWithContent") DocumentWithContent documentWithContent);
141 
142     /**
143      * Returns a list of {@link RemotableAttributeField} objects which define which searchable attribute criteria fields
144      * should be included in the criteria section of the document search user interface for this searchable attribute.
145      *
146      * @param extensionDefinition the extension definition which was used to locate and load this searchable attribute
147      * implementation
148      * @param documentTypeName the name of the document type for which this method is being invoked
149      *
150      * @return a list of remotable attribute fields which define the search fields that should be included in the
151      * document search criteria, or a null or empty list if no criteria should be included for this searchable attribute
152      */
153     @WebMethod(operationName = "getSearchFields")
154     @WebResult(name = "searchFields")
155     @XmlElementWrapper(name = "searchFields", required = false)
156     @XmlElement(name = "searchField", required = false)
157     public List<RemotableAttributeField> getSearchFields(
158             @WebParam(name = "extensionDefinition") ExtensionDefinition extensionDefinition,
159             @WebParam(name = "documentTypeName") String documentTypeName
160     );
161 
162     /**
163      * Performs custom validation of document attribute values that come from this searchable attribute whenever a
164      * document search is performed against a document type which uses this searchable attribute.  This hook allows for
165      * any desired validation of this searchable attributes custom document attribute values to be performed prior to
166      * the execution of the document search.
167      *
168      * <p>The entire {@link org.kuali.rice.kew.api.document.search.DocumentSearchCriteria} is passed to this method, though it's intended that implementing
169      * code will pull out the document attribute values on the criteria which are managed by this searchable attribute
170      * and perform any desired validation.  However, there are certainly no restrictions on this method that would
171      * prevent it from performing validations outside of this scope and in relation to other portions of the criteria,
172      * though this is certainly not the intent of this validation hook.</p>
173      *
174      * <p>Note that this method is invoked when performing a document search from the user interface as well as via
175      * the {@link org.kuali.rice.kew.api.document.WorkflowDocumentService} api.</p>
176      *
177      * @param extensionDefinition the extension definition which was used to locate and load this searchable attribute
178      * implementation
179      * @param documentSearchCriteria the criteria that was submitted to the document search and against which validation
180      * is requested
181      *
182      * @return a list of attribute errors containing and validation failure errors messages for the relevant document
183      * attributes, if this returns a null or empty list it means that validation was successful
184      */
185     @WebMethod(operationName = "validateSearchParameters")
186     @WebResult(name = "validationErrors")
187     @XmlElementWrapper(name = "validationErrors", required = false)
188     @XmlElement(name = "validationError", required = false)
189     public List<RemotableAttributeError> validateDocumentAttributeCriteria(
190             @WebParam(name = "extensionDefinition") ExtensionDefinition extensionDefinition,
191             @WebParam(name = "documentSearchCriteria") DocumentSearchCriteria documentSearchCriteria
192     );
193 
194 }