gt:         if (accountsReceivableModuleService == null) {
context: /*
   * 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.module.tem.businessobject.lookup;
  
  import org.apache.commons.lang.StringUtils;
  import org.apache.log4j.Logger;
  import org.kuali.kfs.integration.ar.AccountsReceivableCustomerAddress;
  import org.kuali.kfs.integration.ar.AccountsReceivableModuleService;
  import org.kuali.kfs.module.tem.TemPropertyConstants;
  import org.kuali.kfs.module.tem.businessobject.TemProfileAddress;
  import org.kuali.kfs.module.tem.dataaccess.TravelerDao;
  import org.kuali.kfs.module.tem.service.TravelerService;
  import org.kuali.kfs.sys.KFSConstants;
  import org.kuali.kfs.sys.KFSPropertyConstants;
  import org.kuali.kfs.sys.context.SpringContext;
  import org.kuali.rice.core.api.datetime.DateTimeService;
  import org.kuali.rice.kim.api.identity.IdentityService;
  import org.kuali.rice.kim.api.identity.principal.Principal;
  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
  import org.kuali.rice.kim.impl.identity.address.EntityAddressBo;
  import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl;
  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;
  import org.kuali.rice.krad.lookup.CollectionIncomplete;
  import org.kuali.rice.krad.util.BeanPropertyComparator;
  import org.kuali.rice.krad.util.ObjectUtils;
  
  import java.sql.Timestamp;
  import java.util.ArrayList;
  import java.util.Collection;
  import java.util.Collections;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Map;
  import java.util.Map.Entry;
  
  public class TemProfileAddressLookupableHelperServiceImpl extends KualiLookupableHelperServiceImpl {
  
      public static Logger LOG = Logger.getLogger(TemProfileAddressLookupableHelperServiceImpl.class);
  
      /**
  	 * Comment for <code>serialVersionUID</code>
  	 */
  	private static final long serialVersionUID = 5438499177869581678L;
  	private TravelerDao travelerDao;
      private TravelerService travelerService;
  	private IdentityService identityService;
  	private AccountsReceivableModuleService accountsReceivableModuleService;
      private Map<String, String> temProfileAddressToKimAddress;
      private Map<String, String> temProfileAddressToCustomerAddress;
  
  	/**
       * @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#performLookup(org.kuali.rice.kns.web.struts.form.LookupForm, java.util.Collection, boolean)
       */
      @Override
      public Collection performLookup(LookupForm lookupForm, Collection resultTable, boolean bounded) {
          lookupForm.setSuppressActions(false);
          lookupForm.setSupplementalActionsEnabled(true);
          lookupForm.setHideReturnLink(false);
          lookupForm.setShowMaintenanceLinks(true);
          return super.performLookup(lookupForm, resultTable, bounded);
      }
  
  
  	/**
  	 * @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#performClear(org.kuali.rice.kns.web.struts.form.LookupForm)
  	 */
  	@Override
  	public void performClear(LookupForm arg0) {
  		for (Iterator iter = this.getRows().iterator(); iter.hasNext();) {
  			 Row row = (Row) iter.next();
  			 for (Iterator iterator = row.getFields().iterator(); iterator.hasNext();) {
  				 Field field = (Field) iterator.next();
  
  				 if (field.isSecure()) {
  					 field.setSecure(false);
  					 field.setDisplayMaskValue(null);
  					 field.setEncryptedValue(null);
  				 }
  
  				if (!field.getFieldType().equals(Field.RADIO) && !field.getFieldType().equals(Field.HIDDEN)) {
  					field.setPropertyValue(field.getDefaultValue());
  				}
  			}
  		 }
  	}
  
  
      /**
       * @see org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl#getSearchResults(java.util.Map)
       */
      @Override
      public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) {
  
          List<TemProfileAddress> searchResults = new ArrayList<TemProfileAddress>();
  
          if (fieldValues.containsKey(TemPropertyConstants.TemProfileProperties.PRINCIPAL_ID) && !StringUtils.isEmpty(fieldValues.get(TemPropertyConstants.TemProfileProperties.PRINCIPAL_ID))) {
          	final Map<String, String> kimFieldsForLookup = this.getPersonFieldValues(fieldValues);
          	kimFieldsForLookup.put(KFSPropertyConstants.KUALI_USER_PERSON_ACTIVE_INDICATOR, KFSConstants.ACTIVE_INDICATOR);
  
              List<EntityAddressBo> addresses = (List<EntityAddressBo>) getLookupService().findCollectionBySearchHelper(EntityAddressBo.class, kimFieldsForLookup, false);
  
          	for (EntityAddressBo address : addresses) {
          		TemProfileAddress temAddress = getTravelerService().convertToTemProfileAddressFromKimAddress(address);
          		temAddress.setPrincipalId(fieldValues.get(TemPropertyConstants.TemProfileProperties.PRINCIPAL_ID));
                  searchResults.add(temAddress);
              }
          }
  
          if (searchResults.isEmpty() && fieldValues.containsKey(TemPropertyConstants.TemProfileProperties.CUSTOMER_NUMBER) && !StringUtils.isEmpty(fieldValues.get(TemPropertyConstants.TemProfileProperties.CUSTOMER_NUMBER))) {
          	final Map<String, String> customerFieldsForLookup = this.getCustomerFieldValues(fieldValues);
  
              LOG.debug("Using fieldsForLookup "+ customerFieldsForLookup);
  
              Collection<AccountsReceivableCustomerAddress> customerAddresses = getAccountsReceivableModuleService().searchForCustomerAddresses(customerFieldsForLookup);
  
          	boolean active;
              for (AccountsReceivableCustomerAddress customerAddress : customerAddresses) {
              	active = true;
              	if (ObjectUtils.isNotNull(customerAddress)) {
                      if (ObjectUtils.isNotNull(customerAddress.getCustomerAddressEndDate())) {
                          Timestamp currentDateTimestamp = new Timestamp(SpringContext.getBean(DateTimeService.class).getCurrentDate().getTime());
                          Timestamp addressEndDateTimestamp = new Timestamp(customerAddress.getCustomerAddressEndDate().getTime());
                          if (addressEndDateTimestamp.before(currentDateTimestamp)) {
                          	active = false;
                          }
                      }
                  }
  
              	if(active) {
              		searchResults.add(getTravelerService().convertToTemProfileAddressFromCustomer(customerAddress));
              	}
              }
          }
  
          CollectionIncomplete results = new CollectionIncomplete(searchResults, Long.valueOf(searchResults.size()));
  
          // sort list if default sort column given
          List<String> defaultSortColumns = getDefaultSortColumns();
          if (defaultSortColumns.size() > 0) {
              Collections.sort(results, new BeanPropertyComparator(defaultSortColumns, true));
          }
  
          return results;
      }
  
      /**
       * Generates a {@link Map} of field values where object properties are mapped to values for
       * search purposes.
       *
       * @param fieldValues original field values passed to the lookup
       * @return Map of values
       */
      protected Map<String, String> getCustomerFieldValues(final Map<String, String> fieldValues) {
      	Map<String, String> customerFieldValues = new HashMap<String, String>();
  
      	for(Entry<String, String> entry : fieldValues.entrySet()) {
      		if(temProfileAddressToCustomerAddress.containsKey(entry.getKey()) && !StringUtils.isEmpty(entry.getValue())) {
      			customerFieldValues.put(temProfileAddressToCustomerAddress.get(entry.getKey()), entry.getValue());
      		}
      	}
  
          return customerFieldValues;
      }
  
      /**
       * Generates a {@link Map} of field values where object properties are mapped to values for
       * search purposes.
       *
       * @param fieldValues original field values passed to the lookup
       * @return Map of values
       */
      protected Map<String, String> getPersonFieldValues(final Map<String, String> fieldValues) {
      	Map<String, String> kimFieldValues = new HashMap<String, String>();
  
      	for(Entry<String, String> entry : fieldValues.entrySet()) {
      		if (entry.getKey().equalsIgnoreCase(TemPropertyConstants.TemProfileProperties.PRINCIPAL_ID) && !StringUtils.isEmpty(entry.getValue())) {
      	    	Principal principal = this.getIdentityService().getPrincipal(entry.getValue());
      			kimFieldValues.put(temProfileAddressToKimAddress.get(entry.getKey()), principal.getEntityId());
      		}
      		else if(temProfileAddressToKimAddress.containsKey(entry.getKey()) && !StringUtils.isEmpty(entry.getValue())) {
      			kimFieldValues.put(temProfileAddressToKimAddress.get(entry.getKey()), entry.getValue());
      		}
      	}
  
          return kimFieldValues;
      }
  
  
  	/**
  	 * Sets the travelerDao attribute value.
  	 * @param travelerDao The travelerDao to set.
  	 */
  	public void setTravelerDao(TravelerDao travelerDao) {
  		this.travelerDao = travelerDao;
  	}
  
  
  	/**
  	 * Gets the travelerDao attribute.
  	 * @return Returns the travelerDao.
  	 */
  	public TravelerDao getTravelerDao() {
  		return travelerDao;
  	}
  
  
  	/**
  	 * Sets the travelerService attribute value.
  	 * @param travelerService The travelerService to set.
  	 */
  	public void setTravelerService(TravelerService travelerService) {
  		this.travelerService = travelerService;
  	}
  
  
  	/**
  	 * Gets the travelerService attribute.
  	 * @return Returns the travelerService.
  	 */
  	public TravelerService getTravelerService() {
  		return travelerService;
  	}
  
  
  	/**
  	 * Gets the temProfileAddressToKimAddress attribute.
  	 * @return Returns the temProfileAddressToKimAddress.
  	 */
  	public Map<String, String> getTemProfileAddressToKimAddress() {
  		return temProfileAddressToKimAddress;
  	}
  
  
  	/**
  	 * Sets the temProfileAddressToKimAddress attribute value.
  	 * @param temProfileAddressToKimAddress The temProfileAddressToKimAddress to set.
  	 */
  	public void setTemProfileAddressToKimAddress(
  			Map<String, String> temProfileAddressToKimAddress) {
  		this.temProfileAddressToKimAddress = temProfileAddressToKimAddress;
  	}
  
  
  	/**
  	 * Gets the temProfileAddressToCustomerAddress attribute.
  	 * @return Returns the temProfileAddressToCustomerAddress.
  	 */
  	public Map<String, String> getTemProfileAddressToCustomerAddress() {
  		return temProfileAddressToCustomerAddress;
  	}
  
  
  	/**
  	 * Sets the temProfileAddressToCustomerAddress attribute value.
  	 * @param temProfileAddressToCustomerAddress The temProfileAddressToCustomerAddress to set.
  	 */
  	public void setTemProfileAddressToCustomerAddress(
  			Map<String, String> temProfileAddressToCustomerAddress) {
  		this.temProfileAddressToCustomerAddress = temProfileAddressToCustomerAddress;
  	}
  
  	public IdentityService getIdentityService() {
          if (identityService == null) {
              identityService = KimApiServiceLocator.getIdentityService();
          }
          return identityService;
  	}
  
  
      protected AccountsReceivableModuleService getAccountsReceivableModuleService() {
  