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.gl.web.struts; 017 018 import java.util.Enumeration; 019 import java.util.HashSet; 020 import java.util.Map; 021 import java.util.Set; 022 023 import javax.servlet.http.HttpServletRequest; 024 025 import org.apache.commons.lang.StringUtils; 026 import org.kuali.kfs.sys.KFSConstants; 027 import org.kuali.rice.kns.lookup.LookupUtils; 028 import org.kuali.rice.kns.web.struts.form.KualiTableRenderFormMetadata; 029 import org.kuali.rice.kns.web.struts.form.LookupForm; 030 031 /** 032 * This class is the action form for balance inquiry lookup results 033 * 034 */ 035 public class BalanceInquiryLookupResults extends LookupForm implements LookupResultsSelectable { 036 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BalanceInquiryLookupResults.class); 037 038 private KualiTableRenderFormMetadata tableMetadata; 039 040 private String lookupResultsSequenceNumber; 041 042 /** 043 * The number of rows that match the query criteria 044 */ 045 private int resultsActualSize; 046 047 /** 048 * The number of rows that match the query criteria or the max results limit size (if applicable), whichever is less 049 */ 050 private int resultsLimitedSize; 051 052 /** 053 * when the looked results screen was rendered, the index of the column that the results were sorted on. -1 for unknown, index 054 * numbers starting at 0 055 */ 056 private String previouslySortedColumnIndex; 057 058 /** 059 * Comment for <code>columnToSortIndex</code> 060 */ 061 private int columnToSortIndex; 062 063 /** 064 * the name of the collection being looked up by the calling page. This value will be returned unmodified to the calling page 065 * (indicated by super.getBackLocation()), which should use it to determine in which collection the selected results will be 066 * returned. 067 */ 068 private String lookedUpCollectionName; 069 070 /** 071 * Those object IDs that were selected before the current page is rendered 072 */ 073 private Set<String> previouslySelectedObjectIdSet; 074 /** 075 * Those object IDs that are rendered on the current page 076 */ 077 private Set<String> displayedObjectIdSet; 078 /** 079 * Those object IDs that are selected/checked on the current page 080 */ 081 private Set<String> selectedObjectIdSet; 082 /** 083 * The object IDs that are selected after the struts action is complete; the obj IDs in the keys of this Map will be considered 084 * checked in the UI 085 */ 086 private Map<String, String> compositeObjectIdMap; 087 088 public BalanceInquiryLookupResults() { 089 tableMetadata = new KualiTableRenderFormMetadata(); 090 } 091 092 protected String getMethodToCall(HttpServletRequest request) { 093 return request.getParameter(KFSConstants.DISPATCH_REQUEST_PARAMETER); 094 } 095 096 /** 097 * Named appropriately as it is intended to be called from a <code>{@link LookupForm}</code> 098 * 099 * @param request HttpServletRequest 100 */ 101 public void populate(HttpServletRequest request) { 102 super.populate(request); 103 104 if (StringUtils.isNotBlank(request.getParameter(KFSConstants.TableRenderConstants.VIEWED_PAGE_NUMBER))) { 105 setViewedPageNumber(Integer.parseInt(request.getParameter(KFSConstants.TableRenderConstants.VIEWED_PAGE_NUMBER))); 106 } 107 else { 108 setViewedPageNumber(0); // first page is page 0 109 } 110 111 if (KFSConstants.TableRenderConstants.SWITCH_TO_PAGE_METHOD.equals(getMethodToCall(request))) { 112 // look for the page number to switch to 113 setSwitchToPageNumber(-1); 114 115 // the param we're looking for looks like: methodToCall.switchToPage.1.x , where 1 is the page nbr 116 String paramPrefix = KFSConstants.DISPATCH_REQUEST_PARAMETER + "." + KFSConstants.TableRenderConstants.SWITCH_TO_PAGE_METHOD + "."; 117 for (Enumeration i = request.getParameterNames(); i.hasMoreElements();) { 118 String parameterName = (String) i.nextElement(); 119 if (parameterName.startsWith(paramPrefix) && parameterName.endsWith(".x")) { 120 String switchToPageNumberStr = StringUtils.substringBetween(parameterName, paramPrefix, "."); 121 setSwitchToPageNumber(Integer.parseInt(switchToPageNumberStr)); 122 } 123 } 124 if (getSwitchToPageNumber() == -1) { 125 throw new RuntimeException("Couldn't find page number"); 126 } 127 } 128 129 if (KFSConstants.TableRenderConstants.SORT_METHOD.equals(getMethodToCall(request))) { 130 setColumnToSortIndex(-1); 131 132 // the param we're looking for looks like: methodToCall.sort.1.x , where 1 is the column to sort on 133 String paramPrefix = KFSConstants.DISPATCH_REQUEST_PARAMETER + "." + KFSConstants.TableRenderConstants.SORT_METHOD + "."; 134 for (Enumeration i = request.getParameterNames(); i.hasMoreElements();) { 135 String parameterName = (String) i.nextElement(); 136 if (parameterName.startsWith(paramPrefix) && parameterName.endsWith(".x")) { 137 String columnToSortStr = StringUtils.substringBetween(parameterName, paramPrefix, "."); 138 setColumnToSortIndex(Integer.parseInt(columnToSortStr)); 139 } 140 } 141 if (getColumnToSortIndex() == -1) { 142 throw new RuntimeException("Couldn't find column to sort"); 143 } 144 } 145 146 setPreviouslySelectedObjectIdSet(parsePreviouslySelectedObjectIds(request)); 147 setSelectedObjectIdSet(parseSelectedObjectIdSet(request)); 148 setDisplayedObjectIdSet(parseDisplayedObjectIdSet(request)); 149 150 setSearchUsingOnlyPrimaryKeyValues(parseSearchUsingOnlyPrimaryKeyValues(request)); 151 if (isSearchUsingOnlyPrimaryKeyValues()) { 152 setPrimaryKeyFieldLabels(getLookupable().getPrimaryKeyFieldLabels()); 153 } 154 } 155 156 /** 157 * This method converts the composite object IDs into a String 158 * 159 * @return String for composite list of selected object IDs 160 */ 161 public String getCompositeSelectedObjectIds() { 162 return LookupUtils.convertSetOfObjectIdsToString(getCompositeObjectIdMap().keySet()); 163 } 164 165 /** 166 * Parses a list of previously selected object IDs 167 * 168 * @param request 169 * @return Set containing list of previously selected object IDs 170 */ 171 protected Set<String> parsePreviouslySelectedObjectIds(HttpServletRequest request) { 172 String previouslySelectedObjectIds = request.getParameter(KFSConstants.MULTIPLE_VALUE_LOOKUP_PREVIOUSLY_SELECTED_OBJ_IDS_PARAM); 173 return LookupUtils.convertStringOfObjectIdsToSet(previouslySelectedObjectIds); 174 } 175 176 /** 177 * Parses a list of selected object IDs 178 * 179 * @param request 180 * @return Set containing list of selected object IDs 181 */ 182 protected Set<String> parseSelectedObjectIdSet(HttpServletRequest request) { 183 Set<String> set = new HashSet<String>(); 184 185 Enumeration paramNames = request.getParameterNames(); 186 while (paramNames.hasMoreElements()) { 187 String paramName = (String) paramNames.nextElement(); 188 if (paramName.startsWith(KFSConstants.MULTIPLE_VALUE_LOOKUP_SELECTED_OBJ_ID_PARAM_PREFIX) && StringUtils.isNotBlank(request.getParameter(paramName))) { 189 set.add(StringUtils.substringAfter(paramName, KFSConstants.MULTIPLE_VALUE_LOOKUP_SELECTED_OBJ_ID_PARAM_PREFIX)); 190 } 191 } 192 return set; 193 } 194 195 /** 196 * Parses a list of displayed object IDs 197 * 198 * @param request 199 * @return Set containing list of displayed object IDs 200 */ 201 protected Set<String> parseDisplayedObjectIdSet(HttpServletRequest request) { 202 Set<String> set = new HashSet<String>(); 203 204 Enumeration paramNames = request.getParameterNames(); 205 while (paramNames.hasMoreElements()) { 206 String paramName = (String) paramNames.nextElement(); 207 if (paramName.startsWith(KFSConstants.MULTIPLE_VALUE_LOOKUP_DISPLAYED_OBJ_ID_PARAM_PREFIX) && StringUtils.isNotBlank(request.getParameter(paramName))) { 208 set.add(StringUtils.substringAfter(paramName, KFSConstants.MULTIPLE_VALUE_LOOKUP_DISPLAYED_OBJ_ID_PARAM_PREFIX)); 209 } 210 } 211 return set; 212 } 213 214 /** 215 * Iterates through the request params, looks for the parameter representing the method to call in the format like 216 * methodToCall.sort.1.(::;true;::).x, and returns the boolean value in the (::; and ;::) delimiters. 217 * 218 * @see MultipleValueLookupForm#parseSearchUsingOnlyPrimaryKeyValues(String) 219 * @param request 220 * @return 221 */ 222 protected boolean parseSearchUsingOnlyPrimaryKeyValues(HttpServletRequest request) { 223 // the param we're looking for looks like: methodToCall.sort.1.(::;true;::).x , we want to parse out the "true" component 224 String paramPrefix = KFSConstants.DISPATCH_REQUEST_PARAMETER + "." + getMethodToCall(request) + "."; 225 for (Enumeration i = request.getParameterNames(); i.hasMoreElements();) { 226 String parameterName = (String) i.nextElement(); 227 if (parameterName.startsWith(paramPrefix) && parameterName.endsWith(".x")) { 228 return parseSearchUsingOnlyPrimaryKeyValues(parameterName); 229 } 230 } 231 // maybe doing an initial search, so no value will be present 232 return false; 233 } 234 235 /** 236 * Parses the method to call parameter passed in as a post parameter The parameter should be something like 237 * methodToCall.sort.1.(::;true;::).x, this method will return the value between (::; and ;::) as a boolean 238 * 239 * @param methodToCallParam the method to call in a format described above 240 * @return the value between the delimiters, false if there are no delimiters 241 */ 242 protected boolean parseSearchUsingOnlyPrimaryKeyValues(String methodToCallParam) { 243 String searchUsingOnlyPrimaryKeyValuesStr = StringUtils.substringBetween(methodToCallParam, KFSConstants.METHOD_TO_CALL_PARM12_LEFT_DEL, KFSConstants.METHOD_TO_CALL_PARM12_RIGHT_DEL); 244 if (StringUtils.isBlank(searchUsingOnlyPrimaryKeyValuesStr)) { 245 return false; 246 } 247 return Boolean.parseBoolean(searchUsingOnlyPrimaryKeyValuesStr); 248 } 249 250 /** 251 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getViewedPageNumber() 252 */ 253 public int getViewedPageNumber() { 254 return tableMetadata.getViewedPageNumber(); 255 } 256 257 /** 258 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setViewedPageNumber(int) 259 */ 260 public void setViewedPageNumber(int pageNumberBeingViewedForMultivalueLookups) { 261 tableMetadata.setViewedPageNumber(pageNumberBeingViewedForMultivalueLookups); 262 } 263 264 /** 265 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getLookupResultsSequenceNumber() 266 */ 267 public String getLookupResultsSequenceNumber() { 268 return lookupResultsSequenceNumber; 269 } 270 271 /** 272 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setLookupResultsSequenceNumber(java.lang.String) 273 */ 274 public void setLookupResultsSequenceNumber(String lookupResultSequenceNumber) { 275 this.lookupResultsSequenceNumber = lookupResultSequenceNumber; 276 } 277 278 /** 279 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getTotalNumberOfPages() 280 */ 281 public int getTotalNumberOfPages() { 282 return tableMetadata.getTotalNumberOfPages(); 283 } 284 285 /** 286 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setTotalNumberOfPages(int) 287 */ 288 public void setTotalNumberOfPages(int totalNumberOfPages) { 289 tableMetadata.setTotalNumberOfPages(totalNumberOfPages); 290 } 291 292 /** 293 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getFirstRowIndex() 294 */ 295 public int getFirstRowIndex() { 296 return tableMetadata.getFirstRowIndex(); 297 } 298 299 /** 300 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setFirstRowIndex(int) 301 */ 302 public void setFirstRowIndex(int firstRowIndex) { 303 tableMetadata.setFirstRowIndex(firstRowIndex); 304 } 305 306 /** 307 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getLastRowIndex() 308 */ 309 public int getLastRowIndex() { 310 return tableMetadata.getLastRowIndex(); 311 } 312 313 /** 314 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setLastRowIndex(int) 315 */ 316 public void setLastRowIndex(int lastRowIndex) { 317 tableMetadata.setLastRowIndex(lastRowIndex); 318 } 319 320 /** 321 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getSwitchToPageNumber() 322 */ 323 public int getSwitchToPageNumber() { 324 return tableMetadata.getSwitchToPageNumber(); 325 } 326 327 /** 328 * This method sets the switchToPageNumber attribute for the metadata 329 * 330 * @param switchToPageNumber 331 */ 332 protected void setSwitchToPageNumber(int switchToPageNumber) { 333 tableMetadata.setSwitchToPageNumber(switchToPageNumber); 334 } 335 336 /** 337 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getPreviouslySelectedObjectIdSet() 338 */ 339 public Set<String> getPreviouslySelectedObjectIdSet() { 340 return previouslySelectedObjectIdSet; 341 } 342 343 /** 344 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setPreviouslySelectedObjectIdSet(java.util.Set) 345 */ 346 public void setPreviouslySelectedObjectIdSet(Set<String> previouslySelectedObjectIds) { 347 this.previouslySelectedObjectIdSet = previouslySelectedObjectIds; 348 } 349 350 /** 351 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getSelectedObjectIdSet() 352 */ 353 public Set<String> getSelectedObjectIdSet() { 354 return selectedObjectIdSet; 355 } 356 357 /** 358 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setSelectedObjectIdSet(java.util.Set) 359 */ 360 public void setSelectedObjectIdSet(Set<String> selectedObjectIdSet) { 361 this.selectedObjectIdSet = selectedObjectIdSet; 362 } 363 364 /** 365 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getDisplayedObjectIdSet() 366 */ 367 public Set<String> getDisplayedObjectIdSet() { 368 return displayedObjectIdSet; 369 } 370 371 /** 372 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setDisplayedObjectIdSet(java.util.Set) 373 */ 374 public void setDisplayedObjectIdSet(Set<String> displayedObjectIdSet) { 375 this.displayedObjectIdSet = displayedObjectIdSet; 376 } 377 378 /** 379 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getCompositeObjectIdMap() 380 */ 381 public Map<String, String> getCompositeObjectIdMap() { 382 return compositeObjectIdMap; 383 } 384 385 /** 386 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setCompositeObjectIdMap(java.util.Map) 387 */ 388 public void setCompositeObjectIdMap(Map<String, String> compositeObjectIdMap) { 389 this.compositeObjectIdMap = compositeObjectIdMap; 390 } 391 392 /** 393 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getColumnToSortIndex() 394 */ 395 public int getColumnToSortIndex() { 396 return columnToSortIndex; 397 } 398 399 /** 400 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setColumnToSortIndex(int) 401 */ 402 public void setColumnToSortIndex(int columnToSortIndex) { 403 this.columnToSortIndex = columnToSortIndex; 404 } 405 406 /** 407 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getPreviouslySortedColumnIndex() 408 */ 409 public String getPreviouslySortedColumnIndex() { 410 return previouslySortedColumnIndex; 411 } 412 413 /** 414 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setPreviouslySortedColumnIndex(java.lang.String) 415 */ 416 public void setPreviouslySortedColumnIndex(String previouslySortedColumnIndex) { 417 this.previouslySortedColumnIndex = previouslySortedColumnIndex; 418 } 419 420 /** 421 * gets the name of the collection being looked up by the calling page. This value will be returned unmodified to the calling 422 * page (indicated by super.getBackLocation()), which should use it to determine in which collection the selected results will 423 * be returned. 424 * 425 * @return 426 */ 427 public String getLookedUpCollectionName() { 428 return lookedUpCollectionName; 429 } 430 431 /** 432 * sets the name of the collection being looked up by the calling page. This value will be returned unmodified to the calling 433 * page (indicated by super.getBackLocation()), which should use it to determine in which collection the selected results will 434 * be returned 435 * 436 * @param lookedUpCollectionName 437 */ 438 public void setLookedUpCollectionName(String lookedUpCollectionName) { 439 this.lookedUpCollectionName = lookedUpCollectionName; 440 } 441 442 /** 443 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getResultsActualSize() 444 */ 445 public int getResultsActualSize() { 446 return resultsActualSize; 447 } 448 449 /** 450 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setResultsActualSize(int) 451 */ 452 public void setResultsActualSize(int resultsActualSize) { 453 this.resultsActualSize = resultsActualSize; 454 } 455 456 /** 457 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getResultsLimitedSize() 458 */ 459 public int getResultsLimitedSize() { 460 return resultsLimitedSize; 461 } 462 463 /** 464 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setResultsLimitedSize(int) 465 */ 466 public void setResultsLimitedSize(int resultsLimitedSize) { 467 this.resultsLimitedSize = resultsLimitedSize; 468 } 469 470 /** 471 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#jumpToFirstPage(int, int) 472 */ 473 public void jumpToFirstPage(int listSize, int maxRowsPerPage) { 474 tableMetadata.jumpToFirstPage(listSize, maxRowsPerPage); 475 } 476 477 /** 478 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#jumpToLastPage(int, int) 479 */ 480 public void jumpToLastPage(int listSize, int maxRowsPerPage) { 481 tableMetadata.jumpToLastPage(listSize, maxRowsPerPage); 482 } 483 484 /** 485 * @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#jumpToPage(int, int, int) 486 */ 487 public void jumpToPage(int pageNumber, int listSize, int maxRowsPerPage) { 488 tableMetadata.jumpToPage(pageNumber, listSize, maxRowsPerPage); 489 } 490 491 }