Polish calling of ExitCodeGenerators

This commit is contained in:
Phillip Webb 2013-05-08 14:45:58 -07:00
parent 589ef1868d
commit 44947b13a8

View File

@ -579,46 +579,56 @@ public class SpringApplication {
/**
* Static helper that can be used to exit a {@link SpringApplication} and obtain a
* code indicating success (0) or otherwise. Does not throw exceptions but should
* print stack traces of any encountered.
* print stack traces of any encountered. Applies the specified
* {@link ExitCodeGenerator} in addition to any Spring beans that implement
* {@link ExitCodeGenerator}. In the case of multiple exit codes the highest value
* will be used (or if all values are negative, the lowest value will be used)
* @param context the context to close if possible
* @param exitCodeGenerators exist code generators
* @return the outcome (0 if successful)
*/
public static int exit(ApplicationContext context,
ExitCodeGenerator... exitCodeGenerators) {
int code = 0;
List<ExitCodeGenerator> exiters = new ArrayList<ExitCodeGenerator>(
Arrays.asList(exitCodeGenerators));
int exitCode = 0;
try {
exiters.addAll(context.getBeansOfType(ExitCodeGenerator.class).values());
for (ExitCodeGenerator exiter : exiters) {
try {
int value = exiter.getExitCode();
if (value > code || value < 0 && value < code) {
code = value;
}
} catch (Exception e) {
code = code == 0 ? 1 : code;
e.printStackTrace();
}
}
if (context instanceof ConfigurableApplicationContext) {
ConfigurableApplicationContext closable = (ConfigurableApplicationContext) context;
closable.close();
try {
List<ExitCodeGenerator> generators = new ArrayList<ExitCodeGenerator>();
generators.addAll(Arrays.asList(exitCodeGenerators));
generators.addAll(context.getBeansOfType(ExitCodeGenerator.class)
.values());
exitCode = getExitCode(generators);
} finally {
close(context);
}
} catch (Exception e) {
code = code == 0 ? 1 : code;
e.printStackTrace();
exitCode = (exitCode == 0 ? 1 : exitCode);
}
return exitCode;
}
return code;
private static int getExitCode(List<ExitCodeGenerator> exitCodeGenerators) {
int exitCode = 0;
for (ExitCodeGenerator exitCodeGenerator : exitCodeGenerators) {
try {
int value = exitCodeGenerator.getExitCode();
if (value > 0 && value > exitCode || value < 0 && value < exitCode) {
exitCode = value;
}
} catch (Exception e) {
exitCode = (exitCode == 0 ? 1 : exitCode);
e.printStackTrace();
}
}
return exitCode;
}
private static void close(ApplicationContext context) {
if (context instanceof ConfigurableApplicationContext) {
ConfigurableApplicationContext closable = (ConfigurableApplicationContext) context;
closable.close();
}
}
}