1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.james.container.spring.lifecycle;
20
21 import org.apache.avalon.framework.service.ServiceException;
22 import org.apache.avalon.framework.service.ServiceManager;
23 import org.apache.avalon.framework.service.Serviceable;
24 import org.apache.james.container.spring.adaptor.DefaultServiceManagerFactory;
25 import org.apache.james.container.spring.adaptor.ServiceManagerFactory;
26 import org.springframework.beans.factory.config.BeanDefinition;
27 import org.springframework.beans.factory.config.BeanPostProcessor;
28 import org.springframework.core.Ordered;
29
30
31
32
33 public class ServicePropagator extends AbstractPropagator implements BeanPostProcessor, Ordered {
34
35 private ServiceManagerFactory serviceManagerFactory;
36
37 public void setServiceManagerFactory(DefaultServiceManagerFactory serviceManagerFactory) {
38 this.serviceManagerFactory = serviceManagerFactory;
39 }
40
41 protected Class getLifecycleInterface() {
42 return Serviceable.class;
43 }
44
45 protected void invokeLifecycleWorker(String beanName, Object bean, BeanDefinition beanDefinition) {
46 if (!(bean instanceof Serviceable)) return;
47 Serviceable serviceable = (Serviceable) bean;
48 try {
49 ServiceManager serviceManager = serviceManagerFactory.getInstanceFor(beanName, beanDefinition);
50 if (serviceManager == null) {
51 throw new RuntimeException("failed to create service manager for " + beanName);
52 }
53 serviceable.service(serviceManager);
54 } catch (ServiceException e) {
55 throw new RuntimeException("could not successfully run service method on component of type " + serviceable.getClass(), e);
56 } catch (Exception e) {
57 throw new RuntimeException("could not successfully run service method on component of type " + serviceable.getClass(), e);
58 }
59 }
60
61 public int getOrder() {
62 return 2;
63 }
64 }