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.ar.web.struts;
017    
018    import java.util.HashMap;
019    import java.util.Iterator;
020    import java.util.Map;
021    import java.util.StringTokenizer;
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.kfs.sys.businessobject.GeneralLedgerPendingEntry;
028    import org.kuali.kfs.sys.businessobject.lookup.LookupableSpringContext;
029    import org.kuali.kfs.sys.context.SpringContext;
030    import org.kuali.rice.kns.lookup.LookupUtils;
031    import org.kuali.rice.kns.lookup.Lookupable;
032    import org.kuali.rice.kns.service.BusinessObjectDictionaryService;
033    import org.kuali.rice.kns.web.struts.form.LookupForm;
034    import org.kuali.rice.kns.web.ui.Field;
035    import org.kuali.rice.kns.web.ui.Row;
036    
037    
038    /**
039     * This class is the action form for Customer Aging Reports.
040     */
041    public class CustomerAgingReportForm extends LookupForm {
042        private static final long serialVersionUID = 1L;
043    
044        private static final org.apache.commons.logging.Log LOG = org.apache.commons.logging.LogFactory.getLog(CustomerAgingReportForm.class);
045    
046        private String formKey;
047        private String backLocation;
048        private Map fields;
049        private String lookupableImplServiceName;
050        private String conversionFields;
051        private Map fieldConversions;
052        private String businessObjectClassName;
053        private Lookupable lookupable;
054        private Lookupable pendingEntryLookupable;
055        private boolean hideReturnLink = false;
056    
057        private String total0to30;
058        private String total31to60;
059        private String total61to90;
060        private String total91toSYSPR;
061        private String totalSYSPRplus1orMore;
062    
063    
064        /**
065         * Picks out business object name from the request to get retrieve a lookupable and set properties.
066         * 
067         * @see org.kuali.rice.kns.web.struts.form.LookupForm#populate(javax.servlet.http.HttpServletRequest)
068         */
069        public void populate(HttpServletRequest request) {
070            super.populate(request);
071    
072            try {
073                if (StringUtils.isBlank(request.getParameter(KFSConstants.LOOKUPABLE_IMPL_ATTRIBUTE_NAME)) && StringUtils.isBlank(getLookupableImplServiceName())) {
074    
075                    // get the business object class for the lookup
076                    String localBusinessObjectClassName = request.getParameter(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE);
077                    setBusinessObjectClassName(localBusinessObjectClassName);
078    
079                    if (StringUtils.isBlank(localBusinessObjectClassName)) {
080                        LOG.error("Business object class not passed to lookup.");
081                        throw new RuntimeException("Business object class not passed to lookup.");
082                    }
083    
084                    // call data dictionary service to get lookup impl for bo class
085                    String lookupImplID = SpringContext.getBean(BusinessObjectDictionaryService.class).getLookupableID(Class.forName(localBusinessObjectClassName));
086                    if (lookupImplID == null) {
087                        lookupImplID = "lookupable";
088                    }
089    
090                    setLookupableImplServiceName(lookupImplID);
091                }
092                setLookupable(LookupableSpringContext.getLookupable(getLookupableImplServiceName()));
093    
094                if (getLookupable() == null) {
095                    LOG.error("Lookup impl not found for lookup impl name " + getLookupableImplServiceName());
096                    throw new RuntimeException("Lookup impl not found for lookup impl name " + getLookupableImplServiceName());
097                }
098    
099                if (request.getParameter(KFSConstants.LOOKUPABLE_IMPL_ATTRIBUTE_NAME) != null) {
100                    setLookupableImplServiceName(request.getParameter(KFSConstants.LOOKUPABLE_IMPL_ATTRIBUTE_NAME));
101                }
102    
103                // check the doc form key is empty before setting so we don't override a restored lookup form
104                if (request.getAttribute(KFSConstants.DOC_FORM_KEY) != null && StringUtils.isBlank(this.getFormKey())) {
105                    setFormKey((String) request.getAttribute(KFSConstants.DOC_FORM_KEY));
106                }
107                else if (request.getParameter(KFSConstants.DOC_FORM_KEY) != null && StringUtils.isBlank(this.getFormKey())) {
108                    setFormKey(request.getParameter(KFSConstants.DOC_FORM_KEY));
109                }
110    
111                if (request.getParameter(KFSConstants.RETURN_LOCATION_PARAMETER) != null) {
112                    setBackLocation(request.getParameter(KFSConstants.RETURN_LOCATION_PARAMETER));
113                }
114                if (request.getParameter(KFSConstants.CONVERSION_FIELDS_PARAMETER) != null) {
115                    setConversionFields(request.getParameter(KFSConstants.CONVERSION_FIELDS_PARAMETER));
116                }
117    
118    
119                // init lookupable with bo class
120                getLookupable().setBusinessObjectClass(Class.forName(getBusinessObjectClassName()));
121                if (null != getPendingEntryLookupable()) {
122                    getPendingEntryLookupable().setBusinessObjectClass(GeneralLedgerPendingEntry.class);
123                }
124    
125                Map fieldValues = new HashMap();
126                Map formFields = getFields();
127                Class boClass = Class.forName(getBusinessObjectClassName());
128    //            LOG.info("\n\n\n\nBusiness Object class " + getBusinessObjectClassName() + " is found\n\n\n\n");
129                for (Iterator iter = getLookupable().getRows().iterator(); iter.hasNext();) {
130                    Row row = (Row) iter.next();
131    
132                    for (Iterator iterator = row.getFields().iterator(); iterator.hasNext();) {
133                        Field field = (Field) iterator.next();
134    
135                        // check whether form already has value for field
136                        if (formFields != null && formFields.containsKey(field.getPropertyName())) {
137                            field.setPropertyValue(formFields.get(field.getPropertyName()));
138                        }
139    
140                        // override values with request
141                        if (request.getParameter(field.getPropertyName()) != null) {
142                            field.setPropertyValue(request.getParameter(field.getPropertyName()));
143                        }
144    
145                        // force uppercase if necessary
146                        field.setPropertyValue(LookupUtils.forceUppercase(boClass, field.getPropertyName(), field.getPropertyValue()));
147    
148                        fieldValues.put(field.getPropertyName(), field.getPropertyValue());
149                    }
150                }
151                if (getLookupable().checkForAdditionalFields(fieldValues)) {
152                    for (Iterator iter = getLookupable().getRows().iterator(); iter.hasNext();) {
153                        Row row = (Row) iter.next();
154    
155                        for (Iterator iterator = row.getFields().iterator(); iterator.hasNext();) {
156                            Field field = (Field) iterator.next();
157    
158                            // check whether form already has value for field
159                            if (formFields != null && formFields.containsKey(field.getPropertyName())) {
160                                field.setPropertyValue(formFields.get(field.getPropertyName()));
161                                LOG.info("\n\n\n\n");
162                                LOG.info("field " + field.toString() + " = " + field.getPropertyValue() + " ***\n\n");
163                            }
164    
165                            // override values with request
166                            if (request.getParameter(field.getPropertyName()) != null) {
167                                field.setPropertyValue(request.getParameter(field.getPropertyName()));
168                            }
169                            fieldValues.put(field.getPropertyName(), field.getPropertyValue());
170                        }
171                    }
172                }
173                fieldValues.put(KFSConstants.DOC_FORM_KEY, this.getFormKey());
174                fieldValues.put(KFSConstants.BACK_LOCATION, this.getBackLocation());
175    
176                this.setFields(fieldValues);
177    
178                Map fieldConversionMap = new HashMap();
179                if (StringUtils.isNotEmpty(this.getConversionFields())) {
180                    if (this.getConversionFields().indexOf(",") > 0) {
181                        StringTokenizer token = new StringTokenizer(this.getConversionFields(), ",");
182                        while (token.hasMoreTokens()) {
183                            String element = token.nextToken();
184                            fieldConversionMap.put(element.substring(0, element.indexOf(":")), element.substring(element.indexOf(":") + 1));
185                        }
186                    }
187                    else {
188                        fieldConversionMap.put(this.getConversionFields().substring(0, this.getConversionFields().indexOf(":")), this.getConversionFields().substring(this.getConversionFields().indexOf(":") + 1));
189                    }
190                }
191                setFieldConversions(fieldConversionMap);
192                getLookupable().setFieldConversions(fieldConversionMap);
193                if (null != getPendingEntryLookupable()) {
194                    getPendingEntryLookupable().setFieldConversions(fieldConversionMap);
195                }
196            }
197            catch (ClassNotFoundException e) {
198                LOG.error("Business Object class " + getBusinessObjectClassName() + " not found");
199                throw new RuntimeException("Business Object class " + getBusinessObjectClassName() + " not found", e);
200            }
201        }
202    
203        /**
204         * @return Returns the lookupableImplServiceName.
205         */
206        public String getLookupableImplServiceName() {
207            return lookupableImplServiceName;
208        }
209    
210        /**
211         * @param lookupableImplServiceName The lookupableImplServiceName to set.
212         */
213        public void setLookupableImplServiceName(String lookupableImplServiceName) {
214            this.lookupableImplServiceName = lookupableImplServiceName;
215        }
216    
217    
218        /**
219         * @return Returns the backLocation.
220         */
221        public String getBackLocation() {
222            return backLocation;
223        }
224    
225        /**
226         * @param backLocation The backLocation to set.
227         */
228        public void setBackLocation(String backLocation) {
229            this.backLocation = backLocation;
230        }
231    
232        /**
233         * @return Returns the formKey.
234         */
235        public String getFormKey() {
236            return formKey;
237        }
238    
239        /**
240         * @param formKey The formKey to set.
241         */
242        public void setFormKey(String formKey) {
243            this.formKey = formKey;
244        }
245    
246        /**
247         * @return Returns the fields.
248         */
249        public Map getFields() {
250            return fields;
251        }
252    
253        /**
254         * @param fields The fields to set.
255         */
256        public void setFields(Map fields) {
257            this.fields = fields;
258        }
259    
260    
261        /**
262         * @return Returns the conversionFields.
263         */
264        public String getConversionFields() {
265            return conversionFields;
266        }
267    
268        /**
269         * @param conversionFields The conversionFields to set.
270         */
271        public void setConversionFields(String conversionFields) {
272            this.conversionFields = conversionFields;
273        }
274    
275        /**
276         * @return Returns the fieldConversions.
277         */
278        public Map getFieldConversions() {
279            return fieldConversions;
280        }
281    
282        /**
283         * @param fieldConversions The fieldConversions to set.
284         */
285        public void setFieldConversions(Map fieldConversions) {
286            this.fieldConversions = fieldConversions;
287        }
288    
289        /**
290         * @return Returns the businessObjectClassName.
291         */
292        public String getBusinessObjectClassName() {
293            return businessObjectClassName;
294        }
295    
296        /**
297         * @param businessObjectClassName The businessObjectClassName to set.
298         */
299        public void setBusinessObjectClassName(String businessObjectClassName) {
300            this.businessObjectClassName = businessObjectClassName;
301        }
302    
303    
304        /**
305         * @return Returns the lookupable.
306         */
307        public Lookupable getLookupable() {
308            return lookupable;
309        }
310    
311    
312        /**
313         * @param lookupable The lookupable to set.
314         */
315        public void setLookupable(Lookupable lookupable) {
316            this.lookupable = lookupable;
317        }
318    
319    
320        /**
321         * @return Returns the hideReturnLink.
322         */
323        public boolean isHideReturnLink() {
324            return hideReturnLink;
325        }
326    
327    
328        /**
329         * @param hideReturnLink The hideReturnLink to set.
330         */
331        public void setHideReturnLink(boolean hideReturnLink) {
332            this.hideReturnLink = hideReturnLink;
333        }
334    
335    
336        /**
337         * @param pendingEntryLookupable
338         */
339        public void setPendingEntryLookupable(Lookupable pendingEntryLookupable) {
340            this.pendingEntryLookupable = pendingEntryLookupable;
341        }
342    
343    
344        /**
345         * @return Returns the pendingEntryLookupable.
346         */
347        public Lookupable getPendingEntryLookupable() {
348            return this.pendingEntryLookupable;
349        }
350    
351        /**
352         * Gets the total0to30 attribute.
353         * 
354         * @return Returns the total0to30.
355         */
356        public String getTotal0to30() {
357            return total0to30;
358        }
359    
360        /**
361         * Sets the total0to30 attribute value.
362         * 
363         * @param total0to30 The total0to30 to set.
364         */
365        public void setTotal0to30(String total0to30) {
366            this.total0to30 = total0to30;
367        }
368    
369        /**
370         * Gets the total31to60 attribute.
371         * 
372         * @return Returns the total31to60.
373         */
374        public String getTotal31to60() {
375            return total31to60;
376        }
377    
378        /**
379         * Sets the total31to60 attribute value.
380         * 
381         * @param total31to60 The total31to60 to set.
382         */
383        public void setTotal31to60(String total31to60) {
384            this.total31to60 = total31to60;
385        }
386    
387        /**
388         * Gets the total61to90 attribute.
389         * 
390         * @return Returns the total61to90.
391         */
392        public String getTotal61to90() {
393            return total61to90;
394        }
395    
396        /**
397         * Sets the total61to90 attribute value.
398         * 
399         * @param total61to90 The total61to90 to set.
400         */
401        public void setTotal61to90(String total61to90) {
402            this.total61to90 = total61to90;
403        }
404    
405        /**
406         * Gets the total91toSYSPR attribute.
407         * 
408         * @return Returns the total91toSYSPR.
409         */
410        public String getTotal91toSYSPR() {
411            return total91toSYSPR;
412        }
413    
414        /**
415         * Sets the total91toSYSPR attribute value.
416         * 
417         * @param total91toSYSPR The total91toSYSPR to set.
418         */
419        public void setTotal91toSYSPR(String total91toSYSPR) {
420            this.total91toSYSPR = total91toSYSPR;
421        }
422    
423        /**
424         * Gets the totalSYSPRplus1orMore attribute.
425         * 
426         * @return Returns the totalSYSPRplus1orMore.
427         */
428        public String getTotalSYSPRplus1orMore() {
429            return totalSYSPRplus1orMore;
430        }
431    
432        /**
433         * Sets the totalSYSPRplus1orMore attribute value.
434         * 
435         * @param totalSYSPRplus1orMore The totalSYSPRplus1orMore to set.
436         */
437        public void setTotalSYSPRplus1orMore(String totalSYSPRplus1orMore) {
438            this.totalSYSPRplus1orMore = totalSYSPRplus1orMore;
439        }
440    
441    
442    }