001 /** 002 * Copyright 2005-2014 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.rice.kns.lookup; 017 018 import org.kuali.rice.kns.document.authorization.BusinessObjectRestrictions; 019 import org.kuali.rice.kns.web.struts.form.LookupForm; 020 import org.kuali.rice.kns.web.ui.Column; 021 import org.kuali.rice.kns.web.ui.Field; 022 import org.kuali.rice.kns.web.ui.ResultRow; 023 import org.kuali.rice.kns.web.ui.Row; 024 import org.kuali.rice.krad.bo.BusinessObject; 025 import org.kuali.rice.kns.service.BusinessObjectDictionaryService; 026 import org.kuali.rice.krad.service.DataDictionaryService; 027 import org.kuali.rice.krad.util.KRADConstants; 028 import org.kuali.rice.krad.util.UrlFactory; 029 import org.springframework.transaction.annotation.Transactional; 030 031 import java.util.Collection; 032 import java.util.List; 033 import java.util.Map; 034 import java.util.Properties; 035 036 /** 037 * Kuali lookup implementation. Implements methods necessary to render the lookup and provides search and return methods. 038 */ 039 @Transactional 040 public class KualiLookupableImpl implements Lookupable { 041 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(KualiLookupableImpl.class); 042 protected static final String[] IGNORE_LIST = { KRADConstants.DOC_FORM_KEY, KRADConstants.BACK_LOCATION }; 043 044 protected Class businessObjectClass; 045 protected LookupableHelperService lookupableHelperService; 046 protected String extraOnLoad = ""; // This is supposed to be a javascript function. 047 048 /** 049 * Default constructor initializes services from spring 050 */ 051 public KualiLookupableImpl() { 052 } 053 054 /** 055 * Sets the business object class for the lookup instance, then rows can be set for search render. 056 * 057 * @param boClass Class for the lookup business object 058 */ 059 public void setBusinessObjectClass(Class boClass) { 060 if (boClass == null) { 061 throw new RuntimeException("Business object class is null."); 062 } 063 064 this.businessObjectClass = boClass; 065 066 // next line initializes the helper to return correct values for getRow(); 067 getLookupableHelperService().setBusinessObjectClass(boClass); 068 } 069 070 /** 071 * Initializes the lookup with the given Map of parameters. 072 * 073 * @param parameters 074 */ 075 public void setParameters(Map<String, String[]> parameters) { 076 getLookupableHelperService().setParameters(parameters); 077 } 078 079 /** 080 * @return Returns the parameters passed to this lookup 081 */ 082 public Map<String, String[]> getParameters() { 083 return getLookupableHelperService().getParameters(); 084 } 085 086 /** 087 * Constructs the list of columns for the search results. All properties for the column objects come from the DataDictionary. 088 */ 089 public List<Column> getColumns() { 090 return getLookupableHelperService().getColumns(); 091 } 092 093 /** 094 * Checks that any required search fields have value. 095 * 096 * @see Lookupable#validateSearchParameters(java.util.Map) 097 */ 098 public void validateSearchParameters(Map<String, String> fieldValues) { 099 getLookupableHelperService().validateSearchParameters(fieldValues); 100 } 101 102 /** 103 * Uses Lookup Service to provide a basic unbounded search. 104 * 105 * @param fieldValues - Map containing prop name keys and search values 106 * 107 * @return List found business objects 108 */ 109 public List<? extends BusinessObject> getSearchResultsUnbounded(Map<String, String> fieldValues) { 110 return getLookupableHelperService().getSearchResultsUnbounded(fieldValues); 111 } 112 113 /** 114 * Uses Lookup Service to provide a basic search. 115 * 116 * @param fieldValues - Map containing prop name keys and search values 117 * 118 * @return List found business objects 119 */ 120 public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) { 121 return getLookupableHelperService().getSearchResults(fieldValues); 122 } 123 124 /** 125 * @return the return url for each result row. 126 */ 127 public HtmlData getReturnUrl(BusinessObject bo, Map fieldConversions, String lookupImpl, BusinessObjectRestrictions businessObjectRestrictions) { 128 return getLookupableHelperService().getReturnUrl(bo, fieldConversions, lookupImpl, getReturnKeys(), businessObjectRestrictions); 129 } 130 131 /** 132 * @see Lookupable#getCreateNewUrl() 133 */ 134 public String getCreateNewUrl() { 135 String url = ""; 136 137 if (getLookupableHelperService().allowsMaintenanceNewOrCopyAction()) { 138 Properties parameters = new Properties(); 139 parameters.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, KRADConstants.MAINTENANCE_NEW_METHOD_TO_CALL); 140 parameters.put(KRADConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, this.businessObjectClass.getName()); 141 142 url = UrlFactory.parameterizeUrl(KRADConstants.MAINTENANCE_ACTION, parameters); 143 url = "<a title=\"Create a new record\" href=\"" + url + "\"><img src=\"images/tinybutton-createnew.gif\" alt=\"create new\" width=\"70\" height=\"15\"/></a>"; 144 } 145 146 return url; 147 } 148 149 150 /** 151 * @see Lookupable#getHtmlMenuBar() 152 */ 153 public String getHtmlMenuBar() { 154 return getBusinessObjectDictionaryService().getLookupMenuBar(getBusinessObjectClass()); 155 } 156 157 /** 158 * @see Lookupable#getSupplementalMenuBar() 159 */ 160 public String getSupplementalMenuBar() { 161 return getLookupableHelperService().getSupplementalMenuBar(); 162 } 163 164 /** 165 * @see Lookupable#getRows() 166 */ 167 public List<Row> getRows() { 168 return getLookupableHelperService().getRows(); 169 } 170 171 /** 172 * @see Lookupable#getTitle() 173 */ 174 public String getTitle() { 175 return getLookupableHelperService().getTitle(); 176 } 177 178 /** 179 * @see Lookupable#getReturnLocation() 180 */ 181 public String getReturnLocation() { 182 return getLookupableHelperService().getReturnLocation(); 183 } 184 185 /** 186 * @return Returns the dataObjectClass. 187 */ 188 public Class getBusinessObjectClass() { 189 return businessObjectClass; 190 } 191 192 /** 193 * @return a List of the names of fields which are marked in data dictionary as return fields. 194 */ 195 public List<String> getReturnKeys() { 196 return getLookupableHelperService().getReturnKeys(); 197 } 198 199 200 /** 201 * @see Lookupable#getExtraButtonSource() 202 */ 203 public String getExtraButtonSource() { 204 return getBusinessObjectDictionaryService().getExtraButtonSource(getBusinessObjectClass()); 205 } 206 207 /** 208 * @see Lookupable#getExtraButtonParams() 209 */ 210 public String getExtraButtonParams() { 211 return getBusinessObjectDictionaryService().getExtraButtonParams(getBusinessObjectClass()); 212 } 213 214 /** 215 * @return property names that will be used to sort on by default 216 */ 217 public List<String> getDefaultSortColumns() { 218 return getLookupableHelperService().getDefaultSortColumns(); 219 } 220 221 /** 222 * @see Lookupable#checkForAdditionalFields(java.util.Map) 223 */ 224 public boolean checkForAdditionalFields(Map<String, String> fieldValues) { 225 return getLookupableHelperService().checkForAdditionalFields(fieldValues); 226 } 227 228 /** 229 * @return Returns the backLocation. 230 */ 231 public String getBackLocation() { 232 return getLookupableHelperService().getBackLocation(); 233 } 234 235 /** 236 * @param backLocation The backLocation to set. 237 */ 238 public void setBackLocation(String backLocation) { 239 getLookupableHelperService().setBackLocation(backLocation); 240 } 241 242 /** 243 * @return Returns the docFormKey. 244 */ 245 public String getDocFormKey() { 246 return getLookupableHelperService().getDocFormKey(); 247 } 248 249 /** 250 * // this method is public because unit tests depend upon it 251 * @param docFormKey The docFormKey to set. 252 */ 253 public void setDocFormKey(String docFormKey) { 254 getLookupableHelperService().setDocFormKey(docFormKey); 255 } 256 257 /** 258 * @return Returns the businessObjectDictionaryService. 259 */ 260 protected BusinessObjectDictionaryService getBusinessObjectDictionaryService() { 261 return getLookupableHelperService().getBusinessObjectDictionaryService(); 262 } 263 264 /** 265 * @see Lookupable#setFieldConversions(java.util.Map) 266 */ 267 public void setFieldConversions(Map fieldConversions) { 268 getLookupableHelperService().setFieldConversions(fieldConversions); 269 } 270 271 /** 272 * @return Returns the dataDictionaryService. 273 */ 274 protected DataDictionaryService getDataDictionaryService() { 275 return getLookupableHelperService().getDataDictionaryService(); 276 } 277 278 279 /** 280 * Sets the readOnlyFieldsList attribute value. 281 * 282 * @param readOnlyFieldsList The readOnlyFieldsList to set. 283 */ 284 public void setReadOnlyFieldsList(List<String> readOnlyFieldsList) { 285 getLookupableHelperService().setReadOnlyFieldsList(readOnlyFieldsList); 286 } 287 288 289 public LookupableHelperService getLookupableHelperService() { 290 return lookupableHelperService; 291 } 292 293 294 /** 295 * Sets the lookupableHelperService attribute value. 296 * @param lookupableHelperService The lookupableHelperService to set. 297 */ 298 public void setLookupableHelperService(LookupableHelperService lookupableHelperService) { 299 this.lookupableHelperService = lookupableHelperService; 300 } 301 302 /** 303 * Performs a lookup that can only return one row. 304 * @see Lookupable#performLookup(org.kuali.rice.krad.web.struts.form.LookupForm, java.util.List, boolean) 305 */ 306 public Collection<? extends BusinessObject> performLookup(LookupForm lookupForm, List<ResultRow> resultTable, boolean bounded) { 307 return getLookupableHelperService().performLookup(lookupForm, resultTable, bounded); 308 } 309 310 311 public boolean isSearchUsingOnlyPrimaryKeyValues() { 312 return getLookupableHelperService().isSearchUsingOnlyPrimaryKeyValues(); 313 } 314 315 316 public String getPrimaryKeyFieldLabels() { 317 return getLookupableHelperService().getPrimaryKeyFieldLabels(); 318 } 319 320 /** 321 * calls the lookup helper service to do "clear" behaviors 322 * 323 * @see Lookupable#performClear() 324 */ 325 public void performClear(LookupForm lookupForm) { 326 getLookupableHelperService().performClear(lookupForm); 327 } 328 329 /** 330 * calls the lookup helper service to check if non maintenance actions should be displayed 331 * 332 * @see Lookupable#shouldDisplayHeaderNonMaintActions() 333 */ 334 public boolean shouldDisplayHeaderNonMaintActions() { 335 return getLookupableHelperService().shouldDisplayHeaderNonMaintActions(); 336 } 337 338 /** 339 * calls the lookup helper service to check if criteria should be displayed 340 * 341 * @see Lookupable#shouldDisplayLookupCriteria() 342 */ 343 public boolean shouldDisplayLookupCriteria() { 344 return getLookupableHelperService().shouldDisplayLookupCriteria(); 345 } 346 347 protected String getCreateNewUrl(String url){ 348 return "<a title=\"Create a new record\" href=\"" + url + "\"><img src=\"images/tinybutton-createnew.gif\" alt=\"create new\" width=\"70\" height=\"15\"/></a>"; 349 } 350 351 /** 352 * @see Lookupable#performCustomAction(boolean) 353 */ 354 public boolean performCustomAction(boolean ignoreErrors) { 355 return getLookupableHelperService().performCustomAction(ignoreErrors); 356 } 357 358 /** 359 * This overridden method ... 360 * 361 * @see Lookupable#getExtraField() 362 */ 363 public Field getExtraField() { 364 return getLookupableHelperService().getExtraField(); 365 } 366 367 /** 368 * This overridden method ... 369 * 370 * @see Lookupable#applyFieldAuthorizationsFromNestedLookups(org.kuali.rice.krad.web.ui.Field) 371 */ 372 public void applyFieldAuthorizationsFromNestedLookups(Field field) { 373 getLookupableHelperService().applyFieldAuthorizationsFromNestedLookups(field); 374 } 375 376 /** 377 * This overridden method returns the extraOnLoad variable. The 378 * varible is currently accessed in page.tag and is called in the onLoad. 379 * it allows us to inject javascript onload. 380 * 381 * @see Lookupable#getExtraOnLoad() 382 */ 383 public String getExtraOnLoad() { 384 return extraOnLoad; 385 } 386 387 /** 388 * @param extraOnLoad the extraOnLoad to set 389 */ 390 public void setExtraOnLoad(String extraOnLoad) { 391 this.extraOnLoad = extraOnLoad; 392 } 393 394 /** 395 * @see Lookupable#applyConditionalLogicForFieldDisplay() 396 */ 397 public void applyConditionalLogicForFieldDisplay() { 398 getLookupableHelperService().applyConditionalLogicForFieldDisplay(); 399 } 400 401 }