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}