[bs-22] Add tests for Yaml processing
* Gap in logic identified, so DocumentMatcher refactored to return an enum [#48127729] [bs-22] Add missing unit tests
This commit is contained in:
@@ -39,8 +39,8 @@ public class JobExecutionExitCodeGenerator implements
|
||||
@Override
|
||||
public int getExitCode() {
|
||||
for (JobExecution execution : this.executions) {
|
||||
if (execution.getStatus().isUnsuccessful()) {
|
||||
return 2;
|
||||
if (execution.getStatus().ordinal() > 0) {
|
||||
return execution.getStatus().ordinal();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
package org.springframework.bootstrap.autoconfigure.batch;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
@@ -34,7 +36,6 @@ import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
@Component
|
||||
// FIXME: what to do with more than one Job?
|
||||
public class JobLauncherCommandLineRunner implements CommandLineRunner,
|
||||
ApplicationEventPublisherAware {
|
||||
|
||||
@@ -46,8 +47,8 @@ public class JobLauncherCommandLineRunner implements CommandLineRunner,
|
||||
@Autowired
|
||||
private JobLauncher jobLauncher;
|
||||
|
||||
@Autowired
|
||||
private Job job;
|
||||
@Autowired(required = false)
|
||||
private Collection<Job> jobs = Collections.emptySet();
|
||||
|
||||
private ApplicationEventPublisher publisher;
|
||||
|
||||
@@ -63,10 +64,12 @@ public class JobLauncherCommandLineRunner implements CommandLineRunner,
|
||||
|
||||
protected void launchJobFromProperties(Properties properties)
|
||||
throws JobExecutionException {
|
||||
JobExecution execution = this.jobLauncher.run(this.job,
|
||||
this.converter.getJobParameters(properties));
|
||||
if (this.publisher != null) {
|
||||
this.publisher.publishEvent(new JobExecutionEvent(execution));
|
||||
for (Job job : this.jobs) {
|
||||
JobExecution execution = this.jobLauncher.run(job,
|
||||
this.converter.getJobParameters(properties));
|
||||
if (this.publisher != null) {
|
||||
this.publisher.publishEvent(new JobExecutionEvent(execution));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -44,7 +44,7 @@ public class YamlProcessor {
|
||||
}
|
||||
|
||||
public interface DocumentMatcher {
|
||||
boolean matches(Properties properties);
|
||||
MatchStatus matches(Properties properties);
|
||||
}
|
||||
|
||||
private static final Log logger = LogFactory.getLog(YamlProcessor.class);
|
||||
@@ -53,6 +53,22 @@ public class YamlProcessor {
|
||||
OVERRIDE, OVERRIDE_AND_IGNORE, FIRST_FOUND
|
||||
}
|
||||
|
||||
public static enum MatchStatus {
|
||||
|
||||
/**
|
||||
* A match was found.
|
||||
*/
|
||||
FOUND,
|
||||
/**
|
||||
* A match was not found.
|
||||
*/
|
||||
NOT_FOUND,
|
||||
/**
|
||||
* Not enough information to decide.
|
||||
*/
|
||||
ABSTAIN
|
||||
}
|
||||
|
||||
private ResolutionMethod resolutionMethod = ResolutionMethod.OVERRIDE;
|
||||
|
||||
private Resource[] resources = new Resource[0];
|
||||
@@ -93,8 +109,9 @@ public class YamlProcessor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Flag indicating that a document that contains none of the keys in the
|
||||
* {@link #setDocumentMatchers(List) document matchers} will nevertheless match.
|
||||
* Flag indicating that a document for which all the
|
||||
* {@link #setDocumentMatchers(List) document matchers} abstain will nevertheless
|
||||
* match.
|
||||
*
|
||||
* @param matchDefault the flag to set (default true)
|
||||
*/
|
||||
@@ -185,15 +202,19 @@ public class YamlProcessor {
|
||||
callback.process(properties, map);
|
||||
} else {
|
||||
boolean valueFound = false;
|
||||
MatchStatus result = MatchStatus.ABSTAIN;
|
||||
for (DocumentMatcher matcher : this.documentMatchers) {
|
||||
if (matcher.matches(properties)) {
|
||||
MatchStatus match = matcher.matches(properties);
|
||||
result = match.ordinal() < result.ordinal() ? match : result;
|
||||
if (match == MatchStatus.FOUND) {
|
||||
logger.debug("Matched document with document matcher: " + properties);
|
||||
callback.process(properties, map);
|
||||
valueFound = true;
|
||||
// No need to check for more matches
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!valueFound && this.matchDefault) {
|
||||
if (result == MatchStatus.ABSTAIN && this.matchDefault) {
|
||||
logger.debug("Matched document with default matcher: " + map);
|
||||
callback.process(properties, map);
|
||||
} else if (!valueFound) {
|
||||
@@ -240,41 +261,6 @@ public class YamlProcessor {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Matches a document containing a given key and where the value of that key matches
|
||||
* one of the given values (interpreted as a regex).
|
||||
*
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
public static class SimpleDocumentMatcher implements DocumentMatcher {
|
||||
|
||||
private String key;
|
||||
|
||||
private String[] patterns;
|
||||
|
||||
public SimpleDocumentMatcher(final String key, final String... patterns) {
|
||||
this.key = key;
|
||||
this.patterns = patterns;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Properties properties) {
|
||||
if (!properties.containsKey(this.key)) {
|
||||
return false;
|
||||
}
|
||||
String value = properties.getProperty(this.key);
|
||||
for (String pattern : this.patterns) {
|
||||
if (value == null || value.matches(pattern)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Matches a document containing a given key and where the value of that key is an
|
||||
* array containing one of the given values, or where one of the values matches one of
|
||||
@@ -296,20 +282,20 @@ public class YamlProcessor {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Properties properties) {
|
||||
public MatchStatus matches(Properties properties) {
|
||||
if (!properties.containsKey(this.key)) {
|
||||
return false;
|
||||
return MatchStatus.ABSTAIN;
|
||||
}
|
||||
Set<String> values = StringUtils.commaDelimitedListToSet(properties
|
||||
.getProperty(this.key));
|
||||
for (String pattern : this.patterns) {
|
||||
for (String value : values) {
|
||||
if (value.matches(pattern)) {
|
||||
return true;
|
||||
return MatchStatus.FOUND;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return MatchStatus.NOT_FOUND;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import java.util.Set;
|
||||
|
||||
import org.springframework.bootstrap.config.YamlProcessor.ArrayDocumentMatcher;
|
||||
import org.springframework.bootstrap.config.YamlProcessor.DocumentMatcher;
|
||||
import org.springframework.bootstrap.config.YamlProcessor.MatchStatus;
|
||||
import org.springframework.bootstrap.config.YamlPropertiesFactoryBean;
|
||||
import org.springframework.context.ApplicationContextInitializer;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
@@ -226,21 +227,20 @@ public class ConfigFileApplicationContextInitializer implements
|
||||
List<DocumentMatcher> matchers = new ArrayList<DocumentMatcher>();
|
||||
matchers.add(new DocumentMatcher() {
|
||||
@Override
|
||||
public boolean matches(Properties properties) {
|
||||
public MatchStatus matches(Properties properties) {
|
||||
String[] profiles = applicationContext.getEnvironment()
|
||||
.getActiveProfiles();
|
||||
if (profiles.length > 0) {
|
||||
return new ArrayDocumentMatcher("spring.profiles", profiles)
|
||||
.matches(properties);
|
||||
} else {
|
||||
return properties.getProperty("spring.profiles", "NONE")
|
||||
.contains("default");
|
||||
if (profiles.length == 0) {
|
||||
profiles = new String[] { "default" };
|
||||
}
|
||||
return new ArrayDocumentMatcher("spring.profiles", profiles)
|
||||
.matches(properties);
|
||||
|
||||
}
|
||||
});
|
||||
matchers.add(new DocumentMatcher() {
|
||||
@Override
|
||||
public boolean matches(Properties properties) {
|
||||
public MatchStatus matches(Properties properties) {
|
||||
if (!properties.containsKey("spring.profiles")) {
|
||||
Set<String> profiles = StringUtils
|
||||
.commaDelimitedListToSet(properties.getProperty(
|
||||
@@ -250,9 +250,9 @@ public class ConfigFileApplicationContextInitializer implements
|
||||
applicationContext.getEnvironment().addActiveProfile(profile);
|
||||
}
|
||||
// matches default profile
|
||||
return true;
|
||||
return MatchStatus.FOUND;
|
||||
} else {
|
||||
return false;
|
||||
return MatchStatus.NOT_FOUND;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user