001/** 002 * Copyright 2005-2017 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.kew.service; 017 018import org.apache.log4j.Logger; 019import org.kuali.rice.core.api.config.module.RunMode; 020import org.kuali.rice.core.api.config.property.ConfigContext; 021import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader; 022import org.kuali.rice.edl.framework.extract.ExtractService; 023import org.kuali.rice.kew.actionlist.service.ActionListService; 024import org.kuali.rice.kew.actionrequest.service.ActionRequestService; 025import org.kuali.rice.kew.actions.ActionRegistry; 026import org.kuali.rice.kew.actiontaken.service.ActionTakenService; 027import org.kuali.rice.kew.api.KewApiConstants; 028import org.kuali.rice.kew.batch.ExternalActnListNotificationService; 029import org.kuali.rice.kew.batch.XmlPollerService; 030import org.kuali.rice.kew.docsearch.DocumentSearchCustomizationMediator; 031import org.kuali.rice.kew.docsearch.service.DocumentSearchService; 032import org.kuali.rice.kew.doctype.service.DocumentSecurityService; 033import org.kuali.rice.kew.doctype.service.DocumentTypePermissionService; 034import org.kuali.rice.kew.doctype.service.DocumentTypeService; 035import org.kuali.rice.kew.documentlink.service.DocumentLinkService; 036import org.kuali.rice.kew.engine.WorkflowEngineFactory; 037import org.kuali.rice.kew.engine.node.service.BranchService; 038import org.kuali.rice.kew.engine.node.service.RouteNodeService; 039import org.kuali.rice.kew.engine.simulation.SimulationWorkflowEngine; 040import org.kuali.rice.kew.exception.WorkflowDocumentExceptionRoutingService; 041import org.kuali.rice.kew.identity.service.IdentityHelperService; 042import org.kuali.rice.kew.impl.document.WorkflowDocumentPrototype; 043import org.kuali.rice.kew.impl.stuck.StuckDocumentNotifier; 044import org.kuali.rice.kew.impl.stuck.StuckDocumentService; 045import org.kuali.rice.kew.mail.service.ActionListEmailService; 046import org.kuali.rice.kew.mail.service.EmailContentService; 047import org.kuali.rice.kew.notes.service.NoteService; 048import org.kuali.rice.kew.notification.service.NotificationService; 049import org.kuali.rice.kew.responsibility.service.ResponsibilityIdService; 050import org.kuali.rice.kew.role.service.RoleService; 051import org.kuali.rice.kew.routeheader.service.RouteHeaderService; 052import org.kuali.rice.kew.routeheader.service.WorkflowDocumentService; 053import org.kuali.rice.kew.routemodule.service.RouteModuleService; 054import org.kuali.rice.kew.routemodule.service.RoutingReportService; 055import org.kuali.rice.kew.rule.WorkflowRuleAttributeMediator; 056import org.kuali.rice.kew.rule.service.RuleAttributeService; 057import org.kuali.rice.kew.rule.service.RuleDelegationService; 058import org.kuali.rice.kew.rule.service.RuleServiceInternal; 059import org.kuali.rice.kew.rule.service.RuleTemplateService; 060import org.kuali.rice.kew.useroptions.UserOptionsService; 061import org.kuali.rice.kew.validation.RuleValidationAttributeResolver; 062import org.springframework.cache.CacheManager; 063import org.springframework.transaction.PlatformTransactionManager; 064 065import javax.persistence.EntityManagerFactory; 066import javax.sql.DataSource; 067import javax.transaction.TransactionManager; 068import javax.transaction.UserTransaction; 069import javax.xml.namespace.QName; 070 071 072/** 073 * Convenience class that holds service names and provide methods to acquire services. Defaults to 074 * GLR for actual service acquisition. Used to be responsible for loading and holding spring 075 * application context (when it was SpringServiceLocator) but those responsibilities have been 076 * moved to the SpringLoader. 077 * 078 * @author Kuali Rice Team (rice.collab@kuali.org) 079 * 080 */ 081public final class KEWServiceLocator { 082 083 private static final Logger LOG = Logger.getLogger(KEWServiceLocator.class); 084 085 public static final String KEW_RUN_MODE_PROPERTY = "kew.mode"; 086 087 public static final String DATASOURCE = "kewDataSource"; 088 089 public static final String QUICK_LINKS_SERVICE = "enQuickLinksService"; 090 091 public static final String DOCUMENT_SEARCH_SERVICE = "enDocumentSearchService"; 092 093 public static final String ACTION_TAKEN_SRV = "enActionTakenService"; 094 095 public static final String ACTION_REQUEST_SRV = "enActionRequestService"; 096 097 public static final String ACTION_LIST_SRV = "enActionListService"; 098 099 public static final String DOC_ROUTE_HEADER_SRV = "enDocumentRouteHeaderService"; 100 101 public static final String DOCUMENT_TYPE_GROUP_SERVICE = "enDocumentTypeGroupService"; 102 103 public static final String DOCUMENT_TYPE_SERVICE = "enDocumentTypeService"; 104 105 public static final String DOCUMENT_TYPE_PERMISSION_SERVICE = "enDocumentTypePermissionService"; 106 107 public static final String DOCUMENT_SECURITY_SERVICE = "enDocumentSecurityService"; 108 109 public static final String USER_OPTIONS_SRV = "enUserOptionsService"; 110 111 public static final String DOCUMENT_CHANGE_HISTORY_SRV = "enDocumentChangeHistoryService"; 112 113 public static final String DOCUMENT_VALUE_INDEX_SRV = "enDocumentValueIndexService"; 114 115 public static final String ROUTE_LEVEL_SERVICE = "enRouteLevelService"; 116 117 public static final String CONSTANTS_SERVICE = "enApplicationConstantsService"; 118 119 public static final String ROUTE_LOG_SERVICE = "enRouteLogService"; 120 121 public static final String RULE_TEMPLATE_SERVICE = "enRuleTemplateService"; 122 123 public static final String RULE_SERVICE = "enRuleServiceInternal"; 124 125 public static final String RULE_ATTRIBUTE_SERVICE = "enRuleAttributeService"; 126 127 public static final String RULE_TEMPLATE_ATTRIBUTE_SERVICE = "enRuleTemplateAttributeService"; 128 129 public static final String ROLE_SERVICE = "enRoleService"; 130 131 public static final String RESPONSIBILITY_ID_SERVICE = "enResponsibilityIdService"; 132 133 public static final String STATS_SERVICE = "enStatsService"; 134 135 public static final String ROUTE_MANAGER_QUEUE_SERVICE = "enRouteManagerQueueService"; 136 137 public static final String ROUTE_MANAGER_CONTROLLER = "enRouteManagerController"; 138 139 public static final String RULE_DELEGATION_SERVICE = "enRuleDelegationService"; 140 141 public static final String ROUTE_MANAGER_DRIVER = "enRouteManagerDriver"; 142 143 public static final String OPTIMISTIC_LOCK_FAILURE_SERVICE = "enOptimisticLockFailureService"; 144 145 public static final String NOTE_SERVICE = "enNoteService"; 146 147 public static final String ROUTING_REPORT_SERVICE = "enRoutingReportService"; 148 149 public static final String ROUTE_MODULE_SERVICE = "enRouteModuleService"; 150 151 public static final String EXCEPTION_ROUTING_SERVICE = "enExceptionRoutingService"; 152 153 public static final String ACTION_REGISTRY = "enActionRegistry"; 154 155 public static final String BRANCH_SERVICE = "enBranchService"; 156 157 public static final String WORKFLOW_MBEAN = "workflowMBean"; 158 159 public static final String JTA_TRANSACTION_MANAGER = "jtaTransactionManager"; 160 161 public static final String USER_TRANSACTION = "userTransaction"; 162 163 public static final String SCHEDULER = "enScheduler"; 164 165 public static final String DOCUMENT_LINK_SERVICE = "enDocumentLinkService"; 166 167 /** 168 * Polls for xml files on disk 169 */ 170 public static final String XML_POLLER_SERVICE = "enXmlPollerService"; 171 172 public static final String EXTERNAL_ACTN_LIST_NOTIFICATION_SERVICE = "rice.kew.externalActnListNotificationService"; 173 174 public static final String DB_TABLES_LOADER = "enDbTablesLoader"; 175 176 public static final String ROUTE_NODE_SERVICE = "enRouteNodeService"; 177 178 public static final String SIMULATION_ENGINE = "simulationEngine"; 179 180 public static final String WORKFLOW_ENGINE_FACTORY = "workflowEngineFactory"; 181 182 public static final String ACTION_LIST_EMAIL_SERVICE = "enActionListEmailService"; 183 184 public static final String EMAIL_CONTENT_SERVICE = "enEmailContentService"; 185 186 public static final String NOTIFICATION_SERVICE = "enNotificationService"; 187 188 public static final String TRANSACTION_MANAGER = "transactionManager"; 189 190 public static final String TRANSACTION_TEMPLATE = "transactionTemplate"; 191 192 public static final String WORKFLOW_DOCUMENT_SERVICE = "enWorkflowDocumentService"; 193 194 public static final String EXTENSION_SERVICE = "enExtensionService"; 195 196 public static final String TRANSFORMATION_SERVICE = "enTransformationService"; 197 198 public static final String REMOVE_REPLACE_DOCUMENT_SERVICE = "enRemoveReplaceDocumentService"; 199 200 public static final String EXTRACT_SERVICE = "enExtractService"; 201 202 public static final String IDENTITY_HELPER_SERVICE = "kewIdentityHelperService"; 203 204 public static final String ENTITY_MANAGER_FACTORY = "kewEntityManagerFactory"; 205 206 public static final String MAILER = "mailer"; 207 208 public static final String WORKFLOW_DOCUMENT_PROTOTYPE = "rice.kew.workflowDocumentPrototype"; 209 210 public static final String DOCUMENT_SEARCH_CUSTOMIZATION_MEDIATOR = "rice.kew.documentSearchCustomizationMediator"; 211 212 public static final String RULE_VALIDATION_ATTRIBUTE_RESOLVER = "rice.kew.ruleValidationAttributeResolver"; 213 214 public static final String WORKFLOW_RULE_ATTRIBUTE_MEDIATOR = "rice.kew.workflowRuleAttributeMediator"; 215 216 public static final String LOCAL_CACHE_MANAGER = "kewLocalCacheManager"; 217 218 public static final String STUCK_DOCUMENT_SERVICE = "rice.kew.stuckDocumentService"; 219 220 public static final String STUCK_DOCUMENT_NOTIFIER = "rice.kew.stuckDocumentNotifier"; 221 222 public static EntityManagerFactory getEntityManagerFactory() { 223 return (EntityManagerFactory) getService(ENTITY_MANAGER_FACTORY); 224 } 225 226 /** 227 * @param serviceName 228 * the name of the service bean 229 * @return the service 230 */ 231 public static <T> T getService(String serviceName) { 232 return KEWServiceLocator.<T>getBean(serviceName); 233 } 234 235 public static <T> T getBean(String serviceName) { 236 if ( LOG.isDebugEnabled() ) { 237 LOG.debug("Fetching service " + serviceName); 238 } 239 QName name = new QName(serviceName); 240 RunMode kewRunMode = RunMode.valueOf(ConfigContext.getCurrentContextConfig().getProperty(KEW_RUN_MODE_PROPERTY)); 241 if (kewRunMode == RunMode.REMOTE || kewRunMode == RunMode.THIN) { 242 if (!serviceName.equals(WORKFLOW_DOCUMENT_PROTOTYPE)) { 243 name = new QName(KewApiConstants.Namespaces.KEW_NAMESPACE_2_0, serviceName); 244 } else { 245 name = new QName(serviceName); 246 } 247 } 248 return GlobalResourceLoader.getResourceLoader().<T>getService(name); 249 } 250 251 public static DocumentTypeService getDocumentTypeService() { 252 return (DocumentTypeService) getBean(DOCUMENT_TYPE_SERVICE); 253 } 254 255 public static DocumentTypePermissionService getDocumentTypePermissionService() { 256 return (DocumentTypePermissionService) getBean(DOCUMENT_TYPE_PERMISSION_SERVICE); 257 } 258 259 public static DocumentSecurityService getDocumentSecurityService() { 260 return (DocumentSecurityService) getBean(DOCUMENT_SECURITY_SERVICE); 261 } 262 263 264 public static ActionRequestService getActionRequestService() { 265 return (ActionRequestService) getBean(ACTION_REQUEST_SRV); 266 } 267 268 public static ActionTakenService getActionTakenService() { 269 return (ActionTakenService) getBean(ACTION_TAKEN_SRV); 270 } 271 272 public static ResponsibilityIdService getResponsibilityIdService() { 273 return (ResponsibilityIdService) getBean(RESPONSIBILITY_ID_SERVICE); 274 } 275 276 public static RouteHeaderService getRouteHeaderService() { 277 return (RouteHeaderService) getBean(DOC_ROUTE_HEADER_SRV); 278 } 279 280 public static RuleTemplateService getRuleTemplateService() { 281 return (RuleTemplateService) getBean(RULE_TEMPLATE_SERVICE); 282 } 283 284 public static RuleAttributeService getRuleAttributeService() { 285 return (RuleAttributeService) getBean(RULE_ATTRIBUTE_SERVICE); 286 } 287 288 public static WorkflowDocumentService getWorkflowDocumentService() { 289 return (WorkflowDocumentService) getBean(WORKFLOW_DOCUMENT_SERVICE); 290 } 291 292 public static RouteModuleService getRouteModuleService() { 293 return (RouteModuleService) getBean(ROUTE_MODULE_SERVICE); 294 } 295 296 public static RoleService getRoleService() { 297 return (RoleService) getBean(ROLE_SERVICE); 298 } 299 300 public static RuleServiceInternal getRuleService() { 301 return (RuleServiceInternal) getBean(RULE_SERVICE); 302 } 303 304 public static RuleDelegationService getRuleDelegationService() { 305 return (RuleDelegationService) getBean(RULE_DELEGATION_SERVICE); 306 } 307 308 public static RoutingReportService getRoutingReportService() { 309 return (RoutingReportService) getBean(ROUTING_REPORT_SERVICE); 310 } 311 312 public static XmlPollerService getXmlPollerService() { 313 return (XmlPollerService) getBean(XML_POLLER_SERVICE); 314 } 315 316 public static ExternalActnListNotificationService getExternalActnListNotificationService() { 317 return (ExternalActnListNotificationService) getBean(EXTERNAL_ACTN_LIST_NOTIFICATION_SERVICE); 318 } 319 320 public static UserOptionsService getUserOptionsService() { 321 return (UserOptionsService) getBean(USER_OPTIONS_SRV); 322 } 323 324 public static ActionListService getActionListService() { 325 return (ActionListService) getBean(ACTION_LIST_SRV); 326 } 327 328 public static RouteNodeService getRouteNodeService() { 329 return (RouteNodeService) getBean(ROUTE_NODE_SERVICE); 330 } 331 332 public static SimulationWorkflowEngine getSimulationEngine() { 333 return (SimulationWorkflowEngine) getBean(SIMULATION_ENGINE); 334 } 335 336 public static WorkflowEngineFactory getWorkflowEngineFactory() { 337 return (WorkflowEngineFactory) getBean(WORKFLOW_ENGINE_FACTORY); 338 } 339 340 public static WorkflowDocumentExceptionRoutingService getExceptionRoutingService() { 341 return (WorkflowDocumentExceptionRoutingService) getBean(EXCEPTION_ROUTING_SERVICE); 342 } 343 344 public static ActionListEmailService getActionListEmailService() { 345 return (ActionListEmailService) getBean(KEWServiceLocator.ACTION_LIST_EMAIL_SERVICE); 346 } 347 348 public static EmailContentService getEmailContentService() { 349 return (EmailContentService) getBean(KEWServiceLocator.EMAIL_CONTENT_SERVICE); 350 } 351 352 public static NotificationService getNotificationService() { 353 return (NotificationService) getBean(KEWServiceLocator.NOTIFICATION_SERVICE); 354 } 355 356 public static TransactionManager getTransactionManager() { 357 return (TransactionManager) getBean(JTA_TRANSACTION_MANAGER); 358 } 359 360 public static UserTransaction getUserTransaction() { 361 return (UserTransaction) getBean(USER_TRANSACTION); 362 } 363 364 public static NoteService getNoteService() { 365 return (NoteService) getBean(NOTE_SERVICE); 366 } 367 368 public static ActionRegistry getActionRegistry() { 369 return (ActionRegistry) getBean(ACTION_REGISTRY); 370 } 371 372 public static BranchService getBranchService() { 373 return (BranchService) getBean(BRANCH_SERVICE); 374 } 375 376 public static DocumentSearchService getDocumentSearchService() { 377 return (DocumentSearchService) getBean(DOCUMENT_SEARCH_SERVICE); 378 } 379 380 public static ExtractService getExtractService() { 381 return (ExtractService) getBean(EXTRACT_SERVICE); 382 } 383 384 public static IdentityHelperService getIdentityHelperService() { 385 return (IdentityHelperService) getBean(IDENTITY_HELPER_SERVICE); 386 } 387 388 public static DocumentLinkService getDocumentLinkService(){ 389 return (DocumentLinkService) getBean(DOCUMENT_LINK_SERVICE); 390 } 391 392 /** 393 * For the following methods, we go directly to the SpringLoader because we do NOT want them to 394 * be wrapped in any sort of proxy. 395 */ 396 397 public static DataSource getDataSource() { 398 return (DataSource) getBean(DATASOURCE); 399 } 400 401 public static PlatformTransactionManager getPlatformTransactionManager() { 402 return (PlatformTransactionManager) getBean(TRANSACTION_MANAGER); 403 } 404 405 public static WorkflowDocumentPrototype getWorkflowDocumentPrototype() { 406 return getBean(WORKFLOW_DOCUMENT_PROTOTYPE); 407 } 408 409 public static DocumentSearchCustomizationMediator getDocumentSearchCustomizationMediator() { 410 return getBean(DOCUMENT_SEARCH_CUSTOMIZATION_MEDIATOR); 411 } 412 413 public static WorkflowRuleAttributeMediator getWorkflowRuleAttributeMediator() { 414 return getBean(WORKFLOW_RULE_ATTRIBUTE_MEDIATOR); 415 } 416 417 public static RuleValidationAttributeResolver getRuleValidationAttributeResolver() { 418 return getBean(RULE_VALIDATION_ATTRIBUTE_RESOLVER); 419 } 420 421 public static CacheManager getLocalCacheManager() { 422 return (CacheManager) getService(LOCAL_CACHE_MANAGER); 423 } 424 425 public static StuckDocumentService getStuckDocumentService() { 426 return getBean(STUCK_DOCUMENT_SERVICE); 427 } 428 429 public static StuckDocumentNotifier getStuckDocumentNotifier() { 430 return getBean(STUCK_DOCUMENT_NOTIFIER); 431 } 432}