[bs-29] Support for XML configuration in groovy apps
Mixed .groovy and .xml now supported bia spring CLI, e.g. $ spring samples/runner.groovy samples/runner.xml [Fixes #48059037]
This commit is contained in:
@@ -22,6 +22,7 @@ import groovy.lang.GroovyClassLoader.ClassCollector;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.codehaus.groovy.ast.ClassNode;
|
||||
@@ -81,6 +82,21 @@ public class GroovyCompiler {
|
||||
.addCompilationCustomizers(new CompilerAutoConfigureCustomizer());
|
||||
}
|
||||
|
||||
public Object[] sources(File[] files) throws CompilationFailedException, IOException {
|
||||
List<File> compilables = new ArrayList<File>();
|
||||
List<Object> others = new ArrayList<Object>();
|
||||
for (File file : files) {
|
||||
if (file.getName().endsWith(".groovy") || file.getName().endsWith(".java")) {
|
||||
compilables.add(file);
|
||||
} else {
|
||||
others.add(file);
|
||||
}
|
||||
}
|
||||
Class<?>[] compiled = compile(compilables.toArray(new File[compilables.size()]));
|
||||
others.addAll(0, Arrays.asList(compiled));
|
||||
return others.toArray(new Object[others.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compile the specified Groovy source files, applying any
|
||||
* {@link CompilerAutoConfiguration}s. All classes defined in the files will be
|
||||
|
||||
@@ -75,13 +75,13 @@ public class BootstrapRunner {
|
||||
stop();
|
||||
|
||||
// Compile
|
||||
Class<?>[] classes = this.compiler.compile(this.files);
|
||||
if (classes.length == 0) {
|
||||
Object[] sources = this.compiler.sources(this.files);
|
||||
if (sources.length == 0) {
|
||||
throw new RuntimeException("No classes found in '" + this.files + "'");
|
||||
}
|
||||
|
||||
// Run in new thread to ensure that the context classloader is setup
|
||||
this.runThread = new RunThread(classes);
|
||||
this.runThread = new RunThread(sources);
|
||||
this.runThread.start();
|
||||
this.runThread.join();
|
||||
|
||||
@@ -106,18 +106,18 @@ public class BootstrapRunner {
|
||||
*/
|
||||
private class RunThread extends Thread {
|
||||
|
||||
private final Class<?>[] classes;
|
||||
private final Object[] sources;
|
||||
|
||||
private Object applicationContext;
|
||||
|
||||
/**
|
||||
* Create a new {@link RunThread} instance.
|
||||
* @param classes the classes to launch
|
||||
* @param sources the sources to launch
|
||||
*/
|
||||
public RunThread(Class<?>... classes) {
|
||||
this.classes = classes;
|
||||
if (classes.length != 0) {
|
||||
setContextClassLoader(classes[0].getClassLoader());
|
||||
public RunThread(Object... sources) {
|
||||
this.sources = sources;
|
||||
if (sources.length != 0 && sources[0] instanceof Class) {
|
||||
setContextClassLoader(((Class<?>) sources[0]).getClassLoader());
|
||||
}
|
||||
setDaemon(true);
|
||||
}
|
||||
@@ -130,7 +130,7 @@ public class BootstrapRunner {
|
||||
"org.springframework.bootstrap.SpringApplication");
|
||||
Method method = application.getMethod("run", Object[].class,
|
||||
String[].class);
|
||||
this.applicationContext = method.invoke(null, this.classes,
|
||||
this.applicationContext = method.invoke(null, this.sources,
|
||||
BootstrapRunner.this.args);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
|
||||
@@ -134,4 +134,11 @@ public class SampleIntegrationTests {
|
||||
assertTrue("Wrong output: " + output, output.contains("Hello, World"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void xmlSample() throws Exception {
|
||||
start("samples/app.xml", "samples/runner.groovy");
|
||||
String output = getOutput();
|
||||
assertTrue("Wrong output: " + output, output.contains("Hello World"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user