/*
* 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.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.gl.GeneralLedgerConstants;
import org.kuali.kfs.gl.businessobject.Entry;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry;
import org.kuali.kfs.sys.businessobject.lookup.LookupableSpringContext;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.kns.lookup.Lookupable;
import org.kuali.rice.kns.service.BusinessObjectDictionaryService;
import org.kuali.rice.kns.web.struts.form.LookupForm;
import org.kuali.rice.kns.web.ui.Field;
import org.kuali.rice.kns.web.ui.Row;
import org.kuali.rice.krad.bo.BusinessObject;
/**
* This class is the action form for balance inquiries.
*/
public class BalanceInquiryForm extends LookupForm {
private static final long serialVersionUID = 1L;
private static final org.apache.commons.logging.Log LOG = org.apache.commons.logging.LogFactory.getLog(BalanceInquiryForm.class);
private String formKey;
private String backLocation;
private Map fields;
private String lookupableImplServiceName;
private String conversionFields;
private Map fieldConversions;
private String businessObjectClassName;
private Lookupable lookupable;
private Lookupable pendingEntryLookupable;
private boolean hideReturnLink = false;
/**
* Picks out business object name from the request to get retrieve a lookupable and set properties.
*
* @see org.kuali.rice.kns.web.struts.form.LookupForm#populate(javax.servlet.http.HttpServletRequest)
*
* KRAD Conversion: Lookupable performs customization of the fields and check for additional fields.
*
* Fields are in data dictionary for bo Balance.
*/
public void populate(HttpServletRequest request) {
super.populate(request);
try {
if (StringUtils.isBlank(request.getParameter(KFSConstants.LOOKUPABLE_IMPL_ATTRIBUTE_NAME)) && StringUtils.isBlank(getLookupableImplServiceName())) {
// get the business object class for the lookup
String localBusinessObjectClassName = request.getParameter(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE);
setBusinessObjectClassName(localBusinessObjectClassName);
if (StringUtils.isBlank(localBusinessObjectClassName)) {
LOG.error("Business object class not passed to lookup.");
throw new RuntimeException("Business object class not passed to lookup.");
}
// call data dictionary service to get lookup impl for bo class
String lookupImplID = SpringContext.getBean(BusinessObjectDictionaryService.class).getLookupableID(Class.forName(localBusinessObjectClassName));
if (lookupImplID == null) {
lookupImplID = "lookupable";
}
setLookupableImplServiceName(lookupImplID);
}
setLookupable(LookupableSpringContext.getLookupable(getLookupableImplServiceName()));
if (getLookupable() == null) {
LOG.error("Lookup impl not found for lookup impl name " + getLookupableImplServiceName());
throw new RuntimeException("Lookup impl not found for lookup impl name " + getLookupableImplServiceName());
}
// (laran) I put this here to allow the Exception to be thrown if the localLookupable is null.
if (Entry.class.getName().equals(getBusinessObjectClassName())) {
setPendingEntryLookupable(LookupableSpringContext.getLookupable(GeneralLedgerConstants.LookupableBeanKeys.PENDING_ENTRY));
}
if (request.getParameter(KFSConstants.LOOKUPABLE_IMPL_ATTRIBUTE_NAME) != null) {
setLookupableImplServiceName(request.getParameter(KFSConstants.LOOKUPABLE_IMPL_ATTRIBUTE_NAME));
}
// check the doc form key is empty before setting so we don't override a restored lookup form
if (request.getAttribute(KFSConstants.DOC_FORM_KEY) != null && StringUtils.isBlank(this.getFormKey())) {
setFormKey((String) request.getAttribute(KFSConstants.DOC_FORM_KEY));
}
else if (request.getParameter(KFSConstants.DOC_FORM_KEY) != null && StringUtils.isBlank(this.getFormKey())) {
setFormKey(request.getParameter(KFSConstants.DOC_FORM_KEY));
}
if (request.getParameter(KFSConstants.RETURN_LOCATION_PARAMETER) != null) {
setBackLocation(request.getParameter(KFSConstants.RETURN_LOCATION_PARAMETER));
}
if (request.getParameter(KFSConstants.CONVERSION_FIELDS_PARAMETER) != null) {
setConversionFields(request.getParameter(KFSConstants.CONVERSION_FIELDS_PARAMETER));
}
// init lookupable with bo class
getLookupable().setBusinessObjectClass((Class<? extends BusinessObject>)Class.forName(getBusinessObjectClassName()));
if (null != getPendingEntryLookupable()) {
getPendingEntryLookupable().setBusinessObjectClass(GeneralLedgerPendingEntry.class);
}
Map fieldValues = new HashMap();
Map formFields = getFields();
Class boClass = Class.forName(getBusinessObjectClassName());
for (Iterator iter = getLookupable().getRows().iterator(); iter.hasNext();) {
Row row = (Row) iter.next();
for (Iterator iterator = row.getFields().iterator(); iterator.hasNext();) {
Field field = (Field) iterator.next();
// check whether form already has value for field
if (formFields != null && formFields.containsKey(field.getPropertyName())) {
field.setPropertyValue(formFields.get(field.getPropertyName()));
}
// override values with request
if (request.getParameter(field.getPropertyName()) != null) {
field.setPropertyValue(request.getParameter(field.getPropertyName()));
}
// force uppercase if necessary
field.setPropertyValue(org.kuali.rice.krad.lookup.LookupUtils.forceUppercase(boClass, field.getPropertyName(), field.getPropertyValue()));
fieldValues.put(field.getPropertyName(), field.getPropertyValue());
}
}
if (getLookupable().checkForAdditionalFields(fieldValues)) {
for (Iterator iter = getLookupable().getRows().iterator(); iter.hasNext();) {
Row row = (Row) iter.next();
for (Iterator iterator = row.getFields().iterator(); iterator.hasNext();) {
Field field = (Field) iterator.next();
// check whether form already has value for field
if (formFields != null && formFields.containsKey(field.getPropertyName())) {
field.setPropertyValue(formFields.get(field.getPropertyName()));
}
// override values with request
if (request.getParameter(field.getPropertyName()) != null) {
field.setPropertyValue(request.getParameter(field.getPropertyName()));
}
fieldValues.put(field.getPropertyName(), field.getPropertyValue());
}
}
}
fieldValues.put(KFSConstants.DOC_FORM_KEY, this.getFormKey());
fieldValues.put(KFSConstants.BACK_LOCATION, this.getBackLocation());
this.setFields(fieldValues);
Map fieldConversionMap = new HashMap();
if (StringUtils.isNotEmpty(this.getConversionFields())) {
if (this.getConversionFields().indexOf(",") > 0) {
StringTokenizer token = new StringTokenizer(this.getConversionFields(), ",");
while (token.hasMoreTokens()) {
String element = token.nextToken();
fieldConversionMap.put(element.substring(0, element.indexOf(":")), element.substring(element.indexOf(":") + 1));
}
}
else {
fieldConversionMap.put(this.getConversionFields().substring(0, this.getConversionFields().indexOf(":")), this.getConversionFields().substring(this.getConversionFields().indexOf(":") + 1));
}
}
setFieldConversions(fieldConversionMap);
getLookupable().setFieldConversions(fieldConversionMap);
if (null != getPendingEntryLookupable()) {
getPendingEntryLookupable().setFieldConversions(fieldConversionMap);
}
}
catch (ClassNotFoundException e) {
LOG.error("Business Object class " + getBusinessObjectClassName() + " not found");
throw new RuntimeException("Business Object class " + getBusinessObjectClassName() + " not found", e);
}
}
/**
* @return Returns the lookupableImplServiceName.
*/
public String getLookupableImplServiceName() {
return lookupableImplServiceName;
}
/**
* @param lookupableImplServiceName The lookupableImplServiceName to set.
*/
public void setLookupableImplServiceName(String lookupableImplServiceName) {
this.lookupableImplServiceName = lookupableImplServiceName;
}
/**
* @return Returns the backLocation.
*/
public String getBackLocation() {
return backLocation;
}
/**
* @param backLocation The backLocation to set.
*/
public void setBackLocation(String backLocation) {
this.backLocation = backLocation;
}
/**
* @return Returns the formKey.
*/
public String getFormKey() {
return formKey;
}
/**
* @param formKey The formKey to set.
*/
public void setFormKey(String formKey) {
this.formKey = formKey;
}
/**
* @return Returns the fields.
*/
public Map getFields() {
return fields;
}
/**
* @param fields The fields to set.
*/
public void setFields(Map fields) {
this.fields = fields;
}
/**
* @return Returns the conversionFields.
*/
public String getConversionFields() {
return conversionFields;
}
/**
* @param conversionFields The conversionFields to set.
*/
public void setConversionFields(String conversionFields) {
this.conversionFields = conversionFields;
}
/**
* @return Returns the fieldConversions.
*/
public Map getFieldConversions() {
return fieldConversions;
}
/**
* @param fieldConversions The fieldConversions to set.
*/
public void setFieldConversions(Map fieldConversions) {
this.fieldConversions = fieldConversions;
}
/**
* @return Returns the businessObjectClassName.
*/
public String getBusinessObjectClassName() {
return businessObjectClassName;
}
/**
* @param businessObjectClassName The businessObjectClassName to set.
*/
public void setBusinessObjectClassName(String businessObjectClassName) {
this.businessObjectClassName = businessObjectClassName;
}
/**
* @return Returns the lookupable.
*/
public Lookupable getLookupable() {
return lookupable;
}
/**
* @param lookupable The lookupable to set.
*/
public void setLookupable(Lookupable lookupable) {
this.lookupable = lookupable;
}
/**
* @return Returns the hideReturnLink.
*/
public boolean isHideReturnLink() {
return hideReturnLink;
}
/**
* @param hideReturnLink The hideReturnLink to set.
*/
public void setHideReturnLink(boolean hideReturnLink) {
this.hideReturnLink = hideReturnLink;
}
/**
* @param pendingEntryLookupable
*/
public void setPendingEntryLookupable(Lookupable pendingEntryLookupable) {
this.pendingEntryLookupable = pendingEntryLookupable;
}
/**
* @return Returns the pendingEntryLookupable.
*/
public Lookupable getPendingEntryLookupable() {
return this.pendingEntryLookupable;
}
}