/* * 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.external.kc.service.impl; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.log4j.Logger; import org.kuali.kfs.module.external.kc.service.ExternalizableBusinessObjectService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.service.impl.KfsModuleServiceImpl; import org.kuali.rice.core.api.config.property.ConfigurationService; import org.kuali.rice.kns.service.DataDictionaryService; import org.kuali.rice.krad.bo.ExternalizableBusinessObject; import org.kuali.rice.krad.util.KRADConstants; import org.kuali.rice.krad.util.ObjectUtils; public class KcKfsModuleServiceImpl extends KfsModuleServiceImpl { protected static final Logger LOG = Logger.getLogger(KcKfsModuleServiceImpl.class); protected DataDictionaryService dataDictionaryService; protected ConfigurationService configurationService; @Override public <T extends ExternalizableBusinessObject> T getExternalizableBusinessObject(Class<T> businessObjectClass, Map<String, Object> fieldValues) { Class<? extends ExternalizableBusinessObject> implementationClass = getExternalizableBusinessObjectImplementation(businessObjectClass); return (T) getExternalizableBusinessObjectService(implementationClass).findByPrimaryKey(fieldValues); } @Override public <T extends ExternalizableBusinessObject> List<T> getExternalizableBusinessObjectsList(Class<T> businessObjectClass, Map<String, Object> fieldValues) { Class<? extends ExternalizableBusinessObject> implementationClass = getExternalizableBusinessObjectImplementation(businessObjectClass); return (List<T>) getExternalizableBusinessObjectService(implementationClass).findMatching(fieldValues); } /** * Finds the business object service via the class to service mapping provided in the module configuration. * * @param clazz * @return */ private ExternalizableBusinessObjectService getExternalizableBusinessObjectService(Class clazz){ String serviceName = null; ExternalizableBusinessObjectService eboService = null; Map<Class, String> externalizableBusinessObjectServices = ((KcFinancialSystemModuleConfiguration)getModuleConfiguration()).getExternalizableBusinessObjectServiceImplementations(); if(ObjectUtils.isNotNull(externalizableBusinessObjectServices) && ObjectUtils.isNotNull(clazz)){ serviceName = externalizableBusinessObjectServices.get(clazz); eboService = (ExternalizableBusinessObjectService)SpringContext.getService(serviceName); } return eboService; } /** * Gets primary key fields from the Datadictionary entries for the object. * * @see org.kuali.rice.krad.service.impl.ModuleServiceBase#listPrimaryKeyFieldNames(java.lang.Class) */ @Override public List listPrimaryKeyFieldNames(Class businessObjectInterfaceClass) { Class clazz = getExternalizableBusinessObjectImplementation(businessObjectInterfaceClass); final org.kuali.rice.krad.datadictionary.BusinessObjectEntry boEntry = dataDictionaryService.getDataDictionary().getBusinessObjectEntry(clazz.getName()); if (boEntry == null) { return null; } return boEntry.getPrimaryKeys(); } /** * Changing the base url to KC url * * @see org.kuali.rice.krad.service.impl.ModuleServiceBase#getInquiryUrl(java.lang.Class) */ @Override protected String getInquiryUrl(Class inquiryBusinessObjectClass){ String baseUrl = configurationService.getPropertyValueAsString(KFSConstants.KC_APPLICATION_URL_KEY); String inquiryUrl = baseUrl; if (!inquiryUrl.endsWith("/")) { inquiryUrl = inquiryUrl + "/"; } return inquiryUrl + "kr/" + KRADConstants.INQUIRY_ACTION; } /** * Mapping the kfs classes and parameters over to KC equivalents * * @see org.kuali.rice.krad.service.impl.ModuleServiceBase#getUrlParameters(java.lang.String, java.util.Map) */ @Override protected Properties getUrlParameters(String businessObjectClassAttribute, Map<String, String[]> parameters){ Properties urlParameters = new Properties(); String paramNameToConvert = null; Map<String, String> kfsToKcInquiryUrlParameterMapping = ((KcFinancialSystemModuleConfiguration)getModuleConfiguration()).getKfsToKcInquiryUrlParameterMapping(); Map<String, String> kfsToKcInquiryUrlClassMapping = ((KcFinancialSystemModuleConfiguration)getModuleConfiguration()).getKfsToKcInquiryUrlClassMapping(); for (String paramName : parameters.keySet()) { String parameterName = paramName; String[] parameterValues = parameters.get(paramName); if (parameterValues.length > 0) { //attempt to convert parameter name if necessary paramNameToConvert = businessObjectClassAttribute + "." + paramName; if( kfsToKcInquiryUrlParameterMapping.containsKey(paramNameToConvert) ){ parameterName = kfsToKcInquiryUrlParameterMapping.get(paramNameToConvert); } urlParameters.put(parameterName, parameterValues[0]); } } urlParameters.put(KRADConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, kfsToKcInquiryUrlClassMapping.get(businessObjectClassAttribute)); urlParameters.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, KRADConstants.CONTINUE_WITH_INQUIRY_METHOD_TO_CALL); return urlParameters; } public DataDictionaryService getDataDictionaryService() { return dataDictionaryService; } public void setDataDictionaryService(DataDictionaryService dataDictionaryService) { this.dataDictionaryService = dataDictionaryService; } public ConfigurationService getConfigurationService() { return configurationService; } public void setConfigurationService(ConfigurationService configurationService) { this.configurationService = configurationService; } }