/*
* 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.gl.web.struts;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.rice.kns.lookup.LookupUtils;
import org.kuali.rice.kns.web.struts.form.KualiTableRenderFormMetadata;
import org.kuali.rice.kns.web.struts.form.LookupForm;
/**
* This class is the action form for balance inquiry lookup results
*
*/
public class BalanceInquiryLookupResults extends LookupForm implements LookupResultsSelectable {
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BalanceInquiryLookupResults.class);
private KualiTableRenderFormMetadata tableMetadata;
private String lookupResultsSequenceNumber;
/**
* The number of rows that match the query criteria
*/
private int resultsActualSize;
/**
* The number of rows that match the query criteria or the max results limit size (if applicable), whichever is less
*/
private int resultsLimitedSize;
/**
* when the looked results screen was rendered, the index of the column that the results were sorted on. -1 for unknown, index
* numbers starting at 0
*/
private String previouslySortedColumnIndex;
/**
* Comment for <code>columnToSortIndex</code>
*/
private int columnToSortIndex;
/**
* the name of the collection being looked up by the calling page. This value will be returned unmodified to the calling page
* (indicated by super.getBackLocation()), which should use it to determine in which collection the selected results will be
* returned.
*/
private String lookedUpCollectionName;
/**
* Those object IDs that were selected before the current page is rendered
*/
private Set<String> previouslySelectedObjectIdSet;
/**
* Those object IDs that are rendered on the current page
*/
private Set<String> displayedObjectIdSet;
/**
* Those object IDs that are selected/checked on the current page
*/
private Set<String> selectedObjectIdSet;
/**
* The object IDs that are selected after the struts action is complete; the obj IDs in the keys of this Map will be considered
* checked in the UI
*/
private Map<String, String> compositeObjectIdMap;
public BalanceInquiryLookupResults() {
tableMetadata = new KualiTableRenderFormMetadata();
}
protected String getMethodToCall(HttpServletRequest request) {
return request.getParameter(KFSConstants.DISPATCH_REQUEST_PARAMETER);
}
/**
* Named appropriately as it is intended to be called from a <code>{@link LookupForm}</code>
*
* @param request HttpServletRequest
*/
public void populate(HttpServletRequest request) {
super.populate(request);
if (StringUtils.isNotBlank(request.getParameter(KFSConstants.TableRenderConstants.VIEWED_PAGE_NUMBER))) {
setViewedPageNumber(Integer.parseInt(request.getParameter(KFSConstants.TableRenderConstants.VIEWED_PAGE_NUMBER)));
}
else {
setViewedPageNumber(0); // first page is page 0
}
if (KFSConstants.TableRenderConstants.SWITCH_TO_PAGE_METHOD.equals(getMethodToCall(request))) {
// look for the page number to switch to
setSwitchToPageNumber(-1);
// the param we're looking for looks like: methodToCall.switchToPage.1.x , where 1 is the page nbr
String paramPrefix = KFSConstants.DISPATCH_REQUEST_PARAMETER + "." + KFSConstants.TableRenderConstants.SWITCH_TO_PAGE_METHOD + ".";
for (Enumeration i = request.getParameterNames(); i.hasMoreElements();) {
String parameterName = (String) i.nextElement();
if (parameterName.startsWith(paramPrefix) && parameterName.endsWith(".x")) {
String switchToPageNumberStr = StringUtils.substringBetween(parameterName, paramPrefix, ".");
setSwitchToPageNumber(Integer.parseInt(switchToPageNumberStr));
}
}
if (getSwitchToPageNumber() == -1) {
throw new RuntimeException("Couldn't find page number");
}
}
if (KFSConstants.TableRenderConstants.SORT_METHOD.equals(getMethodToCall(request))) {
setColumnToSortIndex(-1);
// the param we're looking for looks like: methodToCall.sort.1.x , where 1 is the column to sort on
String paramPrefix = KFSConstants.DISPATCH_REQUEST_PARAMETER + "." + KFSConstants.TableRenderConstants.SORT_METHOD + ".";
for (Enumeration i = request.getParameterNames(); i.hasMoreElements();) {
String parameterName = (String) i.nextElement();
if (parameterName.startsWith(paramPrefix) && parameterName.endsWith(".x")) {
String columnToSortStr = StringUtils.substringBetween(parameterName, paramPrefix, ".");
setColumnToSortIndex(Integer.parseInt(columnToSortStr));
}
}
if (getColumnToSortIndex() == -1) {
throw new RuntimeException("Couldn't find column to sort");
}
}
setPreviouslySelectedObjectIdSet(parsePreviouslySelectedObjectIds(request));
setSelectedObjectIdSet(parseSelectedObjectIdSet(request));
setDisplayedObjectIdSet(parseDisplayedObjectIdSet(request));
setSearchUsingOnlyPrimaryKeyValues(parseSearchUsingOnlyPrimaryKeyValues(request));
if (isSearchUsingOnlyPrimaryKeyValues()) {
setPrimaryKeyFieldLabels(getLookupable().getPrimaryKeyFieldLabels());
}
}
/**
* This method converts the composite object IDs into a String
*
* @return String for composite list of selected object IDs
*/
public String getCompositeSelectedObjectIds() {
return LookupUtils.convertSetOfObjectIdsToString(getCompositeObjectIdMap().keySet());
}
/**
* Parses a list of previously selected object IDs
*
* @param request
* @return Set containing list of previously selected object IDs
*/
protected Set<String> parsePreviouslySelectedObjectIds(HttpServletRequest request) {
String previouslySelectedObjectIds = request.getParameter(KFSConstants.MULTIPLE_VALUE_LOOKUP_PREVIOUSLY_SELECTED_OBJ_IDS_PARAM);
return LookupUtils.convertStringOfObjectIdsToSet(previouslySelectedObjectIds);
}
/**
* Parses a list of selected object IDs
*
* @param request
* @return Set containing list of selected object IDs
*/
protected Set<String> parseSelectedObjectIdSet(HttpServletRequest request) {
Set<String> set = new HashSet<String>();
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
if (paramName.startsWith(KFSConstants.MULTIPLE_VALUE_LOOKUP_SELECTED_OBJ_ID_PARAM_PREFIX) && StringUtils.isNotBlank(request.getParameter(paramName))) {
set.add(StringUtils.substringAfter(paramName, KFSConstants.MULTIPLE_VALUE_LOOKUP_SELECTED_OBJ_ID_PARAM_PREFIX));
}
}
return set;
}
/**
* Parses a list of displayed object IDs
*
* @param request
* @return Set containing list of displayed object IDs
*/
protected Set<String> parseDisplayedObjectIdSet(HttpServletRequest request) {
Set<String> set = new HashSet<String>();
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
if (paramName.startsWith(KFSConstants.MULTIPLE_VALUE_LOOKUP_DISPLAYED_OBJ_ID_PARAM_PREFIX) && StringUtils.isNotBlank(request.getParameter(paramName))) {
set.add(StringUtils.substringAfter(paramName, KFSConstants.MULTIPLE_VALUE_LOOKUP_DISPLAYED_OBJ_ID_PARAM_PREFIX));
}
}
return set;
}
/**
* Iterates through the request params, looks for the parameter representing the method to call in the format like
* methodToCall.sort.1.(::;true;::).x, and returns the boolean value in the (::; and ;::) delimiters.
*
* @see MultipleValueLookupForm#parseSearchUsingOnlyPrimaryKeyValues(String)
* @param request
* @return
*/
protected boolean parseSearchUsingOnlyPrimaryKeyValues(HttpServletRequest request) {
// the param we're looking for looks like: methodToCall.sort.1.(::;true;::).x , we want to parse out the "true" component
String paramPrefix = KFSConstants.DISPATCH_REQUEST_PARAMETER + "." + getMethodToCall(request) + ".";
for (Enumeration i = request.getParameterNames(); i.hasMoreElements();) {
String parameterName = (String) i.nextElement();
if (parameterName.startsWith(paramPrefix) && parameterName.endsWith(".x")) {
return parseSearchUsingOnlyPrimaryKeyValues(parameterName);
}
}
// maybe doing an initial search, so no value will be present
return false;
}
/**
* Parses the method to call parameter passed in as a post parameter The parameter should be something like
* methodToCall.sort.1.(::;true;::).x, this method will return the value between (::; and ;::) as a boolean
*
* @param methodToCallParam the method to call in a format described above
* @return the value between the delimiters, false if there are no delimiters
*/
protected boolean parseSearchUsingOnlyPrimaryKeyValues(String methodToCallParam) {
String searchUsingOnlyPrimaryKeyValuesStr = StringUtils.substringBetween(methodToCallParam, KFSConstants.METHOD_TO_CALL_PARM12_LEFT_DEL, KFSConstants.METHOD_TO_CALL_PARM12_RIGHT_DEL);
if (StringUtils.isBlank(searchUsingOnlyPrimaryKeyValuesStr)) {
return false;
}
return Boolean.parseBoolean(searchUsingOnlyPrimaryKeyValuesStr);
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getViewedPageNumber()
*/
public int getViewedPageNumber() {
return tableMetadata.getViewedPageNumber();
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setViewedPageNumber(int)
*/
public void setViewedPageNumber(int pageNumberBeingViewedForMultivalueLookups) {
tableMetadata.setViewedPageNumber(pageNumberBeingViewedForMultivalueLookups);
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getLookupResultsSequenceNumber()
*/
public String getLookupResultsSequenceNumber() {
return lookupResultsSequenceNumber;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setLookupResultsSequenceNumber(java.lang.String)
*/
public void setLookupResultsSequenceNumber(String lookupResultSequenceNumber) {
this.lookupResultsSequenceNumber = lookupResultSequenceNumber;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getTotalNumberOfPages()
*/
public int getTotalNumberOfPages() {
return tableMetadata.getTotalNumberOfPages();
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setTotalNumberOfPages(int)
*/
public void setTotalNumberOfPages(int totalNumberOfPages) {
tableMetadata.setTotalNumberOfPages(totalNumberOfPages);
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getFirstRowIndex()
*/
public int getFirstRowIndex() {
return tableMetadata.getFirstRowIndex();
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setFirstRowIndex(int)
*/
public void setFirstRowIndex(int firstRowIndex) {
tableMetadata.setFirstRowIndex(firstRowIndex);
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getLastRowIndex()
*/
public int getLastRowIndex() {
return tableMetadata.getLastRowIndex();
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setLastRowIndex(int)
*/
public void setLastRowIndex(int lastRowIndex) {
tableMetadata.setLastRowIndex(lastRowIndex);
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getSwitchToPageNumber()
*/
public int getSwitchToPageNumber() {
return tableMetadata.getSwitchToPageNumber();
}
/**
* This method sets the switchToPageNumber attribute for the metadata
*
* @param switchToPageNumber
*/
protected void setSwitchToPageNumber(int switchToPageNumber) {
tableMetadata.setSwitchToPageNumber(switchToPageNumber);
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getPreviouslySelectedObjectIdSet()
*/
public Set<String> getPreviouslySelectedObjectIdSet() {
return previouslySelectedObjectIdSet;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setPreviouslySelectedObjectIdSet(java.util.Set)
*/
public void setPreviouslySelectedObjectIdSet(Set<String> previouslySelectedObjectIds) {
this.previouslySelectedObjectIdSet = previouslySelectedObjectIds;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getSelectedObjectIdSet()
*/
public Set<String> getSelectedObjectIdSet() {
return selectedObjectIdSet;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setSelectedObjectIdSet(java.util.Set)
*/
public void setSelectedObjectIdSet(Set<String> selectedObjectIdSet) {
this.selectedObjectIdSet = selectedObjectIdSet;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getDisplayedObjectIdSet()
*/
public Set<String> getDisplayedObjectIdSet() {
return displayedObjectIdSet;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setDisplayedObjectIdSet(java.util.Set)
*/
public void setDisplayedObjectIdSet(Set<String> displayedObjectIdSet) {
this.displayedObjectIdSet = displayedObjectIdSet;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getCompositeObjectIdMap()
*/
public Map<String, String> getCompositeObjectIdMap() {
return compositeObjectIdMap;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setCompositeObjectIdMap(java.util.Map)
*/
public void setCompositeObjectIdMap(Map<String, String> compositeObjectIdMap) {
this.compositeObjectIdMap = compositeObjectIdMap;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getColumnToSortIndex()
*/
public int getColumnToSortIndex() {
return columnToSortIndex;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setColumnToSortIndex(int)
*/
public void setColumnToSortIndex(int columnToSortIndex) {
this.columnToSortIndex = columnToSortIndex;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getPreviouslySortedColumnIndex()
*/
public String getPreviouslySortedColumnIndex() {
return previouslySortedColumnIndex;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setPreviouslySortedColumnIndex(java.lang.String)
*/
public void setPreviouslySortedColumnIndex(String previouslySortedColumnIndex) {
this.previouslySortedColumnIndex = previouslySortedColumnIndex;
}
/**
* gets the name of the collection being looked up by the calling page. This value will be returned unmodified to the calling
* page (indicated by super.getBackLocation()), which should use it to determine in which collection the selected results will
* be returned.
*
* @return
*/
public String getLookedUpCollectionName() {
return lookedUpCollectionName;
}
/**
* sets the name of the collection being looked up by the calling page. This value will be returned unmodified to the calling
* page (indicated by super.getBackLocation()), which should use it to determine in which collection the selected results will
* be returned
*
* @param lookedUpCollectionName
*/
public void setLookedUpCollectionName(String lookedUpCollectionName) {
this.lookedUpCollectionName = lookedUpCollectionName;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getResultsActualSize()
*/
public int getResultsActualSize() {
return resultsActualSize;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setResultsActualSize(int)
*/
public void setResultsActualSize(int resultsActualSize) {
this.resultsActualSize = resultsActualSize;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#getResultsLimitedSize()
*/
public int getResultsLimitedSize() {
return resultsLimitedSize;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#setResultsLimitedSize(int)
*/
public void setResultsLimitedSize(int resultsLimitedSize) {
this.resultsLimitedSize = resultsLimitedSize;
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#jumpToFirstPage(int, int)
*/
public void jumpToFirstPage(int listSize, int maxRowsPerPage) {
tableMetadata.jumpToFirstPage(listSize, maxRowsPerPage);
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#jumpToLastPage(int, int)
*/
public void jumpToLastPage(int listSize, int maxRowsPerPage) {
tableMetadata.jumpToLastPage(listSize, maxRowsPerPage);
}
/**
* @see org.kuali.kfs.gl.web.struts.LookupResultsSelectable#jumpToPage(int, int, int)
*/
public void jumpToPage(int pageNumber, int listSize, int maxRowsPerPage) {
tableMetadata.jumpToPage(pageNumber, listSize, maxRowsPerPage);
}
}