<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<import resource="data-source-context.xml" />

	<bean id="jobRegistryBeanPostProcessor"
		class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
		<property name="jobRegistry" ref="jobRegistry" />
	</bean>

	<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
		<property name="jobRepository" ref="jobRepository" />
	</bean>

	<bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" />

	<aop:config>
		<aop:advisor pointcut="execution(* org.springframework.batch.core..*Repository+.*(..))"
			advice-ref="txAdvice" />
	</aop:config>

	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="create*" propagation="REQUIRES_NEW" isolation="SERIALIZABLE" />
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>

	<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"
		p:databaseType="${environment}" p:dataSource-ref="dataSource" />

	<bean id="mapJobInstanceDao" lazy-init="true"
		class="org.springframework.batch.core.repository.dao.MapJobInstanceDao" />

	<bean id="mapJobExecutionDao" lazy-init="true"
		class="org.springframework.batch.core.repository.dao.MapJobExecutionDao" />

	<bean id="mapStepExecutionDao" lazy-init="true"
		class="org.springframework.batch.core.repository.dao.MapStepExecutionDao" />

	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<bean id="simpleJob" class="org.springframework.batch.core.job.SimpleJob" abstract="true">
		<property name="jobRepository" ref="jobRepository" />
		<property name="restartable" value="true" />
	</bean>

	<bean id="taskletStep" class="org.springframework.batch.core.step.tasklet.TaskletStep" abstract="true">
		<property name="jobRepository" ref="jobRepository" />
		<property name="allowStartIfComplete" value="true" />
	</bean>

	<bean id="simpleStep" class="org.springframework.batch.core.step.item.SimpleStepFactoryBean"
		abstract="true">
		<property name="transactionManager" ref="transactionManager" />
		<property name="jobRepository" ref="jobRepository" />
		<property name="startLimit" value="100" />
		<property name="commitInterval" value="1" />
	</bean>
	
	<bean id="skipLimitStep" class="org.springframework.batch.core.step.item.SkipLimitStepFactoryBean"
		parent="simpleStep" abstract="true">
		<property name="skipLimit" value="0" />
	</bean>

	<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
		<property name="customEditors">
			<map>
				<entry key="int[]">
					<bean class="org.springframework.batch.support.IntArrayPropertyEditor" />
				</entry>
				<entry key="org.springframework.batch.item.file.transform.Range[]">
					<bean class="org.springframework.batch.item.file.transform.RangeArrayPropertyEditor" />
				</entry>
				<entry key="java.util.Date">
					<bean class="org.springframework.beans.propertyeditors.CustomDateEditor">
						<constructor-arg>
							<bean class="java.text.SimpleDateFormat">
								<constructor-arg value="yyyyMMdd" />
							</bean>
						</constructor-arg>
						<constructor-arg value="false" />
					</bean>
				</entry>
			</map>
		</property>
	</bean>

	<bean id="logAdvice" class="org.springframework.batch.sample.advice.ProcessorLogAdvice" />

	<bean id="eventAdvice" class="org.springframework.batch.sample.advice.MethodExecutionApplicationEventAdvice" />

	<aop:config>
		<aop:aspect ref="logAdvice">
			<aop:after pointcut="execution( * org.springframework.batch.sample..InfiniteLoopTasklet+.execute(..))"
				method="doBasicLogging" />
		</aop:aspect>
		<aop:aspect ref="eventAdvice">
			<aop:before pointcut="execution( * org.springframework.batch..Step+.execute(..))" method="before" />
			<aop:after pointcut="execution( * org.springframework.batch..Step+.execute(..))" method="after" />
			<aop:after-throwing throwing="t" pointcut="execution( * org.springframework.batch..Step+.execute(..))"
				method="onError" />
		</aop:aspect>
	</aop:config>

</beans>
