diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/resource/StepExecutionResourceProxy.java b/spring-batch-core/src/main/java/org/springframework/batch/core/resource/StepExecutionResourceProxy.java deleted file mode 100644 index ed083fcf2..000000000 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/resource/StepExecutionResourceProxy.java +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright 2006-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.batch.core.resource; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.net.URL; -import java.util.Properties; -import java.util.Map.Entry; - -import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.StepExecutionListener; -import org.springframework.batch.core.converter.DefaultJobParametersConverter; -import org.springframework.batch.core.converter.JobParametersConverter; -import org.springframework.batch.core.listener.StepExecutionListenerSupport; -import org.springframework.context.ResourceLoaderAware; -import org.springframework.core.io.FileSystemResourceLoader; -import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; - -/** - * Strategy for locating different resources on the file system. For each unique - * step execution, the same file handle will be returned. A unique step is - * defined as having the same job instance and step name. An external file mover - * (such as an EAI solution) should rename and move any input files to conform - * to the pattern defined here.
- * - * If no pattern is passed in, then following default is used: - * - *
- * data/%JOB_NAME%/%STEP_NAME%.txt
- * 
- * - * The %% variables are replaced with the corresponding bean property at run - * time, when the factory method is executed. To insert {@link JobParameters} - * use a pattern with the parameter key surrounded by %%, e.g. - * - *
- * //home/jobs/data/%JOB_NAME%/%STEP_NAME%-%schedule.date%.txt
- * 
- * - * Note that the default pattern does not start with a separator. Because of the - * implementation of the Spring Core Resource abstractions, it would need to - * start with a double forward slash "//" to resolve to an absolute directory - * (or else use a full URL with the file: prefix).
- * - * To use this resource it must be initialised with a {@link StepExecution}. - * The best way to do that is to register it as a listener in the step that is - * going to need it. For this reason the resource implements - * {@link StepExecutionListener}. - * - * @author Tomas Slanina - * @author Lucas Ward - * @author Dave Syer - * - * @see Resource - */ -public class StepExecutionResourceProxy extends StepExecutionListenerSupport implements Resource, ResourceLoaderAware, - StepExecutionListener { - - private static final String JOB_NAME_PATTERN = "%JOB_NAME%"; - - private static final String STEP_NAME_PATTERN = "%STEP_NAME%"; - - private static final String DEFAULT_PATTERN = "data/%JOB_NAME%/" + "%STEP_NAME%.txt"; - - private String filePattern = DEFAULT_PATTERN; - - private JobParametersConverter jobParametersConverter = new DefaultJobParametersConverter(); - - private ResourceLoader resourceLoader = new FileSystemResourceLoader(); - - private Resource delegate; - - /** - * @param relativePath - * @throws IOException - * @see org.springframework.core.io.Resource#createRelative(java.lang.String) - */ - public Resource createRelative(String relativePath) throws IOException { - Assert.state(delegate != null, "The delegate resource has not been initialised. " - + "Remember to register this object as a StepListener."); - return delegate.createRelative(relativePath); - } - - /** - * @see org.springframework.core.io.Resource#exists() - */ - public boolean exists() { - Assert.state(delegate != null, "The delegate resource has not been initialised. " - + "Remember to register this object as a StepListener."); - return delegate.exists(); - } - - /** - * @see org.springframework.core.io.Resource#getDescription() - */ - public String getDescription() { - Assert.state(delegate != null, "The delegate resource has not been initialised. " - + "Remember to register this object as a StepListener."); - return delegate.getDescription(); - } - - /** - * @throws IOException - * @see org.springframework.core.io.Resource#getFile() - */ - public File getFile() throws IOException { - Assert.state(delegate != null, "The delegate resource has not been initialised. " - + "Remember to register this object as a StepListener."); - return delegate.getFile(); - } - - /** - * @see org.springframework.core.io.Resource#getFilename() - */ - public String getFilename() { - Assert.state(delegate != null, "The delegate resource has not been initialised. " - + "Remember to register this object as a StepListener."); - return delegate.getFilename(); - } - - /** - * @throws IOException - * @see org.springframework.core.io.InputStreamSource#getInputStream() - */ - public InputStream getInputStream() throws IOException { - Assert.state(delegate != null, "The delegate resource has not been initialised. " - + "Remember to register this object as a StepListener."); - return delegate.getInputStream(); - } - - /** - * @throws IOException - * @see org.springframework.core.io.Resource#getURI() - */ - public URI getURI() throws IOException { - Assert.state(delegate != null, "The delegate resource has not been initialised. " - + "Remember to register this object as a StepListener."); - return delegate.getURI(); - } - - /** - * @throws IOException - * @see org.springframework.core.io.Resource#getURL() - */ - public URL getURL() throws IOException { - Assert.state(delegate != null, "The delegate resource has not been initialised. " - + "Remember to register this object as a StepListener."); - return delegate.getURL(); - } - - /** - * @see org.springframework.core.io.Resource#isOpen() - */ - public boolean isOpen() { - Assert.state(delegate != null, "The delegate resource has not been initialised. " - + "Remember to register this object as a StepListener."); - return delegate.isOpen(); - } - - /** - * @see org.springframework.core.io.Resource#isReadable() - */ - public boolean isReadable() { - Assert.state(delegate != null, "The delegate resource has not been initialised. " - + "Remember to register this object as a StepListener."); - return delegate.isReadable(); - } - - /** - * @see org.springframework.core.io.Resource#lastModified() - */ - public long lastModified() throws IOException { - Assert.state(delegate != null, "The delegate resource has not been initialised. " - + "Remember to register this object as a StepListener."); - return delegate.lastModified(); - } - - /** - * Public setter for the {@link JobParametersConverter} used to translate - * {@link JobParameters} into {@link Properties}. Defaults to a - * {@link DefaultJobParametersConverter}. - * @param jobParametersConverter the {@link JobParametersConverter} to set - */ - public void setJobParametersFactory(JobParametersConverter jobParametersConverter) { - this.jobParametersConverter = jobParametersConverter; - } - - /** - * Always false because we are expecting to be step scoped. - * - * @see org.springframework.beans.factory.config.AbstractFactoryBean#isSingleton() - */ - public boolean isSingleton() { - return false; - } - - /* - * (non-Javadoc) - * - * @see org.springframework.context.ResourceLoaderAware#setResourceLoader(org.springframework.core.io.ResourceLoader) - */ - public void setResourceLoader(ResourceLoader resourceLoader) { - this.resourceLoader = resourceLoader; - } - - /** - * helper method for createFileName() - */ - private String replacePattern(String string, String pattern, String replacement) { - - if (string == null) - return null; - - // check to ensure pattern exists in string. - if (string.indexOf(pattern) != -1) { - return StringUtils.replace(string, pattern, replacement); - } - - return string; - } - - /** - * Creates a filename given a pattern and step context information. - * - * Deliberate package access, so that the method can be accessed by unit - * tests - * @param jobName - * @param stepName - * @param properties - */ - private String createFileName(String jobName, String stepName, Properties properties) { - Assert.notNull(filePattern, "filename pattern is null"); - - String fileName = filePattern; - - fileName = replacePattern(fileName, JOB_NAME_PATTERN, jobName == null ? "job" : jobName); - fileName = replacePattern(fileName, STEP_NAME_PATTERN, stepName); - - if (properties != null) { - for (Entry entry : properties.entrySet()) { - String key = (String) entry.getKey(); - fileName = replacePattern(fileName, "%" + key + "%", (String) entry.getValue()); - } - } - - return fileName; - } - - public void setFilePattern(String filePattern) { - this.filePattern = replacePattern(filePattern, "\\", File.separator); - } - - /** - * Collect the properties of the enclosing {@link StepExecution} that will - * be needed to create a file name. - * - * @see org.springframework.batch.core.StepExecutionListener#beforeStep(org.springframework.batch.core.StepExecution) - */ - public void beforeStep(StepExecution execution) { - String stepName = execution.getStepName(); - String jobName = execution.getJobExecution().getJobInstance().getJobName(); - Properties properties = jobParametersConverter.getProperties(execution.getJobExecution().getJobInstance() - .getJobParameters()); - delegate = resourceLoader.getResource(createFileName(jobName, stepName, properties)); - } - - /** - * Delegates to the proxied Resource if set, otherwise returns the value of {@link #setFilePattern(String)}. - */ - public String toString() { - return (delegate == null) ? filePattern : delegate.toString(); - } - -} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/resource/StepExecutionResourceProxyTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/resource/StepExecutionResourceProxyTests.java deleted file mode 100644 index a8dcd42ae..000000000 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/resource/StepExecutionResourceProxyTests.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2006-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.batch.core.resource; - -import java.io.File; -import java.io.IOException; - -import junit.framework.TestCase; - -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobInstance; -import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.JobParametersBuilder; -import org.springframework.batch.core.Step; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.step.StepSupport; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.io.DescriptiveResource; -import org.springframework.core.io.Resource; - -/** - * Unit tests for {@link StepExecutionResourceProxy} - * - * @author robert.kasanicky - * @author Lucas Ward - * @author Dave Syer - */ -public class StepExecutionResourceProxyTests extends TestCase { - - /** - * Object under test - */ - private StepExecutionResourceProxy resource = new StepExecutionResourceProxy(); - - private char pathsep = File.separatorChar; - - private String path = "data" + pathsep; - - private JobInstance jobInstance; - - private StepExecution stepExecution; - - /** - * mock step context - */ - - protected void setUp() throws Exception { - - jobInstance = new JobInstance(0L, new JobParameters(), "testJob"); - JobExecution jobExecution = new JobExecution(jobInstance); - Step step = new StepSupport("bar"); - stepExecution = jobExecution.createStepExecution(step.getName()); - resource.beforeStep(stepExecution); - - } - - /** - * regular use with valid context and pattern provided - */ - public void testCreateFileName() throws Exception { - doTestPathName("bar.txt", path); - } - - public void testNullFilePattern() throws Exception { - resource.setFilePattern(null); - try { - resource.beforeStep(stepExecution); - fail("Expected IllegalArgumentException"); - } - catch (IllegalArgumentException e) { - // expected - } - } - - public void testNonStandardFilePattern() throws Exception { - resource.setFilePattern("foo/data/%JOB_NAME%/" + "%STEP_NAME%-job"); - resource.beforeStep(stepExecution); - doTestPathName("bar-job", "foo" + pathsep + "data" + pathsep); - } - - public void testNonStandardFilePatternWithJobParameters() throws Exception { - resource.setFilePattern("foo/data/%JOB_NAME%/%job.key%-foo"); - jobInstance = new JobInstance(0L, new JobParametersBuilder().addString("job.key", "spam") - .toJobParameters(), "testJob"); - JobExecution jobExecution = new JobExecution(jobInstance); - Step step = new StepSupport("bar"); - resource.beforeStep(jobExecution.createStepExecution(step.getName())); - doTestPathName("spam-foo", "foo" + pathsep + "data" + pathsep); - } - -// public void testNonExistentJobParameter() throws Exception{ -// -// resource.setFilePattern("foo/data/%JOB_NAME%/%non.key%-foo"); -// jobInstance = new JobInstance(new Long(0), new JobParametersBuilder().addString("job.key", "spam") -// .toJobParameters(), "testJob"); -// JobExecution jobExecution = new JobExecution(jobInstance); -// Step step = new StepSupport("bar"); -// try{ -// resource.beforeStep(jobExecution.createStepExecution(step.getName())); -// fail(); -// } -// catch(Exception ex){ -// //expected, if there isn't a JobParameter for that key, it should throw an exception -// } -// } - - public void testLongJobParameter() throws Exception { - - resource.setFilePattern("foo/data/%JOB_NAME%/%job.key(long)%-foo"); - jobInstance = new JobInstance(0L, new JobParametersBuilder().addLong("job.key", 123L) - .toJobParameters(), "testJob"); - JobExecution jobExecution = new JobExecution(jobInstance); - Step step = new StepSupport("bar"); - resource.beforeStep(jobExecution.createStepExecution(step.getName())); - doTestPathName("123-foo", "foo" + pathsep + "data" + pathsep); - } - - public void testResoureLoaderAware() throws Exception { - resource = new StepExecutionResourceProxy(); - resource.setResourceLoader(new DefaultResourceLoader() { - public Resource getResource(String location) { - return new ByteArrayResource("foo".getBytes()); - } - }); - resource.beforeStep(stepExecution); - assertTrue(resource.exists()); - } - - /** - * toString delegates to the proxied resource. - */ - public void testToString() { - resource = new StepExecutionResourceProxy(); - resource.setResourceLoader(new DefaultResourceLoader() { - public Resource getResource(String location) { - return new DescriptiveResource("toStringTestResource") { - public String toString() { - return "to-string-test-resource"; - } - }; - } - }); - resource.beforeStep(stepExecution); - assertEquals("to-string-test-resource", resource.toString()); - } - - /** - * If delegate is not set toString returns the filePattern. - */ - public void testToStringWithNullDelegate() { - resource = new StepExecutionResourceProxy(); - String filePattern = "arbitrary pattern"; - resource.setFilePattern("arbitrary pattern"); - assertEquals(filePattern, resource.toString()); - } - - private void doTestPathName(String filename, String path) throws Exception, IOException { - String returnedPath = resource.getFile().getAbsolutePath(); - String absolutePath = new File(path + jobInstance.getJobName() + pathsep + filename).getAbsolutePath(); - assertEquals(absolutePath, returnedPath); - } - -} diff --git a/spring-batch-integration/src/main/java/org/springframework/batch/integration/file/FileToMessagesJobFactoryBean.java b/spring-batch-integration/src/main/java/org/springframework/batch/integration/file/FileToMessagesJobFactoryBean.java index e090306d8..8b5338509 100644 --- a/spring-batch-integration/src/main/java/org/springframework/batch/integration/file/FileToMessagesJobFactoryBean.java +++ b/spring-batch-integration/src/main/java/org/springframework/batch/integration/file/FileToMessagesJobFactoryBean.java @@ -15,13 +15,23 @@ */ package org.springframework.batch.integration.file; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.util.Properties; + import org.springframework.batch.core.Job; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.Step; +import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.StepExecutionListener; +import org.springframework.batch.core.converter.DefaultJobParametersConverter; +import org.springframework.batch.core.converter.JobParametersConverter; import org.springframework.batch.core.job.SimpleJob; +import org.springframework.batch.core.listener.StepExecutionListenerSupport; import org.springframework.batch.core.repository.JobRepository; -import org.springframework.batch.core.resource.StepExecutionResourceProxy; import org.springframework.batch.core.step.item.SimpleStepFactoryBean; import org.springframework.batch.integration.item.MessageChannelItemWriter; import org.springframework.batch.integration.launch.JobLaunchingMessageHandler; @@ -31,7 +41,10 @@ import org.springframework.batch.item.xml.StaxEventItemReader; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.annotation.Required; +import org.springframework.context.ResourceLoaderAware; +import org.springframework.core.io.FileSystemResourceLoader; import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.core.MessageChannel; import org.springframework.transaction.PlatformTransactionManager; @@ -65,6 +78,7 @@ public class FileToMessagesJobFactoryBean implements FactoryBean, BeanNameAwa /* * (non-Javadoc) + * * @see org.springframework.beans.factory.BeanNameAware#setBeanName(java.lang.String) */ public void setBeanName(String name) { @@ -77,7 +91,8 @@ public class FileToMessagesJobFactoryBean implements FactoryBean, BeanNameAwa * case there is no need to set the resource property as it will be set by * this factory. * - * @param itemReader the itemReader to set + * @param itemReader + * the itemReader to set */ @Required public void setItemReader(ItemReader itemReader) { @@ -87,7 +102,9 @@ public class FileToMessagesJobFactoryBean implements FactoryBean, BeanNameAwa /** * Public setter for the channel. Each item from the item reader will be * sent to this channel. - * @param channel the channel to set + * + * @param channel + * the channel to set */ @Required public void setChannel(MessageChannel channel) { @@ -96,7 +113,9 @@ public class FileToMessagesJobFactoryBean implements FactoryBean, BeanNameAwa /** * Public setter for the {@link JobRepository}. - * @param jobRepository the job repository to set + * + * @param jobRepository + * the job repository to set */ @Required public void setJobRepository(JobRepository jobRepository) { @@ -105,7 +124,9 @@ public class FileToMessagesJobFactoryBean implements FactoryBean, BeanNameAwa /** * Public setter for the {@link PlatformTransactionManager}. - * @param transactionManager the transaction manager to set + * + * @param transactionManager + * the transaction manager to set */ @Required public void setTransactionManager(PlatformTransactionManager transactionManager) { @@ -130,8 +151,8 @@ public class FileToMessagesJobFactoryBean implements FactoryBean, BeanNameAwa Assert.state((itemReader instanceof FlatFileItemReader) || (itemReader instanceof StaxEventItemReader), "ItemReader must be either a FlatFileItemReader or a StaxEventItemReader"); - StepExecutionResourceProxy resourceProxy = new StepExecutionResourceProxy(); - resourceProxy.setFilePattern("%" + ResourcePayloadAsJobParameterStrategy.FILE_INPUT_PATH + "%"); + JobParameterResourceProxy resourceProxy = new JobParameterResourceProxy(); + resourceProxy.setKey(ResourcePayloadAsJobParameterStrategy.FILE_INPUT_PATH); stepFactory.setListeners(new StepExecutionListener[] { resourceProxy }); setResource(itemReader, resourceProxy); stepFactory.setItemReader(itemReader); @@ -168,6 +189,7 @@ public class FileToMessagesJobFactoryBean implements FactoryBean, BeanNameAwa /** * Always returns {@link Job}. + * * @see org.springframework.beans.factory.FactoryBean#getObjectType() */ public Class getObjectType() { @@ -176,10 +198,176 @@ public class FileToMessagesJobFactoryBean implements FactoryBean, BeanNameAwa /** * Always true. TODO: should it be false? + * * @see org.springframework.beans.factory.FactoryBean#isSingleton() */ public boolean isSingleton() { return true; } + /** + * Strategy for resolving a filename just prior to step execution. The proxy + * is given a key that will correspond to a key in the job parameters. Just + * before the step is executed, the resource will be created with its + * filename as the value found in the job parameters. + * + * To use this resource it must be initialised with a {@link StepExecution}. + * The best way to do that is to register it as a listener in the step that + * is going to need it. For this reason the resource implements + * {@link StepExecutionListener}. + * + * @see Resource + */ + private class JobParameterResourceProxy extends StepExecutionListenerSupport implements Resource, + ResourceLoaderAware, StepExecutionListener { + + private JobParametersConverter jobParametersConverter = new DefaultJobParametersConverter(); + + private ResourceLoader resourceLoader = new FileSystemResourceLoader(); + + private Resource delegate; + + private String key = null; + + private static final String NOT_INITIALISED = "The delegate resource has not been initialised. " + + "Remember to register this object as a StepListener."; + + /** + * @param relativePath + * @throws IOException + * @see org.springframework.core.io.Resource#createRelative(java.lang.String) + */ + public Resource createRelative(String relativePath) throws IOException { + Assert.state(delegate != null, NOT_INITIALISED); + return delegate.createRelative(relativePath); + } + + /** + * @see org.springframework.core.io.Resource#exists() + */ + public boolean exists() { + Assert.state(delegate != null, NOT_INITIALISED); + return delegate.exists(); + } + + /** + * @see org.springframework.core.io.Resource#getDescription() + */ + public String getDescription() { + Assert.state(delegate != null, NOT_INITIALISED); + return delegate.getDescription(); + } + + /** + * @throws IOException + * @see org.springframework.core.io.Resource#getFile() + */ + public File getFile() throws IOException { + Assert.state(delegate != null, NOT_INITIALISED); + return delegate.getFile(); + } + + /** + * @see org.springframework.core.io.Resource#getFilename() + */ + public String getFilename() { + Assert.state(delegate != null, NOT_INITIALISED); + return delegate.getFilename(); + } + + /** + * @throws IOException + * @see org.springframework.core.io.InputStreamSource#getInputStream() + */ + public InputStream getInputStream() throws IOException { + Assert.state(delegate != null, NOT_INITIALISED); + return delegate.getInputStream(); + } + + /** + * @throws IOException + * @see org.springframework.core.io.Resource#getURI() + */ + public URI getURI() throws IOException { + Assert.state(delegate != null, NOT_INITIALISED); + return delegate.getURI(); + } + + /** + * @throws IOException + * @see org.springframework.core.io.Resource#getURL() + */ + public URL getURL() throws IOException { + Assert.state(delegate != null, NOT_INITIALISED); + return delegate.getURL(); + } + + /** + * @see org.springframework.core.io.Resource#isOpen() + */ + public boolean isOpen() { + Assert.state(delegate != null, NOT_INITIALISED); + return delegate.isOpen(); + } + + /** + * @see org.springframework.core.io.Resource#isReadable() + */ + public boolean isReadable() { + Assert.state(delegate != null, NOT_INITIALISED); + return delegate.isReadable(); + } + + /** + * @see org.springframework.core.io.Resource#lastModified() + */ + public long lastModified() throws IOException { + Assert.state(delegate != null, NOT_INITIALISED); + return delegate.lastModified(); + } + + /** + * Public setter for the {@link JobParametersConverter} used to + * translate {@link JobParameters} into {@link Properties}. Defaults to + * a {@link DefaultJobParametersConverter}. + * + * @param jobParametersConverter + * the {@link JobParametersConverter} to set + */ + public void setJobParametersFactory(JobParametersConverter jobParametersConverter) { + this.jobParametersConverter = jobParametersConverter; + } + + /** + * Always false because we are expecting to be step scoped. + * + * @see org.springframework.beans.factory.config.AbstractFactoryBean#isSingleton() + */ + public boolean isSingleton() { + return false; + } + + /** + * @see org.springframework.context.ResourceLoaderAware#setResourceLoader(org.springframework.core.io.ResourceLoader) + */ + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + public void setKey(String key) { + this.key = key; + } + + /** + * Collect the properties of the enclosing {@link StepExecution} that + * will be needed to create a file name. + * + * @see org.springframework.batch.core.StepExecutionListener#beforeStep(org.springframework.batch.core.StepExecution) + */ + public void beforeStep(StepExecution execution) { + Properties properties = jobParametersConverter.getProperties(execution.getJobExecution().getJobInstance() + .getJobParameters()); + delegate = resourceLoader.getResource(properties.getProperty(this.key)); + } + } }