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    }