1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.springframework.batch.core.configuration.xml;
17
18 import org.springframework.batch.core.repository.JobRepository;
19 import org.springframework.batch.core.step.AbstractStep;
20 import org.springframework.beans.BeansException;
21 import org.springframework.beans.MutablePropertyValues;
22 import org.springframework.beans.PropertyValue;
23 import org.springframework.beans.factory.config.BeanDefinition;
24 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
25 import org.springframework.beans.factory.config.BeanPostProcessor;
26 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
27 import org.springframework.beans.factory.config.RuntimeBeanReference;
28 import org.springframework.beans.factory.support.AbstractBeanDefinition;
29 import org.springframework.context.ApplicationContext;
30 import org.springframework.context.ApplicationContextAware;
31 import org.springframework.transaction.PlatformTransactionManager;
32
33
34
35
36
37
38
39
40 public class CoreNamespacePostProcessor implements BeanPostProcessor, BeanFactoryPostProcessor, ApplicationContextAware {
41
42 private static final String DEFAULT_JOB_REPOSITORY_NAME = "jobRepository";
43
44 private static final String DEFAULT_TRANSACTION_MANAGER_NAME = "transactionManager";
45
46 private static final String JOB_FACTORY_PROPERTY_NAME = "jobParserJobFactoryBeanRef";
47
48 private static final String JOB_REPOSITORY_PROPERTY_NAME = "jobRepository";
49
50 private ApplicationContext applicationContext;
51
52 @Override
53 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
54 for (String beanName : beanFactory.getBeanDefinitionNames()) {
55 injectJobRepositoryIntoSteps(beanName, beanFactory);
56 overrideStepClass(beanName, beanFactory);
57 }
58 }
59
60
61
62
63
64
65
66
67 private void injectJobRepositoryIntoSteps(String beanName, ConfigurableListableBeanFactory beanFactory) {
68 BeanDefinition bd = beanFactory.getBeanDefinition(beanName);
69 if (bd.hasAttribute(JOB_FACTORY_PROPERTY_NAME)) {
70 MutablePropertyValues pvs = bd.getPropertyValues();
71 if (beanFactory.isTypeMatch(beanName, AbstractStep.class)) {
72 String jobName = (String) bd.getAttribute(JOB_FACTORY_PROPERTY_NAME);
73 PropertyValue jobRepository = BeanDefinitionUtils.getPropertyValue(jobName,
74 JOB_REPOSITORY_PROPERTY_NAME, beanFactory);
75 if (jobRepository != null) {
76
77 pvs.addPropertyValue(jobRepository);
78 }
79 else {
80
81 RuntimeBeanReference jobRepositoryBeanRef = new RuntimeBeanReference(DEFAULT_JOB_REPOSITORY_NAME);
82 pvs.addPropertyValue(JOB_REPOSITORY_PROPERTY_NAME, jobRepositoryBeanRef);
83 }
84 }
85 }
86 }
87
88
89
90
91
92
93
94
95
96 private void overrideStepClass(String beanName, ConfigurableListableBeanFactory beanFactory) {
97 BeanDefinition bd = beanFactory.getBeanDefinition(beanName);
98 Object isNamespaceStep = BeanDefinitionUtils
99 .getAttribute(beanName, "isNamespaceStep", beanFactory);
100 if (isNamespaceStep != null && (Boolean) isNamespaceStep == true) {
101 ((AbstractBeanDefinition) bd).setBeanClass(StepParserStepFactoryBean.class);
102 }
103 }
104
105 @Override
106 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
107 return injectDefaults(bean);
108 }
109
110
111
112
113
114
115
116
117
118
119
120
121
122 private Object injectDefaults(Object bean) {
123 if (bean instanceof JobParserJobFactoryBean) {
124 JobParserJobFactoryBean fb = (JobParserJobFactoryBean) bean;
125 JobRepository jobRepository = fb.getJobRepository();
126 if (jobRepository == null) {
127 fb.setJobRepository((JobRepository) applicationContext.getBean(DEFAULT_JOB_REPOSITORY_NAME));
128 }
129 }
130 else if (bean instanceof StepParserStepFactoryBean) {
131 StepParserStepFactoryBean<?, ?> fb = (StepParserStepFactoryBean<?, ?>) bean;
132 JobRepository jobRepository = fb.getJobRepository();
133 if (jobRepository == null) {
134 fb.setJobRepository((JobRepository) applicationContext.getBean(DEFAULT_JOB_REPOSITORY_NAME));
135 }
136 PlatformTransactionManager transactionManager = fb.getTransactionManager();
137 if (transactionManager == null && fb.requiresTransactionManager()) {
138 fb.setTransactionManager((PlatformTransactionManager) applicationContext
139 .getBean(DEFAULT_TRANSACTION_MANAGER_NAME));
140 }
141 }
142 return bean;
143 }
144
145 @Override
146 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
147 return bean;
148 }
149
150 @Override
151 public void setApplicationContext(ApplicationContext applicationContext) {
152 this.applicationContext = applicationContext;
153 }
154 }