001/** 002 * Copyright 2005-2016 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 */ 016package org.kuali.rice.krad.service.impl; 017 018import org.apache.commons.lang.StringUtils; 019import org.apache.log4j.Logger; 020import org.kuali.rice.core.api.config.ConfigurationException; 021import org.kuali.rice.core.api.config.module.RunMode; 022import org.kuali.rice.core.api.config.property.ConfigContext; 023import org.kuali.rice.kns.service.BusinessObjectDictionaryService; 024import org.kuali.rice.kns.service.KNSServiceLocator; 025import org.kuali.rice.krad.bo.ExternalizableBusinessObject; 026import org.kuali.rice.krad.service.BusinessObjectService; 027import org.kuali.rice.krad.service.KRADServiceLocator; 028import org.kuali.rice.krad.service.ModuleService; 029import org.kuali.rice.krad.util.KRADConstants; 030import org.kuali.rice.krad.util.UrlFactory; 031 032import java.util.List; 033import java.util.Map; 034import java.util.Properties; 035 036/** 037 * This class implements ModuleService interface. 038 * 039 * @author Kuali Rice Team (rice.collab@kuali.org) 040 */ 041public class ModuleServiceBase extends RemoteModuleServiceBase implements ModuleService { 042 043 protected static final Logger LOG = Logger.getLogger(ModuleServiceBase.class); 044 045 protected BusinessObjectService businessObjectService; 046 protected BusinessObjectDictionaryService businessObjectDictionaryService; 047 048 049 /** 050 * @see org.kuali.rice.krad.service.ModuleService#getExternalizableBusinessObject(java.lang.Class, java.util.Map) 051 */ 052 public <T extends ExternalizableBusinessObject> T getExternalizableBusinessObject(Class<T> businessObjectClass, 053 Map<String, Object> fieldValues) { 054 Class<? extends ExternalizableBusinessObject> implementationClass = 055 getExternalizableBusinessObjectImplementation(businessObjectClass); 056 ExternalizableBusinessObject businessObject = 057 (ExternalizableBusinessObject) getBusinessObjectService().findByPrimaryKey(implementationClass, 058 fieldValues); 059 return (T) businessObject; 060 } 061 062 /** 063 * @see org.kuali.rice.krad.service.ModuleService#getExternalizableBusinessObject(java.lang.Class, java.util.Map) 064 */ 065 public <T extends ExternalizableBusinessObject> List<T> getExternalizableBusinessObjectsList( 066 Class<T> externalizableBusinessObjectClass, Map<String, Object> fieldValues) { 067 Class<? extends ExternalizableBusinessObject> implementationClass = 068 getExternalizableBusinessObjectImplementation(externalizableBusinessObjectClass); 069 return (List<T>) getBusinessObjectService().findMatching(implementationClass, fieldValues); 070 } 071 072 073 074 @Deprecated 075 public String getExternalizableBusinessObjectInquiryUrl(Class inquiryBusinessObjectClass, 076 Map<String, String[]> parameters) { 077 if (!isExternalizable(inquiryBusinessObjectClass)) { 078 return KRADConstants.EMPTY_STRING; 079 } 080 String businessObjectClassAttribute; 081 082 Class implementationClass = getExternalizableBusinessObjectImplementation(inquiryBusinessObjectClass); 083 if (implementationClass == null) { 084 LOG.error("Can't find ExternalizableBusinessObject implementation class for " + inquiryBusinessObjectClass 085 .getName()); 086 throw new RuntimeException("Can't find ExternalizableBusinessObject implementation class for interface " 087 + inquiryBusinessObjectClass.getName()); 088 } 089 businessObjectClassAttribute = implementationClass.getName(); 090 return UrlFactory.parameterizeUrl(getInquiryUrl(inquiryBusinessObjectClass), getUrlParameters( 091 businessObjectClassAttribute, parameters)); 092 } 093 094 @Deprecated 095 @Override 096 protected String getInquiryUrl(Class inquiryBusinessObjectClass) { 097 098 String riceBaseUrl = ""; 099 String potentialUrlAddition = ""; 100 101 if (goToCentralRiceForInquiry()) { 102 riceBaseUrl = KRADServiceLocator.getKualiConfigurationService().getPropertyValueAsString(KRADConstants.KUALI_RICE_URL_KEY); 103 } else { 104 riceBaseUrl = KRADServiceLocator.getKualiConfigurationService().getPropertyValueAsString(KRADConstants.APPLICATION_URL_KEY); 105 potentialUrlAddition = "kr/"; 106 } 107 108 String inquiryUrl = riceBaseUrl; 109 if (!inquiryUrl.endsWith("/")) { 110 inquiryUrl = inquiryUrl + "/"; 111 } 112 return inquiryUrl + potentialUrlAddition + KRADConstants.INQUIRY_ACTION; 113 } 114 115 @Override 116 public boolean isExternalizableBusinessObjectLookupable(Class boClass) { 117 return getBusinessObjectDictionaryService().isLookupable(boClass); 118 } 119 120 @Override 121 public boolean isExternalizableBusinessObjectInquirable(Class boClass) { 122 return getBusinessObjectDictionaryService().isInquirable(boClass); 123 } 124 125 /** 126 * This overridden method ... 127 * 128 * @see org.kuali.rice.krad.service.ModuleService#getExternalizableBusinessObjectLookupUrl(java.lang.Class, 129 * java.util.Map) 130 */ 131 @Deprecated 132 @Override 133 public String getExternalizableBusinessObjectLookupUrl(Class inquiryBusinessObjectClass, 134 Map<String, String> parameters) { 135 Properties urlParameters = new Properties(); 136 137 String riceBaseUrl = ""; 138 String potentialUrlAddition = ""; 139 140 if (goToCentralRiceForInquiry()) { 141 riceBaseUrl = KRADServiceLocator.getKualiConfigurationService().getPropertyValueAsString(KRADConstants.KUALI_RICE_URL_KEY); 142 } else { 143 riceBaseUrl = KRADServiceLocator.getKualiConfigurationService().getPropertyValueAsString(KRADConstants.APPLICATION_URL_KEY); 144 potentialUrlAddition = "kr/"; 145 } 146 147 String lookupUrl = riceBaseUrl; 148 if (!lookupUrl.endsWith("/")) { 149 lookupUrl = lookupUrl + "/"; 150 } 151 152 if (parameters.containsKey(KRADConstants.MULTIPLE_VALUE)) { 153 lookupUrl = lookupUrl + potentialUrlAddition + KRADConstants.MULTIPLE_VALUE_LOOKUP_ACTION; 154 } 155 else { 156 lookupUrl = lookupUrl + potentialUrlAddition + KRADConstants.LOOKUP_ACTION; 157 } 158 159 for (String paramName : parameters.keySet()) { 160 urlParameters.put(paramName, parameters.get(paramName)); 161 } 162 163 /*Class clazz; 164 if (inquiryBusinessObjectClass.getClass().isInterface()) {*/ 165 Class clazz = getExternalizableBusinessObjectImplementation(inquiryBusinessObjectClass); 166 /*} else { 167 clazz = inquiryBusinessObjectClass; 168 }*/ 169 urlParameters.put(KRADConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, clazz == null ? "" : clazz.getName()); 170 171 return UrlFactory.parameterizeUrl(lookupUrl, urlParameters); 172 } 173 174 protected BusinessObjectDictionaryService getBusinessObjectDictionaryService() { 175 if (businessObjectDictionaryService == null) { 176 businessObjectDictionaryService = KNSServiceLocator.getBusinessObjectDictionaryService(); 177 } 178 return businessObjectDictionaryService; 179 } 180 181 /** 182 * @return the businessObjectService 183 */ 184 protected BusinessObjectService getBusinessObjectService() { 185 if (businessObjectService == null) { 186 businessObjectService = KRADServiceLocator.getBusinessObjectService(); 187 } 188 return businessObjectService; 189 } 190 191 public boolean goToCentralRiceForInquiry() { 192 return false; 193 } 194 195 /** 196 * Returns the base URL to use for lookup requests to objects within the module 197 * 198 * @return String base lookup URL 199 */ 200 @Override 201 protected String getBaseLookupUrl() { 202 if (goToCentralRiceForInquiry()) { 203 return BaseLookupUrlsHolder.remoteKradBaseLookupUrl; 204 } else { 205 return BaseLookupUrlsHolder.localKradBaseLookupUrl; 206 } 207 } 208 209 protected RunMode getRunMode(String module) { 210 String propertyName = module + ".mode"; 211 String runMode = ConfigContext.getCurrentContextConfig().getProperty(propertyName); 212 if (StringUtils.isBlank(runMode)) { 213 throw new ConfigurationException("Failed to determine run mode for module '" + module + "'. Please be sure to set configuration parameter '" + propertyName + "'"); 214 } 215 return RunMode.valueOf(runMode.toUpperCase()); 216 } 217 218} 219