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