16
16
17
17
package org .springframework .batch .execution .configuration ;
18
18
19
+ import org .springframework .batch .execution .step .ItemOrientedStep ;
19
20
import org .springframework .batch .execution .step .TaskletStep ;
20
21
import org .springframework .beans .MutablePropertyValues ;
21
22
import org .springframework .beans .factory .config .BeanDefinition ;
@@ -37,7 +38,7 @@ class JobBeanDefinitionParser implements BeanDefinitionParser {
37
38
38
39
private static final String TAG_JOB = "job" ;
39
40
40
- private static final String TAG_CHUNKING_STEP = "chunking- step" ;
41
+ private static final String TAG_STEP = "step" ;
41
42
42
43
private static final String TAG_TASKLET_STEP = "tasklet-step" ;
43
44
@@ -63,14 +64,39 @@ class JobBeanDefinitionParser implements BeanDefinitionParser {
63
64
64
65
private static final String REPOSITORY_BEAN_NAME = "_jobRepository" ;
65
66
67
+ private static final String ATT_SIZE = "size" ;
68
+
69
+ private static final String PROP_COMMIT_INTERVAL = "commitInterval" ;
70
+
71
+ private static final String ATT_TRANSACTION_MANAGER = "transaction-manager" ;
72
+
73
+ private static final String PROP_TRANSACTION_MANAGER = "transactionManager" ;
74
+
75
+ private static final String ATT_ITEM_READER = "item-reader" ;
76
+
77
+ private static final String PROP_ITEM_READER = "itemReader" ;
78
+
79
+ private static final String ATT_ITEM_WRITER = "item-writer" ;
80
+
81
+ private static final String PROP_ITEM_WRITER = "itemWriter" ;
82
+
83
+ private static final String ATT_INPUT_SKIP_LIMIT = "input-skip-limit" ;
84
+
85
+ // TODO: Create difference between input skip limit and output skip limit
86
+ private static final String PROP_INPUT_SKIP_LIMIT = "skipLimit" ;
87
+
88
+ private static final String ATT_OUTPUT_SKIP_LIMIT = "output-skip-limit" ;
89
+
90
+ private static final String PROP_OUTPUT_SKIP_LIMIT = "outputSkipLimit" ;
91
+
66
92
public BeanDefinition parse (Element element , ParserContext parserContext ) {
67
93
NodeList childNodes = element .getChildNodes ();
68
94
for (int i = 0 ; i < childNodes .getLength (); i ++) {
69
95
Node node = childNodes .item (i );
70
96
if (node .getNodeType () == Node .ELEMENT_NODE ) {
71
97
String localName = node .getLocalName ();
72
- if (TAG_CHUNKING_STEP .equals (localName )) {
73
- // parseChunkingStep ((Element) node, parserContext);
98
+ if (TAG_STEP .equals (localName )) {
99
+ parseStep ((Element ) node , parserContext );
74
100
} else if (TAG_TASKLET_STEP .equals (localName )) {
75
101
parseTaskletStep ((Element ) node , parserContext );
76
102
}
@@ -79,6 +105,61 @@ public BeanDefinition parse(Element element, ParserContext parserContext) {
79
105
return null ;
80
106
}
81
107
108
+ private void parseStep (Element stepElement , ParserContext parserContext ) {
109
+ AbstractBeanDefinition stepDef = createStepBeanDefinition (stepElement , parserContext );
110
+ String id = stepElement .getAttribute (ATT_ID );
111
+
112
+ if (StringUtils .hasText (id )) {
113
+ parserContext .getRegistry ().registerBeanDefinition (id , stepDef );
114
+ } else {
115
+ parserContext .getReaderContext ().registerWithGeneratedName (stepDef );
116
+ }
117
+ }
118
+
119
+ private AbstractBeanDefinition createStepBeanDefinition (Element stepElement , ParserContext parserContext ) {
120
+ RootBeanDefinition stepDef = new RootBeanDefinition (ItemOrientedStep .class );
121
+ stepDef .setSource (parserContext .extractSource (stepElement ));
122
+ MutablePropertyValues propertyValues = stepDef .getPropertyValues ();
123
+
124
+ String size = stepElement .getAttribute (ATT_SIZE );
125
+ propertyValues .addPropertyValue (PROP_COMMIT_INTERVAL , Integer .valueOf (size ));
126
+ String transactionManager = stepElement .getAttribute (ATT_TRANSACTION_MANAGER );
127
+ if (!StringUtils .hasText (transactionManager )) {
128
+ parserContext .getReaderContext ().error ("'transaction-manager' attribute contains empty value" , stepElement );
129
+ } else {
130
+ propertyValues .addPropertyValue (PROP_TRANSACTION_MANAGER , new RuntimeBeanReference (transactionManager ));
131
+ }
132
+
133
+ String itemReader = stepElement .getAttribute (ATT_ITEM_READER );
134
+ if (!StringUtils .hasText (itemReader )) {
135
+ parserContext .getReaderContext ().error ("'item-reader' attribute contains empty value" , stepElement );
136
+ } else {
137
+ propertyValues .addPropertyValue (PROP_ITEM_READER , new RuntimeBeanReference (itemReader ));
138
+ }
139
+ String itemWriter = stepElement .getAttribute (ATT_ITEM_WRITER );
140
+ if (!StringUtils .hasText (itemWriter )) {
141
+ parserContext .getReaderContext ().error ("'item-writer' attribute contains empty value" , stepElement );
142
+ } else {
143
+ propertyValues .addPropertyValue (PROP_ITEM_WRITER , new RuntimeBeanReference (itemWriter ));
144
+ }
145
+
146
+ if (stepElement .hasAttribute (ATT_INPUT_SKIP_LIMIT )) {
147
+ String inputSkipLimit = stepElement .getAttribute (ATT_INPUT_SKIP_LIMIT );
148
+ propertyValues .addPropertyValue (PROP_INPUT_SKIP_LIMIT , Integer .valueOf (inputSkipLimit ));
149
+ }
150
+
151
+ // TODO: Create difference between input skip limit and output skip limit
152
+ // if (stepElement.hasAttribute(ATT_OUTPUT_SKIP_LIMIT)) {
153
+ // String outputSkipLimit = stepElement.getAttribute(ATT_OUTPUT_SKIP_LIMIT);
154
+ // propertyValues.addPropertyValue(PROP_OUTPUT_SKIP_LIMIT, Integer.valueOf(outputSkipLimit));
155
+ // }
156
+
157
+ String rerun = stepElement .getAttribute (ATT_RERUN );
158
+ setPropertiesForRerun (rerun , propertyValues );
159
+ propertyValues .addPropertyValue (PROP_JOB_REPOSITORY , new RuntimeBeanReference (REPOSITORY_BEAN_NAME ));
160
+ return stepDef ;
161
+ }
162
+
82
163
private void parseTaskletStep (Element taskletElement , ParserContext parserContext ) {
83
164
AbstractBeanDefinition stepDef = createTaskletStepBeanDefinition (taskletElement , parserContext );
84
165
String id = taskletElement .getAttribute (ATT_ID );
@@ -93,18 +174,18 @@ private void parseTaskletStep(Element taskletElement, ParserContext parserContex
93
174
private AbstractBeanDefinition createTaskletStepBeanDefinition (Element taskletElement , ParserContext parserContext ) {
94
175
RootBeanDefinition stepDef = new RootBeanDefinition (TaskletStep .class );
95
176
stepDef .setSource (parserContext .extractSource (taskletElement ));
177
+ MutablePropertyValues propertyValues = stepDef .getPropertyValues ();
96
178
97
179
String tasklet = taskletElement .getAttribute (ATT_TASKLET );
98
180
if (!StringUtils .hasText (tasklet )) {
99
181
parserContext .getReaderContext ().error ("'tasklet' attribute contains empty value" , taskletElement );
100
182
} else {
101
- stepDef . getPropertyValues () .addPropertyValue (PROP_TASKLET , new RuntimeBeanReference (tasklet ));
183
+ propertyValues .addPropertyValue (PROP_TASKLET , new RuntimeBeanReference (tasklet ));
102
184
}
103
185
104
186
String rerun = taskletElement .getAttribute (ATT_RERUN );
105
- setPropertiesForRerun (rerun , stepDef .getPropertyValues ());
106
- stepDef .getPropertyValues ().addPropertyValue (PROP_JOB_REPOSITORY ,
107
- new RuntimeBeanReference (REPOSITORY_BEAN_NAME ));
187
+ setPropertiesForRerun (rerun , propertyValues );
188
+ propertyValues .addPropertyValue (PROP_JOB_REPOSITORY , new RuntimeBeanReference (REPOSITORY_BEAN_NAME ));
108
189
109
190
return stepDef ;
110
191
}
0 commit comments