/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.sys.document.workflow;
//RICE20 Hook to document type is not working right now but needs to be changed to support pre-rice2.0 release
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.kuali.rice.core.api.uif.RemotableAttributeError;
import org.kuali.rice.core.api.uif.RemotableAttributeField;
import org.kuali.rice.kew.api.document.DocumentWithContent;
import org.kuali.rice.kew.api.document.attribute.DocumentAttribute;
import org.kuali.rice.kew.api.document.attribute.WorkflowAttributeDefinition;
import org.kuali.rice.kew.api.document.search.DocumentSearchCriteria;
import org.kuali.rice.kew.api.document.search.DocumentSearchResult;
import org.kuali.rice.kew.api.extension.ExtensionDefinition;
import org.kuali.rice.kew.framework.document.attribute.SearchableAttribute;
import org.kuali.rice.kew.framework.document.search.DocumentSearchCustomizer;
import org.kuali.rice.kew.framework.document.search.DocumentSearchResultSetConfiguration;
import org.kuali.rice.kew.framework.document.search.DocumentSearchResultValues;
import org.kuali.rice.kew.framework.document.search.StandardResultField;
public class KFSDocumentSearchCustomizer implements SearchableAttribute, DocumentSearchCustomizer {
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(KFSDocumentSearchCustomizer.class);
protected SearchableAttribute searchableAttribute;
public KFSDocumentSearchCustomizer() {
this(new FinancialSystemSearchableAttribute());
}
public KFSDocumentSearchCustomizer(SearchableAttribute searchableAttribute) {
this.searchableAttribute = searchableAttribute;
}
@Override
public DocumentSearchResultValues customizeResults(DocumentSearchCriteria documentSearchCriteria, List<DocumentSearchResult> defaultResults) {
if ( LOG.isDebugEnabled() ) {
LOG.debug( "customizeResults( " + documentSearchCriteria + ", " + defaultResults + " )" );
}
return null;
}
@Override
public final String generateSearchContent(ExtensionDefinition extensionDefinition,
String documentTypeName,
WorkflowAttributeDefinition attributeDefinition) {
if ( LOG.isDebugEnabled() ) {
LOG.debug( "generateSearchContent( " + extensionDefinition + ", " + documentTypeName + ", " + attributeDefinition + " )" );
}
return getSearchableAttribute().generateSearchContent(extensionDefinition, documentTypeName, attributeDefinition);
}
@Override
public final List<DocumentAttribute> extractDocumentAttributes(ExtensionDefinition extensionDefinition,
DocumentWithContent documentWithContent) {
if ( LOG.isDebugEnabled() ) {
LOG.debug( "extractDocumentAttributes( " + extensionDefinition + ", " + documentWithContent + " )" );
}
return getSearchableAttribute().extractDocumentAttributes(extensionDefinition, documentWithContent);
}
@Override
public final List<RemotableAttributeField> getSearchFields(ExtensionDefinition extensionDefinition,
String documentTypeName) {
if ( LOG.isDebugEnabled() ) {
LOG.debug( "getSearchFields( " + extensionDefinition + ", " + documentTypeName + " )" );
}
return getSearchableAttribute().getSearchFields(extensionDefinition, documentTypeName);
}
@Override
public final List<RemotableAttributeError> validateDocumentAttributeCriteria(ExtensionDefinition extensionDefinition,
DocumentSearchCriteria documentSearchCriteria) {
if ( LOG.isDebugEnabled() ) {
LOG.debug( "validateDocumentAttributeCriteria( " + extensionDefinition + ", " + documentSearchCriteria + " )" );
}
return getSearchableAttribute().validateDocumentAttributeCriteria(extensionDefinition, documentSearchCriteria);
}
protected SearchableAttribute getSearchableAttribute() {
return this.searchableAttribute;
}
public void setSearchableAttribute(SearchableAttribute searchableAttribute) {
this.searchableAttribute = searchableAttribute;
}
@Override
public DocumentSearchCriteria customizeCriteria(DocumentSearchCriteria documentSearchCriteria) {
if ( LOG.isDebugEnabled() ) {
LOG.debug( "customizeCriteria( " + documentSearchCriteria + " )" );
}
// since this is a result display option, we need to remove it from the criteria to prevent
// the query from blowing up or returning no results.
if ( documentSearchCriteria.getDocumentAttributeValues().containsKey( FinancialSystemSearchableAttribute.DISPLAY_TYPE_SEARCH_ATTRIBUTE_NAME ) ) {
DocumentSearchCriteria.Builder newCriteria = DocumentSearchCriteria.Builder.create(documentSearchCriteria);
Map<String, List<String>> searchOptions = new HashMap<String, List<String>>();
searchOptions.put(FinancialSystemSearchableAttribute.DISPLAY_TYPE_SEARCH_ATTRIBUTE_NAME,
newCriteria.getDocumentAttributeValues().get(FinancialSystemSearchableAttribute.DISPLAY_TYPE_SEARCH_ATTRIBUTE_NAME));
newCriteria.setSearchOptions(searchOptions);
newCriteria.getDocumentAttributeValues().remove( FinancialSystemSearchableAttribute.DISPLAY_TYPE_SEARCH_ATTRIBUTE_NAME );
return newCriteria.build();
}
return null;
}
@Override
public DocumentSearchCriteria customizeClearCriteria(DocumentSearchCriteria documentSearchCriteria) {
if ( LOG.isDebugEnabled() ) {
LOG.debug( "customizeClearCriteria( " + documentSearchCriteria + " )" );
}
DocumentSearchCriteria.Builder newCriteria = DocumentSearchCriteria.Builder.create();
newCriteria.setDocumentTypeName(documentSearchCriteria.getDocumentTypeName());
return newCriteria.build();
}
protected static final List<StandardResultField> standardResultsToRemove = new ArrayList<StandardResultField>();
static {
standardResultsToRemove.add(StandardResultField.DOCUMENT_TYPE);
standardResultsToRemove.add(StandardResultField.TITLE);
//standardResultsToRemove.add(StandardResultField.STATUS);
standardResultsToRemove.add(StandardResultField.INITIATOR);
standardResultsToRemove.add(StandardResultField.DATE_CREATED);
}
@Override
public DocumentSearchResultSetConfiguration customizeResultSetConfiguration(DocumentSearchCriteria documentSearchCriteria) {
if ( LOG.isDebugEnabled() ) {
LOG.debug( "customizeResultSetConfiguration( " + documentSearchCriteria + " )" );
}
DocumentSearchResultSetConfiguration.Builder config = DocumentSearchResultSetConfiguration.Builder.create();
config.setOverrideSearchableAttributes(false);
config.setStandardResultFieldsToRemove(standardResultsToRemove);
List<String> displayTypeList = documentSearchCriteria.getSearchOptions().get(FinancialSystemSearchableAttribute.DISPLAY_TYPE_SEARCH_ATTRIBUTE_NAME);
if ( displayTypeList != null && !displayTypeList.isEmpty() ) {
String displayType = displayTypeList.get(0);
if ( StringUtils.equals(displayType, FinancialSystemSearchableAttribute.WORKFLOW_DISPLAY_TYPE_VALUE)) {
config.setOverrideSearchableAttributes(true);
config.setStandardResultFieldsToRemove(null);
}
}
return config.build();
}
@Override
public boolean isCustomizeCriteriaEnabled(String documentTypeName) {
return true;
}
@Override
public boolean isCustomizeClearCriteriaEnabled(String documentTypeName) {
return true;
}
@Override
public boolean isCustomizeResultsEnabled(String documentTypeName) {
return false;
}
@Override
public boolean isCustomizeResultSetFieldsEnabled(String documentTypeName) {
return true;
}
}