View Javadoc

1   /*
2    * Copyright 2005-2008 The Kuali Foundation
3    *
4    *
5    * Licensed under the Educational Community License, Version 2.0 (the "License");
6    * you may not use this file except in compliance with the License.
7    * You may obtain a copy of the License at
8    *
9    * http://www.opensource.org/licenses/ecl2.php
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.kuali.rice.kew.docsearch;
18  
19  import org.junit.Test;
20  import org.kuali.rice.core.api.util.ClassLoaderUtils;
21  import org.kuali.rice.kew.docsearch.service.DocumentSearchService;
22  import org.kuali.rice.kew.docsearch.xml.DocumentSearchXMLResultProcessor;
23  import org.kuali.rice.kew.docsearch.xml.DocumentSearchXMLResultProcessorImpl;
24  import org.kuali.rice.kew.doctype.bo.DocumentType;
25  import org.kuali.rice.kew.doctype.service.DocumentTypeService;
26  import org.kuali.rice.kew.rule.bo.RuleAttribute;
27  import org.kuali.rice.kew.service.KEWServiceLocator;
28  import org.kuali.rice.kew.util.KEWPropertyConstants;
29  import org.kuali.rice.kim.api.identity.Person;
30  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
31  import org.kuali.rice.kns.web.ui.Column;
32  
33  import java.util.Arrays;
34  import java.util.Iterator;
35  import java.util.List;
36  
37  import static org.junit.Assert.assertEquals;
38  import static org.junit.Assert.fail;
39  
40  /**
41   *
42   * @author Kuali Rice Team (rice.collab@kuali.org)
43   */
44  public class CustomDocumentSearchResultProcessorTest extends DocumentSearchTestBase {
45  //	private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CustomSearchAttributesTest.class);
46  
47      protected void loadTestData() throws Exception {
48          loadXmlFile("SearchAttributeConfig.xml");
49      }
50  
51      @Test public void testCustomDocumentSearchResultProcessorOverrideUse() throws Exception {
52      	DocumentType docType = ((DocumentTypeService)KEWServiceLocator.getService(KEWServiceLocator.DOCUMENT_TYPE_SERVICE)).findByName("SearchDocType");
53      	assertEquals("The document search Processor class is incorrect.",StandardDocumentSearchResultProcessor.class,(ClassLoaderUtils.unwrapFromProxy(docType.getDocumentSearchResultProcessor())).getClass());
54  
55      	docType = ((DocumentTypeService)KEWServiceLocator.getService(KEWServiceLocator.DOCUMENT_TYPE_SERVICE)).findByName("SearchDocType_DefaultCustomProcessor");
56      	assertEquals("The document search Processor class is incorrect.",DocumentSearchXMLResultProcessorImpl.class,(ClassLoaderUtils.unwrapFromProxy(docType.getDocumentSearchResultProcessor())).getClass());
57  
58      	docType = ((DocumentTypeService)KEWServiceLocator.getService(KEWServiceLocator.DOCUMENT_TYPE_SERVICE)).findByName("SearchDocType2");
59      	assertEquals("The document search Processor class is incorrect.",CustomSearchResultProcessor.class,(ClassLoaderUtils.unwrapFromProxy(docType.getDocumentSearchResultProcessor())).getClass());
60      }
61  
62      @Test public void testSearchXMLResultProcessorFunction() throws Exception {
63          RuleAttribute ruleAttribute = KEWServiceLocator.getRuleAttributeService().findByName("XMLResultProcessorDetails");
64          DocumentSearchXMLResultProcessorImpl docSearchResult = new DocumentSearchXMLResultProcessorImpl();
65          docSearchResult.setRuleAttribute(ruleAttribute);
66  
67          List<Column> columns = docSearchResult.getCustomDisplayColumns();
68      	for (Iterator iter = columns.iterator(); iter.hasNext();) {
69      	    Column column = (Column) iter.next();
70  			if (KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOC_TYPE_LABEL.equals(column.getPropertyName())) {
71  				assertEquals("Attribute xml is not populating column 'sortable' value correctly", "true", column.getSortable());
72  				assertEquals("Attribute xml is not populating column 'title' value correctly", "", column.getColumnTitle());
73  			} else if (KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOCUMENT_TITLE.equals(column.getPropertyName())) {
74  				assertEquals("Attribute xml is not populating column 'sortable' value correctly", "false", column.getSortable());
75  				assertEquals("Attribute xml is not populating column 'title' value correctly", null, column.getColumnTitle());
76  			} else if (KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_INITIATOR.equals(column.getPropertyName())) {
77  				assertEquals("Attribute xml is not populating column 'sortable' value correctly", null, column.getSortable());
78  				assertEquals("Attribute xml is not populating column 'title' value correctly", "Initiator Dude", column.getColumnTitle());
79  			} else if (KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_ROUTE_STATUS_DESC.equals(column.getPropertyName())) {
80  				assertEquals("Attribute xml is not populating column 'sortable' value correctly", null, column.getSortable());
81  				assertEquals("Attribute xml is not populating column 'title' value correctly", null, column.getColumnTitle());
82  			} else if (TestXMLSearchableAttributeString.SEARCH_STORAGE_KEY.equals(column.getPropertyName())) {
83  				assertEquals("Attribute xml is not populating column 'sortable' value correctly", "false", column.getSortable());
84  				assertEquals("Attribute xml is not populating column 'title' value correctly", null, column.getColumnTitle());
85  			} else {
86  				fail("Key value of custom column should never be anything except already checked values but is '" + column.getPropertyName() + "'");
87  			}
88  		}
89  
90      	assertEquals("Value of 'show all standard fields' should be default",DocumentSearchXMLResultProcessor.DEFAULT_SHOW_ALL_STANDARD_FIELDS_VALUE,docSearchResult.getShowAllStandardFields());
91      	assertEquals("Value of 'override searchable attributes' should be default",DocumentSearchXMLResultProcessor.DEFAULT_OVERRIDE_SEARCHABLE_ATTRIBUTES_VALUE,docSearchResult.getOverrideSearchableAttributes());
92      }
93  
94      private DocumentSearchResultComponents performSearch(String documentTypeName,String userNetworkId) {
95      	DocumentType docType = ((DocumentTypeService)KEWServiceLocator.getService(KEWServiceLocator.DOCUMENT_TYPE_SERVICE)).findByName(documentTypeName);
96          DocumentSearchService docSearchService = (DocumentSearchService) KEWServiceLocator.getService(KEWServiceLocator.DOCUMENT_SEARCH_SERVICE);
97          Person person = KimApiServiceLocator.getPersonService().getPersonByPrincipalName(userNetworkId);
98  
99          DocSearchCriteriaDTO criteria = new DocSearchCriteriaDTO();
100         criteria.setDocTypeFullName(documentTypeName);
101         criteria.addSearchableAttribute(createSearchAttributeCriteriaComponent(TestXMLSearchableAttributeString.SEARCH_STORAGE_KEY, TestXMLSearchableAttributeString.SEARCH_STORAGE_VALUE, docType));
102         return docSearchService.getList(person.getPrincipalId(), criteria);
103     }
104 
105     private void parseList(List<Column> columns, List<String> columnsRequired, List<String> columnsNotAllowed) {
106     	// check to see if column should be excluded but is not
107 		for (Iterator iterator = columnsNotAllowed.iterator(); iterator.hasNext();) {
108 			String disallowedColumnKey = (String) iterator.next();
109 	        for (Iterator iter = columns.iterator(); iter.hasNext();) {
110 	            Column currentColumn = (Column) iter.next();
111 				if (disallowedColumnKey.equals(currentColumn.getPropertyName())) {
112 					fail("The column with key '" + currentColumn.getPropertyName() + "' should not be in the list of columns to be displayed but was");
113 				}
114 	        }
115 		}
116 
117 		// check to see if column should be in list but is not
118 		for (int i = 0; i < columnsRequired.size(); i++) {
119 			String requiredColumnKey = columnsRequired.get(i);
120 			Column testColumn = columns.get(i);
121 			if (!(requiredColumnKey.equals(testColumn.getPropertyName()))) {
122 				fail("The column with key '" + requiredColumnKey + "' should be in the list of columns to be displayed (at location " + i + ") but was not");
123 			}
124 		}
125     }
126 
127     @Test public void testCustomDocumentSearchXMLResultProcessor() throws Exception {
128     	String searchableAttributeKey_Shown = "givenname";
129     	String searchableAttributeKey_Hidden = "givenname_hidden";
130     	/*    - test showAllStandard = *blank* && overrideSearchAtt = *blank* (default way of doing search) - XMLResultProcessorDefault
131     	 *        - search attr xml hidden && search proc attr shown = shown
132     	 *        - search attr xml shown && search proc attr hidden = hidden
133     	 *        - standard fields = hidden
134     	 */
135         String documentTypeName = "SearchDocType_DefaultCustomProcessor";
136         String userNetworkId = "rkirkend";
137         DocumentSearchResultComponents result = performSearch(documentTypeName, userNetworkId);
138         /*  columns that should be shown
139          *    - documentId
140          *    - doctypelabel
141          *    - givenname_hidden
142          *    - doc title
143          *    - init
144          *    - docroutestat
145          *    - routeLog
146          *
147          *  columns that should not be shown
148          *    - givenname
149          *    - create date
150          */
151         parseList(result.getColumns(), Arrays.asList(new String[]{
152         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOCUMENT_ID,
153         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOC_TYPE_LABEL,
154         		searchableAttributeKey_Hidden,
155         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOCUMENT_TITLE,
156         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_INITIATOR,
157         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_ROUTE_STATUS_DESC,
158         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_ROUTE_LOG
159         		}), Arrays.asList(new String[]{
160         				KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DATE_CREATED,
161         				searchableAttributeKey_Shown
162         		}));
163 
164         /*    - test showAllStandard = false && overrideSearchAtt = true - XMLResultProcessorAllCustom
165     	 *        - search attr xml hidden && search proc attr shown = shown
166     	 *        - search attr xml shown && search proc attr hidden = hidden
167     	 *        - standard fields = hidden
168     	 */
169         documentTypeName = "SearchDocType_AllCustomProcessor";
170         result = performSearch(documentTypeName, userNetworkId);
171         /*  columns that should be shown
172          *    - documentId
173          *    - doctypelabel
174          *    - doc title
175          *    - init
176          *    - givenname_hidden
177          *    - docroutestat
178          *    - routeLog
179          *
180          *  columns that should not be shown
181          *    - givenname
182          *    - create date
183          */
184         parseList(result.getColumns(), Arrays.asList(new String[]{
185         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOCUMENT_ID,
186         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOC_TYPE_LABEL,
187         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOCUMENT_TITLE,
188         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_INITIATOR,
189         		searchableAttributeKey_Hidden,
190         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_ROUTE_STATUS_DESC,
191         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_ROUTE_LOG
192         		}), Arrays.asList(new String[]{
193         				KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DATE_CREATED,
194         				searchableAttributeKey_Shown
195         		}));
196 
197         /*    - test showAllStandard = true && overrideSearchAtt = true - XMLResultProcessorSearchAttributeCustom
198     	 *        - search attr xml hidden && search proc attr shown = shown
199     	 *        - search attr xml shown && search proc attr hidden = hidden
200     	 *        - standard fields = shown
201     	 *        - check order with standard fields before search fields
202          */
203         documentTypeName = "SearchDocType_SearchAttCustomProcessor";
204         result = performSearch(documentTypeName, userNetworkId);
205         /*  columns that should be shown
206          *    - documentId
207          *    - docTypeLabel
208          *    - documentTitle
209          *    - docRouteStatusCodeDesc
210          *    - initiator
211          *    - dateCreated
212          *    - givenname_hidden
213          *    - routeLog
214          *
215          *  columns that should not be shown
216          *    - givenname
217          */
218         parseList(result.getColumns(), Arrays.asList(new String[]{
219         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOCUMENT_ID,
220         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOC_TYPE_LABEL,
221         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOCUMENT_TITLE,
222         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_ROUTE_STATUS_DESC,
223 				KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_INITIATOR,
224 				KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DATE_CREATED,
225         		searchableAttributeKey_Hidden,
226         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_ROUTE_LOG
227         		}), Arrays.asList(new String[]{
228         				searchableAttributeKey_Shown
229         		}));
230 
231         /*    - test showAllStandard = false && overrideSearchAtt = false - XMLResultProcessorStandardCustom
232     	 *        - search attr xml hidden && search proc attr show = hidden
233     	 *        - search attr xml shown && search proc attr hidden = shown
234     	 *        - standard fields = hidden
235     	 *        - check order with search fields after custom standard fields
236          */
237         documentTypeName = "SearchDocType_StandardCustomProcessor";
238         result = performSearch(documentTypeName, userNetworkId);
239         /*  columns that should be shown
240          *    - documentId
241          *    - doc title
242          *    - doctypelabel
243          *    - docroutestat
244          *    - init
245          *    - givenname
246          *    - routeLog
247          *
248          *  columns that should not be shown
249          *    - givenname_hidden
250          *    - create date
251          */
252         parseList(result.getColumns(), Arrays.asList(new String[]{
253         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOCUMENT_ID,
254         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOCUMENT_TITLE,
255         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOC_TYPE_LABEL,
256         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_ROUTE_STATUS_DESC,
257         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_INITIATOR,
258         		searchableAttributeKey_Shown,
259         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_ROUTE_LOG
260         		}), Arrays.asList(new String[]{
261         				KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DATE_CREATED,
262                 		searchableAttributeKey_Hidden
263         		}));
264 
265         /*    - test showAllStandard = true && overrideSearchAtt = false (default way of doing search) - XMLResultProcessorNormalCustom
266     	 *        - search attr xml hidden && search proc attr show = hidden
267     	 *        - search attr xml shown && search proc attr hidden = shown
268     	 *        - standard fields = shown
269     	 *        - check order with standard fields before search fields
270          */
271         documentTypeName = "SearchDocType_NormalCustomProcessor";
272         result = performSearch(documentTypeName, userNetworkId);
273         /*  columns that should be shown
274          *    - documentId
275          *    - docTypeLabel
276          *    - documentTitle
277          *    - docRouteStatusCodeDesc
278          *    - initiator
279          *    - dateCreated
280          *    - givenname
281          *    - routeLog
282          *
283          *  columns that should not be shown
284          *    - givenname_hidden
285          */
286         parseList(result.getColumns(), Arrays.asList(new String[]{
287         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOCUMENT_ID,
288         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOC_TYPE_LABEL,
289         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DOCUMENT_TITLE,
290         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_ROUTE_STATUS_DESC,
291 				KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_INITIATOR,
292 				KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_DATE_CREATED,
293         		searchableAttributeKey_Shown,
294         		KEWPropertyConstants.DOC_SEARCH_RESULT_PROPERTY_NAME_ROUTE_LOG
295         		}), Arrays.asList(new String[]{
296                 		searchableAttributeKey_Hidden
297         		}));
298     }
299 }