001 /**
002 * Copyright 2005-2012 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 */
016 package org.kuali.rice.krad.service.impl;
017
018 import org.kuali.rice.coreservice.api.CoreServiceApiServiceLocator;
019 import org.kuali.rice.coreservice.api.namespace.Namespace;
020 import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
021 import org.kuali.rice.coreservice.framework.parameter.ParameterConstants;
022 import org.kuali.rice.krad.bo.BusinessObject;
023 import org.kuali.rice.krad.bo.ExternalizableBusinessObject;
024 import org.kuali.rice.krad.document.TransactionalDocument;
025 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
026 import org.kuali.rice.krad.service.KualiModuleService;
027 import org.kuali.rice.krad.service.ModuleService;
028 import org.kuali.rice.krad.service.ModuleServiceNotFoundException;
029 import org.kuali.rice.krad.util.KRADConstants;
030 import org.springframework.beans.factory.InitializingBean;
031 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
032 import org.springframework.context.ApplicationContext;
033 import org.springframework.context.ApplicationContextAware;
034
035 import java.util.ArrayList;
036 import java.util.List;
037
038 public class KualiModuleServiceImpl implements KualiModuleService, InitializingBean, ApplicationContextAware {
039
040 private List<ModuleService> installedModuleServices = new ArrayList<ModuleService>();
041 private boolean loadRiceInstalledModuleServices;
042 private ApplicationContext applicationContext;
043
044 /**
045 * @param applicationContext the applicationContext to set
046 */
047 @Override
048 public void setApplicationContext(ApplicationContext applicationContext) {
049 this.applicationContext = applicationContext;
050 }
051
052 @Override
053 public List<ModuleService> getInstalledModuleServices() {
054 return installedModuleServices;
055 }
056
057 @Override
058 public ModuleService getModuleService(String moduleId) {
059 for (ModuleService moduleService : installedModuleServices) {
060 if ( moduleService.getModuleConfiguration().getNamespaceCode().equals( moduleId ) ) {
061 return moduleService;
062 }
063 }
064 return null;
065 }
066
067 @Override
068 public ModuleService getModuleServiceByNamespaceCode(String namespaceCode) {
069 for (ModuleService moduleService : installedModuleServices) {
070 if ( moduleService.getModuleConfiguration().getNamespaceCode().equals( namespaceCode ) ) {
071 return moduleService;
072 }
073 }
074 return null;
075 }
076
077 @Override
078 public boolean isModuleServiceInstalled(String namespaceCode) {
079 for (ModuleService moduleService : installedModuleServices) {
080 if ( moduleService.getModuleConfiguration().getNamespaceCode().equals( namespaceCode ) ) {
081 return true;
082 }
083 }
084 return false;
085 }
086
087 @Override
088 public ModuleService getResponsibleModuleService(Class boClass) {
089 if(boClass==null) {
090 return null;
091 }
092 for (ModuleService moduleService : installedModuleServices) {
093 if ( moduleService.isResponsibleFor( boClass ) ) {
094 return moduleService;
095 }
096 }
097 //Throwing exception only for externalizable business objects
098 if(ExternalizableBusinessObject.class.isAssignableFrom(boClass)){
099 String message;
100 if(!boClass.isInterface()) {
101 message = "There is no responsible module for the externalized business object class: "+boClass;
102 } else {
103 message = "There is no responsible module for the externalized business object interface: "+boClass;
104 }
105 throw new ModuleServiceNotFoundException(message);
106 }
107 //Returning null for business objects other than externalizable to keep the framework backward compatible
108 return null;
109 }
110
111 @Override
112 public ModuleService getResponsibleModuleServiceForJob(String jobName){
113 for(ModuleService moduleService : installedModuleServices){
114 if(moduleService.isResponsibleForJob(jobName)){
115 return moduleService;
116 }
117 }
118 return null;
119 }
120
121 @Override
122 public void setInstalledModuleServices(List<ModuleService> installedModuleServices) {
123 this.installedModuleServices = installedModuleServices;
124 }
125
126 @Override
127 public List<String> getDataDictionaryPackages() {
128 List<String> packages = new ArrayList<String>();
129 for ( ModuleService moduleService : installedModuleServices ) {
130 if ( moduleService.getModuleConfiguration().getDataDictionaryPackages() != null ) {
131 packages.addAll( moduleService.getModuleConfiguration().getDataDictionaryPackages() );
132 }
133 }
134 return packages;
135 }
136
137 @Override
138 public String getNamespaceName(final String namespaceCode){
139 Namespace parameterNamespace = CoreServiceApiServiceLocator.getNamespaceService().getNamespace(namespaceCode);
140 return parameterNamespace==null ? "" : parameterNamespace.getName();
141 }
142
143 /**
144 * @param loadRiceInstalledModuleServices the loadRiceInstalledModuleServices to set
145 */
146 public void setLoadRiceInstalledModuleServices(
147 boolean loadRiceInstalledModuleServices) {
148 this.loadRiceInstalledModuleServices = loadRiceInstalledModuleServices;
149 }
150
151 /***
152 * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
153 */
154 @Override
155 public void afterPropertiesSet() throws Exception {
156 if(loadRiceInstalledModuleServices){
157 try {
158 installedModuleServices.addAll(
159 GlobalResourceLoader.<KualiModuleService>getService(KualiModuleService.class.getSimpleName().substring(0, 1).toLowerCase() + KualiModuleService.class.getSimpleName().substring(1)).getInstalledModuleServices());
160 } catch ( NoSuchBeanDefinitionException ex ) {
161 installedModuleServices.addAll( ((KualiModuleService)applicationContext.getBean( KRADServiceLocatorWeb.KUALI_MODULE_SERVICE )).getInstalledModuleServices() );
162 }
163 }
164 }
165
166 @Override
167 public String getNamespaceCode(Class<?> documentClass) {
168 if (documentClass == null) {
169 throw new IllegalArgumentException("documentClass must not be null");
170 }
171
172 if (documentClass.isAnnotationPresent(ParameterConstants.NAMESPACE.class)) {
173 return (documentClass.getAnnotation(ParameterConstants.NAMESPACE.class)).namespace();
174 }
175 ModuleService moduleService = getResponsibleModuleService(documentClass);
176 if (moduleService != null) {
177 return moduleService.getModuleConfiguration().getNamespaceCode();
178 }
179 if (documentClass.getName().startsWith("org.kuali.rice.krad")) {
180 return KRADConstants.KNS_NAMESPACE;
181 }
182 if (documentClass.getName().startsWith("org.kuali.rice.edl")) {
183 return "KR-EDL";
184 }
185 if (documentClass.getName().startsWith("org.kuali.rice.kew")) {
186 return "KR-WKFLW";
187 }
188 if (documentClass.getName().startsWith("org.kuali.rice.edl")) {
189 return "KR-WKFLW";
190 }
191 if (documentClass.getName().startsWith("org.kuali.rice.kim")) {
192 return "KR-IDM";
193 }
194 if (documentClass.getName().startsWith("org.kuali.rice.core")) {
195 return "KR-CORE";
196 }
197 throw new IllegalArgumentException("Unable to determine the namespace code for documentClass " + documentClass.getName());
198 }
199
200 @Override
201 public String getComponentCode(Class<?> documentClass) {
202 if (documentClass == null) {
203 throw new IllegalArgumentException("documentClass must not be null");
204 }
205
206 if (documentClass.isAnnotationPresent(ParameterConstants.COMPONENT.class)) {
207 return documentClass.getAnnotation(ParameterConstants.COMPONENT.class).component();
208 } else if (TransactionalDocument.class.isAssignableFrom(documentClass)) {
209 return documentClass.getSimpleName().replace("Document", "");
210 } else if (BusinessObject.class.isAssignableFrom(documentClass)) {
211 return documentClass.getSimpleName();
212 }
213 throw new IllegalArgumentException("Unable to determine the component code for documentClass " + documentClass.getName());
214 }
215
216 }
217