Remove old groovy script code

pull/1/merge
Dave Syer 12 years ago
parent e8e059bc90
commit a5f7b6ead3

@ -1,27 +0,0 @@
# Spring Bootstrap Groovy
Spring Bootstrap Groovy gives you the quickest possible getting
started experience with Spring apps, whether you are writing a web
app, a batch job or a standalone java app.
## Building and Testing
To avoid problems with classpaths and existing JVM-based build tools,
Spring Bootstrap Groovy uses an exec plugin call to launch `groovyc`.
You need to have a `sh` on your path along with `groovyc` (2.1.x),
`find` and `xargs`. These tools are standard on a Mac or Linux
distribution, and available using Cygwin on Windows. Once it is
built, the zip file is portable.
Here are the steps to build and test:
$ mvn install
The `spring` executable is then available at
`spring-bootstrap-groovy/target/spring-<VERSION>`. There is also a jar
file with the Groovy Bootstrap components. The `spring` executable
includes jars from `SPRING_HOME` in the classpath so you can run it
while you are developing like this
$ export SPRING_HOME=<spring-bootstrap-groovy>/target
$ <spring-bootstrap-groovy>/src/main/scripts/spring App.groovy

@ -1,180 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.bootstrap</groupId>
<artifactId>spring-bootstrap-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>spring-bootstrap-groovy</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.bootstrap</groupId>
<artifactId>spring-bootstrap</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${dependency.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.ivy</groupId>
<artifactId>ivy</artifactId>
<version>2.2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>grapes</id>
<build>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
<configuration>
<filesets>
<fileset>
<directory>${user.home}/.groovy/grapes</directory>
<includes>
<include>org.springframework*/**</include>
</includes>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<resources>
<resource>
<directory>src/main/groovy</directory>
<filtering>true</filtering>
<targetPath>../generated-sources/groovy</targetPath>
</resource>
</resources>
<plugins>
<plugin>
<!-- Using exec plugin to compile groovy because it needs to be forked
cleanly. Only works if sh, find, xargs and groovyc are on PATH -->
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<id>compile-plugin</id>
<phase>compile</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>sh</executable>
<arguments>
<argument>-c</argument>
<argument>find target/generated-sources/groovy -name *.groovy |
xargs groovyc -d target/classes</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<inherited>false</inherited>
<configuration>
<descriptors>
<descriptor>src/main/assembly/descriptor.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-distribution</id>
<phase>install</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerId>groovy-eclipse-compiler</compilerId>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-eclipse-compiler</artifactId>
<version>2.7.0-01</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Tests.java</include>
</includes>
<excludes>
<exclude>**/Abstract*.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings
only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<versionRange>[3.0,)</versionRange>
<goals>
<goal>testCompile</goal>
<goal>compile</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<delimiters>
<delimiter>@@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

@ -1,30 +0,0 @@
<assembly>
<id>dist</id>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<baseDirectory>spring-${project.version}</baseDirectory>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>src/main/scripts</directory>
<outputDirectory>bin</outputDirectory>
<useDefaultExcludes>true</useDefaultExcludes>
</fileSet>
<fileSet>
<directory>src/main/resources</directory>
<outputDirectory>bin</outputDirectory>
<useDefaultExcludes>true</useDefaultExcludes>
<filtered>true</filtered>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<includes>
<include>org.springframework.bootstrap:spring-bootstrap-groovy:jar:*</include>
</includes>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>

@ -1,52 +0,0 @@
package org.springframework.bootstrap.grapes
@GrabResolver(name='spring-milestone', root='http://repo.springframework.org/milestone')
@GrabResolver(name='spring-snapshot', root='http://repo.springframework.org/snapshot')
@GrabConfig(systemClassLoader=true)
@Grab("org.springframework.bootstrap:spring-bootstrap:@@version@@")
@Grab("org.springframework.batch:spring-batch-core:2.2.0.M1")
@Grab("org.springframework:spring-context:@@dependency.springframework.version@@")
class BatchGrapes {
}
import org.springframework.bootstrap.context.annotation.ConditionalOnMissingBean
import org.springframework.bootstrap.CommandLineRunner
import org.springframework.batch.core.Job
import org.springframework.batch.core.converter.DefaultJobParametersConverter
import org.springframework.batch.core.converter.JobParametersConverter
import org.springframework.batch.core.launch.JobLauncher
import org.springframework.context.annotation.Configuration
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Bean
import org.springframework.util.StringUtils
import groovy.util.logging.Log
@Configuration
@ConditionalOnMissingBean(CommandLineRunner)
@Log
class BatchCommand {
@Autowired(required=false)
private JobParametersConverter converter = new DefaultJobParametersConverter()
@Autowired
private JobLauncher jobLauncher
@Autowired
private Job job
@Bean
CommandLineRunner batchCommandLineRunner() {
return new CommandLineRunner() {
void run(String... args) {
log.info("Running default command line with: ${args}")
launchJobFromProperties(StringUtils.splitArrayElementsIntoProperties(args, "="))
}
}
}
protected void launchJobFromProperties(Properties properties) {
jobLauncher.run(job, converter.getJobParameters(properties))
}
}

@ -1,40 +0,0 @@
package org.springframework.bootstrap.grapes
@GrabResolver(name='spring-milestone', root='http://repo.springframework.org/milestone')
@GrabConfig(systemClassLoader=true)
@Grab("org.springframework:spring-jdbc:4.0.0.BOOTSTRAP-SNAPSHOT")
@Grab("org.springframework.batch:spring-batch-core:2.2.0.M1")
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator
import javax.annotation.PostConstruct
import javax.sql.DataSource
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Configuration
import org.springframework.core.env.Environment
import org.springframework.core.io.ResourceLoader
@Configuration // TODO: make this conditional
class BatchInitializationGrapes {
@Autowired
private DataSource dataSource
@Autowired
private Environment environment
@Autowired
private ResourceLoader resourceLoader
@PostConstruct
protected void initialize() {
String platform = org.springframework.batch.support.DatabaseType.fromMetaData(dataSource).toString().toLowerCase()
if (platform=="hsql") {
platform = "hsqldb"
}
ResourceDatabasePopulator populator = new ResourceDatabasePopulator()
populator.addScript(resourceLoader.getResource("org/springframework/batch/core/schema-${platform}.sql"))
populator.setContinueOnError(true)
DatabasePopulatorUtils.execute(populator, dataSource)
}
}

@ -1,20 +0,0 @@
package org.springframework.bootstrap.grapes
// Spring stuff needs to be on the system classloader apparently (when using @Configuration)
@GrabResolver(name='spring-snapshot', root='http://repo.springframework.org/snapshot')
@GrabConfig(systemClassLoader=true)
@Grab("org.springframework:spring-context:@@dependency.springframework.version@@")
@Grab("org.springframework.bootstrap:spring-bootstrap:@@version@@")
@GrabExclude("commons-logging:commons-logging")
@Grab("org.slf4j:jcl-over-slf4j:1.6.1")
@Grab("org.slf4j:slf4j-jdk14:1.6.1")
class BootstrapGrapes {
}
import org.springframework.bootstrap.context.annotation.EnableAutoConfiguration
import org.springframework.context.annotation.Configuration
@Configuration
// @EnableAutoConfiguration
class BootstrapAutoConfiguration {
}

@ -1,92 +0,0 @@
package org.springframework.bootstrap.grapes
import org.springframework.core.type.StandardAnnotationMetadata
import org.springframework.util.ClassUtils
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory
import groovy.util.logging.Log
@GrabResolver(name='spring-snapshot', root='http://repo.springframework.org/snapshot')
@GrabConfig(systemClassLoader=true)
@Grab("org.springframework:spring-core:4.0.0.BOOTSTRAP-SNAPSHOT")
@GrabExclude("commons-logging:commons-logging")
@Grab("org.slf4j:jcl-over-slf4j:1.6.1")
@Grab("org.slf4j:slf4j-jdk14:1.6.1")
@Log
class Dependencies {
static List<String> defaults() {
return ["org.springframework.bootstrap.grapes.BootstrapGrapes"]
}
static List<String> dependencies(Collection<String> configs) {
def result = []
if (isWeb(configs)) {
log.info("Adding web dependencies.")
result.addAll(web())
}
if (isBatch(configs)) {
log.info("Adding batch dependencies.")
result.addAll(batch())
result << "org.springframework.bootstrap.grapes.BatchCommand"
result << "org.springframework.bootstrap.grapes.BatchInitializationGrapes"
}
if (isHadoop(configs)) {
log.info("Adding info dependencies.")
result.addAll(hadoop())
result << "org.springframework.bootstrap.grapes.HadoopContext"
}
return result
}
static String[] web() {
def result = []
result << "org.springframework.bootstrap.grapes.WebGrapes"
if (!isEmbeddedServerAvailable()) { result << "org.springframework.bootstrap.grapes.TomcatGrapes" }
return result
}
static String[] batch() {
def result = []
result << "org.springframework.bootstrap.grapes.BatchGrapes"
return result
}
static String[] hadoop() {
def result = []
result << "org.springframework.bootstrap.grapes.HadoopGrapes"
return result
}
static boolean isWeb(Collection<String> configs) {
SimpleMetadataReaderFactory factory = new SimpleMetadataReaderFactory()
return configs.any { config ->
def meta = factory.getMetadataReader(config).getAnnotationMetadata()
meta.hasAnnotation("org.springframework.stereotype.Controller") || meta.hasAnnotation("org.springframework.web.servlet.config.annotation.EnableWebMvc")
}
}
static boolean isHadoop(Collection<String> configs) {
SimpleMetadataReaderFactory factory = new SimpleMetadataReaderFactory()
return configs.any { config ->
config.contains("Hadoop")
}
}
static boolean isBatch(Collection<String> configs) {
SimpleMetadataReaderFactory factory = new SimpleMetadataReaderFactory()
return configs.any { config ->
def meta = factory.getMetadataReader(config).getAnnotationMetadata()
meta.hasAnnotation("org.springframework.batch.core.configuration.annotation.EnableBatchProcessing")
}
}
static boolean isEmbeddedServerAvailable() {
return ClassUtils.isPresent("org.apache.catalina.startup.Tomcat") || ClassUtils.isPresent("org.mortbay.jetty.Server")
}
}

@ -1,26 +0,0 @@
package org.springframework.bootstrap.grapes
@GrabConfig(systemClassLoader=true)
@Grab("org.springframework.data:spring-data-hadoop:1.0.0.RELEASE")
@Grab("org.springframework.bootstrap:spring-bootstrap:@@version@@")
@Grab("org.springframework:spring-context:4.0.0.BOOTSTRAP-SNAPSHOT")
@Grab("org.apache.hadoop:hadoop-examples:1.0.4")
@GrabExclude("org.mortbay.jetty:sevlet-api-2.5")
@GrabExclude("org.mortbay.jetty:jetty")
@GrabExclude("org.mortbay.jetty:jetty-util")
@GrabExclude("org.mortbay.jetty:jsp-2.1")
@GrabExclude("org.mortbay.jetty:jsp-api-2.1")
@GrabExclude("tomcat:jasper-runtime")
@GrabExclude("tomcat:jasper-compiler")
class HadoopGrapes {
}
import org.springframework.bootstrap.context.annotation.ConditionalOnMissingBean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.ImportResource
@Configuration
@ConditionalOnMissingBean(org.apache.hadoop.conf.Configuration)
@ImportResource("hadoop-context.xml")
class HadoopContext {
}

@ -1,9 +0,0 @@
package org.springframework.bootstrap.grapes
@GrabConfig(systemClassLoader=true)
// Grab some Tomcat dependencies
@Grab("org.apache.tomcat.embed:tomcat-embed-core:7.0.32")
// JULI logging has sensible defaults in JAVA_HOME, so no need for user to create it
@Grab("org.apache.tomcat.embed:tomcat-embed-logging-juli:7.0.32")
class TomcatGrapes {
}

@ -1,5 +0,0 @@
package org.springframework.bootstrap.grapes
@Grab("org.springframework:spring-webmvc:4.0.0.BOOTSTRAP-SNAPSHOT")
class WebGrapes {
}

@ -1,20 +0,0 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:hdp="http://www.springframework.org/schema/hadoop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/hadoop http://www.springframework.org/schema/hadoop/spring-hadoop.xsd">
<hdp:resource-loader id="hadoopResourceLoader" />
<hdp:configuration>
fs.default.name=${hd.fs:hdfs://localhost:9000}
</hdp:configuration>
<bean id="defaultResourceLoaders" class="org.springframework.data.hadoop.fs.CustomResourceLoaderRegistrar" p:loader-ref="hadoopResourceLoader" />
</beans>

@ -1,100 +0,0 @@
import org.codehaus.groovy.control.customizers.ASTTransformationCustomizer
import org.codehaus.groovy.ast.ClassHelper
import groovy.util.logging.Log
def bootstrap = 'org.springframework.bootstrap.grapes.BootstrapGrapes' as Class
void addImport(module, path) {
def name = path.lastIndexOf('.').with {it != -1 ? path[it+1..<path.length()] : path}
if (name=="*") {
// Doesn't work?
name = path.lastIndexOf('.').with {path[0..<it] }
module.addStarImport(name, [])
} else {
module.addImport(name, ClassHelper.make(path), [])
}
}
withConfig(configuration) {
ast(Log)
imports {
normal 'javax.sql.DataSource'
normal 'org.springframework.stereotype.Component'
normal 'org.springframework.stereotype.Controller'
normal 'org.springframework.stereotype.Repository'
normal 'org.springframework.stereotype.Service'
normal 'org.springframework.beans.factory.annotation.Autowired'
normal 'org.springframework.beans.factory.annotation.Value'
normal 'org.springframework.context.annotation.Import'
normal 'org.springframework.context.annotation.ImportResource'
normal 'org.springframework.context.annotation.Profile'
normal 'org.springframework.context.annotation.Scope'
normal 'org.springframework.context.annotation.Configuration'
normal 'org.springframework.context.annotation.Bean'
normal 'org.springframework.bootstrap.CommandLineRunner'
}
def dependencySource = "org.springframework.bootstrap.grapes.Dependencies" as Class // TODO: maybe strategise this
inline(phase:'CONVERSION') { source, context, classNode ->
def module = source.getAST()
if (classNode.name.contains("Hadoop")) {
def hadoop = dependencySource.hadoop() as Class[]
['org.springframework.data.hadoop.mapreduce.JobRunner',
'org.springframework.data.hadoop.mapreduce.JobFactoryBean'
].each { path -> addImport(module, path) }
module.addImport("HadoopConfiguration", ClassHelper.make("org.apache.hadoop.conf.Configuration"), [])
}
classNode.annotations.each {
def name = it.classNode.name
if (name=='Controller' || name=='EnableWebMvc') {
def web = dependencySource.web() as Class[]
['org.springframework.web.bind.annotation.RequestBody',
'org.springframework.web.bind.annotation.RequestParam',
'org.springframework.web.bind.annotation.PathVariable',
'org.springframework.web.bind.annotation.RequestHeader',
'org.springframework.web.bind.annotation.RequestMethod',
'org.springframework.web.bind.annotation.RequestBody',
'org.springframework.web.bind.annotation.ResponseBody',
'org.springframework.web.bind.annotation.ResponseStatus',
'org.springframework.web.bind.annotation.RequestMapping',
'org.springframework.web.bind.annotation.ExceptionHandler',
'org.springframework.web.bind.annotation.ModelAttribute',
'org.springframework.web.bind.annotation.CookieValue',
'org.springframework.web.servlet.config.annotation.EnableWebMvc',
'org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry',
'org.springframework.web.servlet.config.annotation.ViewControllerRegistry',
'org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter'].each { path -> addImport(module, path) }
}
if (name=='EnableBatchProcessing') {
def batch = dependencySource.batch() as Class[]
['org.springframework.batch.repeat.RepeatStatus',
'org.springframework.batch.core.scope.context.ChunkContext',
'org.springframework.batch.core.step.tasklet.Tasklet',
'org.springframework.batch.core.configuration.annotation.StepScope',
'org.springframework.batch.core.configuration.annotation.JobBuilderFactory',
'org.springframework.batch.core.configuration.annotation.StepBuilderFactory',
'org.springframework.batch.core.configuration.annotation.EnableBatchProcessing',
'org.springframework.batch.core.Step',
'org.springframework.batch.core.StepExecution',
'org.springframework.batch.core.StepContribution',
'org.springframework.batch.core.Job',
'org.springframework.batch.core.JobExecution',
'org.springframework.batch.core.JobParameter',
'org.springframework.batch.core.JobParameters',
'org.springframework.batch.core.launch.JobLauncher',
'org.springframework.batch.core.converter.DefaultJobParametersConverter'].each { path -> addImport(module, path) }
}
}
}
}

@ -1,33 +0,0 @@
##############################################################################
## ##
## Groovy Classloading Configuration ##
## ##
##############################################################################
##
## $Revision$ $Date$
##
## Note: do not add classes from java.lang here. No rt.jar and on some
## platforms no tools.jar
##
## See http://groovy.codehaus.org/api/org/codehaus/groovy/tools/LoaderConfiguration.html
## for the file format
# load required libraries
load !{groovy.home}/lib/a*.jar
load !{groovy.home}/lib/b*.jar
load !{groovy.home}/lib/c*.jar
load !{groovy.home}/lib/g*.jar
load !{groovy.home}/lib/h*.jar
load !{groovy.home}/lib/i*.jar
load !{groovy.home}/lib/j*.jar
load !{groovy.home}/lib/q*.jar
load !{groovy.home}/lib/t*.jar
load !{groovy.home}/lib/x*.jar
# load user specific libraries
load !{user.home}/.groovy/lib/*.jar
# tools.jar for ant tasks
load ${tools.jar}

@ -1,163 +0,0 @@
#!/bin/bash
# OS specific support (must be 'true' or 'false').
cygwin=false;
darwin=false;
case "`uname`" in
CYGWIN*)
cygwin=true
;;
Darwin*)
darwin=true
;;
esac
if [ "$SPRING_HOME" == "" ]; then
SPRING_HOME=`cd "$(dirname $0)"/.. && pwd`
fi
SPRING_BIN=$(dirname $0)
export GROOVY_CONF="${SPRING_BIN}"/groovy.conf
SPRING_HANDLER=auto
TARGETDIR=target/classes
if [ -f build.gradle ]; then
TARGETDIR=build/classes/main
fi
mkdir -p "${TARGETDIR%/}"
function find_classfile {
classname="$( echo ${1%%.groovy} | sed -e 's,.*/,,')"
package="$( grep ^package ${1} | sed -e 's,package\s,,g' -e 's,;,,g' -e 's,\.,/,g')"
if [ "${package}" != "" ]; then package="${package}/"; fi
for f in $( find "${TARGETDIR}" -name "${classname}.class" ); do
if [ "${f}" == "${TARGETDIR}/${package}${classname}.class" ]; then
echo $f; return 0
fi
done
}
function is_compile_needed {
config=$1
STATOPTS="-c %X"
if $darwin; then STATOPTS="-f %Dm"; fi
# Compile .groovy files if necessary
if [ ! -f ${config} ]; then
echo "File ${config} does not exist. Did you point at the wrong file?"
exit 3
else
classfile=$( find_classfile ${config} )
if [ ! -f "${classfile}" -o $(stat "${STATOPTS}" ${config}) -gt $(stat "${STATOPTS}" ${classfile} 2>/dev/null || echo 0) ]; then
return 0
fi
fi
return 1
}
function is_option {
echo "$1" | grep -q "^--.*"
}
function is_groovy {
[ "${1%%.groovy}" != "${1}" ]
}
function convert_config_to_class {
classfile=$( find_classfile ${config} )
if [ -z "${classfile}" ]; then
echo "No class found for ${config}. Compiler failed or class not defined?"
exit 1
fi
config="${classfile#${TARGETDIR}/}"
while [ "${config%/*}" != "${config}" ]; do
config="${config%/*}"."${config##*/}"
done
}
config=$1; shift
configs=()
compilables=()
while [ "$config" != "" ]; do
if is_groovy "$config"; then
if is_compile_needed "${config}"; then
compilables[${#compilables[@]}]="${config}"
fi
configs[${#configs[@]}]="${config}"
elif is_option "${config}"; then
case "${config%=*}" in
"--handler") SPRING_HANDLER="${config#*=}";;
esac
else
args[${#args[@]}]="${config}"
fi
config=$1; shift
done
CLASSPATH="${SPRING_BIN}":"${TARGETDIR}"
for f in "${SPRING_HOME}"/lib/*.jar; do
CLASSPATH="${CLASSPATH}":$f
done
for f in "${SPRING_HOME}"/*.jar; do
CLASSPATH="${CLASSPATH}":$f
done
if $cygwin; then
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
fi
if [ "${#compilables[@]}" -gt 0 ]; then
groovyc -cp "${CLASSPATH}" --configscript "$SPRING_BIN"/customizer.groovy -d "${TARGETDIR}" "${compilables[@]}"
fi
config_classes=("org.springframework.bootstrap.grapes.BootstrapAutoConfiguration.class")
for config in "${configs[@]}"; do
convert_config_to_class
config_classes[${#config_classes[@]}]="${config}"
done
if [ "${#config_classes[@]}" == "0" ]; then
echo "No files to run."
exit 2
fi
exec groovy -cp "${CLASSPATH}" -Dspring.home="${SPRING_HOME}" --configscript "$SPRING_BIN"/customizer.groovy "$SPRING_BIN"/spring-"${SPRING_HANDLER}".groovy "${config_classes[@]}" "${args[@]}"

@ -1,24 +0,0 @@
// Get the args and turn them into classes
def configs = []
def parameters = []
args.each { arg ->
if (arg.endsWith(".class")) {
configs << arg.replaceAll(".class", "")
} else {
parameters << arg
}
}
// Dynamically grab some dependencies
def dependencySource = "org.springframework.bootstrap.grapes.Dependencies" as Class // TODO: maybe strategise this
def dependencies = [*dependencySource.defaults(), *dependencySource.dependencies(configs)]
configs = dependencies + configs
// Do this before any Spring auto stuff is used in case it enhances the classpath
configs = configs as Class[]
parameters = parameters as String[]
// Now run the application
def applicationClass = "org.springframework.bootstrap.SpringApplication" as Class
applicationClass.run(configs, parameters)

@ -1,27 +0,0 @@
// Spring stuff needs to be on the system classloader apparently (when using @Configuration)
@GrabResolver(name='spring-milestone', root='http://maven.springframework.org/milestone')
@GrabConfig(systemClassLoader=true)
@Grab("org.springframework:spring-context:4.0.0.BOOTSTRAP-SNAPSHOT")
@GrabExclude("commons-logging:commons-logging")
@Grab("org.slf4j:jcl-over-slf4j:1.6.1")
@Grab("org.slf4j:slf4j-jdk14:1.6.1")
import org.springframework.context.annotation.AnnotationConfigApplicationContext
// Now create a Spring context
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext()
// Get the args and turn them into classes
def configs = []
def parameters = []
boolean endconfigs = false
args.each { arg ->
if (arg.endsWith(".class")) {
configs += arg.replaceAll(".class", "")
} else {
parameters += arg
}
}
configs = configs as Class[]
parameters = parameters as String[]
// Register the config classes, can be @Configuration or @Component etc.
ctx.register(configs)
ctx.refresh()

@ -1,8 +0,0 @@
@Controller
class App {
@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World!"
}
}

@ -1,4 +0,0 @@
@Configuration
class Empty {
}

@ -1,30 +0,0 @@
@Grab("org.hsqldb:hsqldb-j5:2.0.0")
@EnableBatchProcessing
class JobConfig {
@Autowired
private JobBuilderFactory jobs
@Autowired
private StepBuilderFactory steps
@Bean
protected Tasklet tasklet() {
return new Tasklet() {
RepeatStatus execute(StepContribution contribution, ChunkContext context) {
return RepeatStatus.FINISHED
}
}
}
@Bean
Job job() throws Exception {
return jobs.get("job").start(step1()).build()
}
@Bean
protected Step step1() throws Exception {
return steps.get("step1").tasklet(tasklet()).build()
}
}

@ -1,18 +0,0 @@
import java.io.File;
import org.springframework.bootstrap.CommandLineRunner;
@Component
class Signal implements CommandLineRunner {
private File messages = new File("target/messages")
boolean ready = false
@Override
void run(String... args) {
messages.mkdirs()
new File(messages, "ready").write("Ready!")
ready = true
}
}

@ -1,174 +0,0 @@
/*
* Cloud Foundry 2012.02.03 Beta
* Copyright (c) [2009-2012] VMware, Inc. All Rights Reserved.
*
* This product is licensed to you under the Apache License, Version 2.0 (the "License").
* You may not use this product except in compliance with the License.
*
* This product includes a number of subcomponents with
* separate copyright notices and license terms. Your use of these
* subcomponents is subject to the terms and conditions of the
* subcomponent's license, as noted in the LICENSE file.
*/
package org.springframework.bootstrap.groovy
/**
* <p>As part of the gvm test suite we need to launch a bash shell and execute
* multiple commands in it. This is tricky to do using Java's support for
* working with external processes as the API can't tell you when a command
* has finished executing.</p>
* <p>This class provides some hacks that allow you to serially execute commands
* in an external bash process in a fairly reliable manner and to retrieve the
* output of those commands.</p>
*/
class BashEnv {
static final PROMPT = ""
static final EXIT_CODE_CMD = 'echo "Exit code is: $?"'
static final EXIT_CODE_PATTERN = ~/Exit code is: (\d+)\s*${PROMPT}?$/
private final Object outputLock = new Object()
def exitCode
def process
def processOutput = new StringBuilder()
def commandOutput
// Command timeout in milliseconds
def timeout = 5000
def workDir
def env
BashEnv(workDir, Map env) {
this.workDir = workDir as File
env = env + [PS1: PROMPT]
this.env = env.collect { k, v -> k + '=' + v }
}
/**
* Starts the external bash process.
*/
void start() {
process = ["bash", "--noprofile", "--norc", "-i"].execute(env, workDir)
consumeProcessStream(process.inputStream)
consumeProcessStream(process.errorStream)
}
/**
* Stops the external bash process and waits for it to finish.
*/
void stop() {
execute("exit")
process.waitFor()
}
/**
* Sends a command line to the external bash process and returns once the
* command has finished executing. If the command is interactive and requires
* input during it's execution (for example a y/n answer to a question) you
* can provide that input as a list of strings.
*/
void execute(String cmdline, List inputs = []) {
resetOutput()
if (cmdline != "exit") {
exitCode = null
}
process.outputStream << cmdline << "\n"
process.outputStream.flush()
if (cmdline != "exit") {
for (input in inputs) {
process.outputStream << input << "\n"
}
process.outputStream << EXIT_CODE_CMD << "\n"
process.outputStream.flush()
}
def start = System.currentTimeMillis()
while (cmdline != "exit") {
Thread.sleep 100
synchronized (outputLock) {
// Remove all the extraneous text that's not related to the
// command's output. This includes the command string itself,
// the 'echo' command to display the command's exit code, and
// the exit code line.
removeFromOutput(cmdline + "\n")
removeFromOutput(PROMPT + EXIT_CODE_CMD + "\n")
def str = processOutput.toString()
def m = EXIT_CODE_PATTERN.matcher(str)
commandOutput = str
if (m) {
exitCode = m[0][1]
// Remove this exit code line from the output.
commandOutput = m.replaceAll('')
break
}
// If the command times out, we should break out of the loop and
// display whatever output has already been produced.
if (System.currentTimeMillis() - start > timeout) {
commandOutput = "ALERT! Command timed out. Last output was:\n\n${processOutput}"
break
}
}
}
}
/**
* Returns the exit code of the last command that was executed.
*/
int getStatus() {
if (!exitCode) throw new IllegalStateException("Did you run execute() before getting the status?")
return exitCode.toInteger()
}
/**
* Returns the text output (both stdout and stderr) of the last command
* that was executed.
*/
String getOutput() {
return commandOutput
}
/**
* Clears the saved command output.
*/
void resetOutput() {
synchronized (outputLock) {
processOutput = new StringBuilder()
}
}
private void consumeProcessStream(final InputStream stream) {
char[] buffer = new char[256]
Thread.start {
def reader = new InputStreamReader(stream)
def charsRead = 0
while (charsRead != -1) {
charsRead = reader.read(buffer, 0, 256)
if (charsRead > 0) {
synchronized (outputLock) {
processOutput.append(buffer, 0, charsRead)
}
}
}
}
}
private void removeFromOutput(String line) {
synchronized (outputLock) {
def pos = processOutput.indexOf(line)
if (pos != -1) {
processOutput.delete(pos, pos + line.size() - 1)
}
}
}
}

@ -1,70 +0,0 @@
/*
* Cloud Foundry 2012.02.03 Beta
* Copyright (c) [2009-2012] VMware, Inc. All Rights Reserved.
*
* This product is licensed to you under the Apache License, Version 2.0 (the "License").
* You may not use this product except in compliance with the License.
*
* This product includes a number of subcomponents with
* separate copyright notices and license terms. Your use of these
* subcomponents is subject to the terms and conditions of the
* subcomponent's license, as noted in the LICENSE file.
*/
package org.springframework.bootstrap.groovy;
import static org.junit.Assert.*
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import org.junit.After
import org.junit.Before
import org.junit.Test
/**
* @author Dave Syer
*
*/
class ScriptTests {
private BashEnv bash
private ExecutorService executor = Executors.newFixedThreadPool(2)
@Before
void init() {
bash = new BashEnv(".", [SPRING_HOME: "target"])
bash.start()
bash.execute("export GVM_DIR=~/.gvm")
bash.execute("source ~/.gvm/bin/gvm-init.sh")
assertEquals("You need to install gvm to run these tests", 0, bash.status)
bash.execute("gvm use groovy 2.1.0")
assertEquals("You need to do this before running the tests: > gvm install groovy 2.1.0", 0, bash.status)
}
@After
void clean() {
bash?.stop()
}
@Test
void testVanillaApplicationContext() {
execute(bash, "src/main/scripts/spring src/test/apps/Empty.groovy")
assertEquals(0, bash.status)
}
@Test
void testBatchApplicationContext() {
execute(bash, "src/main/scripts/spring src/test/apps/JobConfig.groovy foo=bar")
assertEquals(0, bash.status)
assertTrue(bash.output.contains("[SimpleJob: [name=job]] completed with the following parameters: [{foo=bar}]"))
}
private void execute(BashEnv bash, String cmdline) {
bash.execute(cmdline)
if (bash.exitCode && bash.status!=0) {
println "Unsuccessful execution (${cmdline}). Output: \n${bash.output}"
}
}
}

@ -1,94 +0,0 @@
/*
* Cloud Foundry 2012.02.03 Beta
* Copyright (c) [2009-2012] VMware, Inc. All Rights Reserved.
*
* This product is licensed to you under the Apache License, Version 2.0 (the "License").
* You may not use this product except in compliance with the License.
*
* This product includes a number of subcomponents with
* separate copyright notices and license terms. Your use of these
* subcomponents is subject to the terms and conditions of the
* subcomponent's license, as noted in the LICENSE file.
*/
package org.springframework.bootstrap.groovy;
import static org.junit.Assert.*
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import org.junit.After
import org.junit.Before
import org.junit.Ignore
import org.junit.Test
import org.springframework.web.client.RestTemplate
/**
* @author Dave Syer
*
*/
class WebScriptTests {
private BashEnv bash
private ExecutorService executor = Executors.newFixedThreadPool(2)
private File messages = new File("target/messages")
@Before
void init() {
assertTrue("Couldn't delete messages directory", messages.deleteDir())
bash = new BashEnv(".", [SPRING_HOME: "target"])
bash.start()
bash.execute("export GVM_DIR=~/.gvm")
bash.execute("source ~/.gvm/bin/gvm-init.sh")
assertEquals("You need to install gvm to run these tests", 0, bash.status)
bash.execute("gvm use groovy 2.1.0")
assertEquals("You need to do this before running the tests: > gvm install groovy 2.1.0", 0, bash.status)
}
@After
void clean() {
killit()
bash?.stop()
}
@Test
@Ignore
void testWebApplicationContext() {
executor.submit {
execute(bash, "src/main/scripts/spring src/test/apps/App.groovy src/test/apps/Signal.groovy")
}
File ready = new File(messages, "ready")
long timeout = 10000
long t0 = System.currentTimeMillis()
while (!ready.exists() && System.currentTimeMillis() - t0 < timeout) {
println "Waiting for app to start"
Thread.sleep(1000)
}
if (ready.exists()) {
println ready.text
} else {
fail("Timed out waiting for app to start")
}
// assertEquals(0, bash.status)
def response = new RestTemplate().getForEntity("http://localhost:8080", String.class)
assertEquals("Hello World!", response.body)
}
private void killit() {
BashEnv reaper = new BashEnv(".", [SPRING_HOME: "target"])
reaper.start()
reaper?.execute("pkill -9 -f '\\--configscript src/main/scripts/customizer.groovy'")
reaper?.stop()
}
private void execute(BashEnv bash, String cmdline) {
bash.execute(cmdline)
if (bash.exitCode && bash.status!=0) {
println "Unsuccessful execution (${cmdline}). Output: \n${bash.output}"
}
}
}
Loading…
Cancel
Save