001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.module.purap.businessobject.lookup; 017 018 import java.util.Collections; 019 import java.util.List; 020 import java.util.Map; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.kuali.kfs.vnd.VendorConstants; 024 import org.kuali.kfs.vnd.VendorKeyConstants; 025 import org.kuali.kfs.vnd.VendorPropertyConstants; 026 import org.kuali.rice.kns.bo.BusinessObject; 027 import org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl; 028 import org.kuali.rice.kns.lookup.LookupUtils; 029 import org.kuali.rice.kns.util.BeanPropertyComparator; 030 import org.kuali.rice.kns.util.GlobalVariables; 031 import org.kuali.rice.kns.util.KNSConstants; 032 033 /** 034 * This lookupable helper service is used to support lookups on the Threshold BO because it deals with the vendor number, 035 * which isn't really a field, but rather a combination of 2 fields. 036 * 037 * This code mostly copies {@link org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl}, but differs in that this class will 038 * not remove search criteria containing values corresponding to hidden fields. 039 * 040 */ 041 public class ThresholdLookupableHelperService extends AbstractLookupableHelperServiceImpl { 042 043 public void validateSearchParameters(Map fieldValues) { 044 super.validateSearchParameters(fieldValues); 045 046 validateVendorNumber(fieldValues); 047 } 048 049 /** 050 * Validates that the Vendor Number has no more than one dash in it, and does not consist solely of one dash. Then it calls 051 * extractVendorNumberToVendorIds to obtain vendorHeaderGeneratedId and vendorDetailAssignedId and if either one of the ids 052 * cannot be converted to integers, it will add error that the vendor number must be numerics or numerics separated by a dash. 053 * 054 * @param fieldValues a Map containing only those key-value pairs that have been filled in on the lookup 055 */ 056 protected void validateVendorNumber(Map fieldValues) { 057 String vendorNumber = (String) fieldValues.get(VendorPropertyConstants.VENDOR_NUMBER); 058 if (StringUtils.isNotBlank(vendorNumber)) { 059 int dashPos1 = vendorNumber.indexOf(VendorConstants.DASH); 060 if (dashPos1 > -1) { // There's a dash in the number. 061 if (vendorNumber.indexOf(VendorConstants.DASH, dashPos1 + 1) > -1) { // There can't be more than one. 062 GlobalVariables.getMessageMap().putError(VendorPropertyConstants.VENDOR_NUMBER, VendorKeyConstants.ERROR_VENDOR_LOOKUP_VNDR_NUM_TOO_MANY_DASHES); 063 } 064 if (vendorNumber.matches("\\-*")) { 065 GlobalVariables.getMessageMap().putError(VendorPropertyConstants.VENDOR_NUMBER, VendorKeyConstants.ERROR_VENDOR_LOOKUP_VNDR_NUM_DASHES_ONLY); 066 } 067 } 068 extractVendorNumberToVendorIds(fieldValues, vendorNumber); 069 } 070 } 071 072 /** 073 * Parses the vendorNumber string into vendorHeaderGeneratedIdentifier and vendorDetailAssignedIdentifier, validates that both 074 * fields would be able to be converted into integers, if so it will add both fields into the search criterias map in the 075 * fieldValues and remove the vendorNumber from the fieldValues. If the two fields cannot be converted into integers, this 076 * method will add error message to the errorMap in GlobalVariables that the vendor number must be numeric or numerics separated 077 * by a dash. 078 * 079 * @param fieldValues a Map containing only those key-value pairs that have been filled in on the lookup 080 * @param vendorNumber venodr number String 081 */ 082 protected void extractVendorNumberToVendorIds(Map fieldValues, String vendorNumber) { 083 String vendorHeaderGeneratedIdentifier = null; 084 String vendorDetailAssignedIdentifier = null; 085 int indexOfDash = vendorNumber.indexOf(VendorConstants.DASH); 086 if (indexOfDash < 0) { 087 vendorHeaderGeneratedIdentifier = vendorNumber; 088 } 089 else { 090 vendorHeaderGeneratedIdentifier = vendorNumber.substring(0, indexOfDash); 091 vendorDetailAssignedIdentifier = vendorNumber.substring(indexOfDash + 1, vendorNumber.length()); 092 } 093 try { 094 if (StringUtils.isNotEmpty(vendorHeaderGeneratedIdentifier)) { 095 Integer.parseInt(vendorHeaderGeneratedIdentifier); 096 } 097 if (StringUtils.isNotEmpty(vendorDetailAssignedIdentifier)) { 098 Integer.parseInt(vendorDetailAssignedIdentifier); 099 } 100 fieldValues.remove(VendorPropertyConstants.VENDOR_NUMBER); 101 fieldValues.put(VendorPropertyConstants.VENDOR_HEADER_GENERATED_ID, vendorHeaderGeneratedIdentifier); 102 fieldValues.put(VendorPropertyConstants.VENDOR_DETAIL_ASSIGNED_ID, vendorDetailAssignedIdentifier); 103 } 104 catch (NumberFormatException headerExc) { 105 GlobalVariables.getMessageMap().putError(VendorPropertyConstants.VENDOR_NUMBER, VendorKeyConstants.ERROR_VENDOR_LOOKUP_VNDR_NUM_NUMERIC_DASH_SEPARATED); 106 } 107 } 108 109 /** 110 * Uses Lookup Service to provide a basic search. 111 * 112 * @param fieldValues - Map containing prop name keys and search values 113 * 114 * @return List found business objects 115 * @see org.kuali.rice.kns.lookup.LookupableHelperService#getSearchResults(java.util.Map) 116 */ 117 public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) { 118 return getSearchResultsHelper(LookupUtils.forceUppercase(getBusinessObjectClass(), fieldValues), false); 119 } 120 121 122 /** 123 * Uses Lookup Service to provide a basic unbounded search. 124 * 125 * @param fieldValues - Map containing prop name keys and search values 126 * 127 * @return List found business objects 128 * @see org.kuali.rice.kns.lookup.LookupableHelperService#getSearchResultsUnbounded(java.util.Map) 129 */ 130 public List<? extends BusinessObject> getSearchResultsUnbounded(Map<String, String> fieldValues) { 131 return getSearchResultsHelper(LookupUtils.forceUppercase(getBusinessObjectClass(), fieldValues), true); 132 } 133 134 /** 135 * 136 * This method does the actual search, with the parameters specified, and returns the result. 137 * 138 * NOTE that it will not do any upper-casing based on the DD forceUppercase. That is handled through an external call to 139 * LookupUtils.forceUppercase(). 140 * 141 * @param fieldValues A Map of the fieldNames and fieldValues to be searched on. 142 * @param unbounded Whether the results should be bounded or not to a certain max size. 143 * @return A List of search results. 144 * 145 */ 146 @SuppressWarnings("unchecked") 147 protected List<? extends BusinessObject> getSearchResultsHelper(Map<String, String> fieldValues, boolean unbounded) { 148 // pretty much the same code as exists in KualiLookupableHelperServiceImpl, except that we're not removing hidden fields 149 150 boolean searchUsingOnlyPrimaryKeyValues = getLookupService().allPrimaryKeyValuesPresentAndNotWildcard(getBusinessObjectClass(), fieldValues); 151 152 setBackLocation(fieldValues.get(KNSConstants.BACK_LOCATION)); 153 setDocFormKey(fieldValues.get(KNSConstants.DOC_FORM_KEY)); 154 setReferencesToRefresh(fieldValues.get(KNSConstants.REFERENCES_TO_REFRESH)); 155 List searchResults = (List) getLookupService().findCollectionBySearchHelper(getBusinessObjectClass(), fieldValues, unbounded); 156 // sort list if default sort column given 157 List defaultSortColumns = getDefaultSortColumns(); 158 if (defaultSortColumns.size() > 0) { 159 Collections.sort(searchResults, new BeanPropertyComparator(getDefaultSortColumns(), true)); 160 } 161 return searchResults; 162 } 163 } 164