Files
initializr/app.groovy

283 lines
7.5 KiB
Groovy
Raw Normal View History

2013-08-04 13:50:06 +01:00
package app
@Grab('spring-boot-starter-actuator')
@Grab('org.codehaus.groovy:groovy-ant:2.3.2')
@Controller
@Log
class MainController {
@Value('${info.home:http://localhost:8080/}')
private String home
2014-06-05 11:52:53 +01:00
@Value('${info.spring-boot.version}')
2014-04-01 17:22:18 +01:00
private String bootVersion
@Value('${TMPDIR:.}')
private String tmpdir
2013-08-04 13:50:06 +01:00
@Autowired
private Reactor reactor
2014-05-28 19:25:35 +01:00
@Autowired
private Projects projects
2014-05-30 09:50:24 +01:00
@RequestMapping(value='/')
@ResponseBody
Projects projects() {
projects
}
@RequestMapping(value='/', produces='text/html')
@ResponseBody
String home() {
def model = [:]
2014-06-05 11:52:53 +01:00
projects.properties.each { model[it.key] = it.value }
template 'home.html', model
}
@RequestMapping('/spring')
@ResponseBody
ResponseEntity<byte[]> spring() {
File download = new File(tmpdir, 'spring.zip')
if (!download.exists()) {
log.info('Creating: ' + download)
new AntBuilder().zip(destfile: download) {
zipfileset(dir:'.', includes:'spring/bin/**', filemode:'775')
zipfileset(dir:'.', includes:'spring/**', excludes:'spring/bin/**')
}
}
2014-05-29 16:26:47 +01:00
log.info('Uploading: ' + download)
new ResponseEntity<byte[]>(download.bytes, ['Content-Type':'application/zip'] as HttpHeaders, HttpStatus.OK)
}
@RequestMapping(value='/starter.tgz', produces='application/x-compress')
2013-07-22 14:40:50 +01:00
@ResponseBody
2014-04-01 19:46:00 +01:00
ResponseEntity<byte[]> springTgz(PomRequest request) {
2014-06-05 13:26:32 +01:00
File dir = getProjectFiles(request)
2014-04-01 19:46:00 +01:00
File download = new File(tmpdir, dir.name + '.tgz')
2014-06-05 13:26:32 +01:00
addTempFile(dir.name, download)
2014-04-01 19:46:00 +01:00
new AntBuilder().tar(destfile: download, compression: 'gzip') {
zipfileset(dir:dir, includes:'**')
2014-04-01 19:46:00 +01:00
}
log.info("Uploading: ${download} (${download.bytes.length} bytes)")
def result = new ResponseEntity<byte[]>(download.bytes, ['Content-Type':'application/x-compress'] as HttpHeaders, HttpStatus.OK)
2014-04-01 19:46:00 +01:00
2014-06-05 13:26:32 +01:00
cleanTempFiles(dir.name)
2014-04-01 19:46:00 +01:00
result
}
@RequestMapping('/starter.zip')
2014-04-01 19:46:00 +01:00
@ResponseBody
ResponseEntity<byte[]> springZip(PomRequest request) {
2014-06-05 13:26:32 +01:00
def dir = getProjectFiles(request)
2014-04-01 19:46:00 +01:00
File download = new File(tmpdir, dir.name + '.zip')
2014-06-05 13:26:32 +01:00
addTempFile(dir.name, download)
2014-04-01 19:46:00 +01:00
new AntBuilder().zip(destfile: download) {
zipfileset(dir:dir, includes:'**')
2014-04-01 19:46:00 +01:00
}
log.info("Uploading: ${download} (${download.bytes.length} bytes)")
def result = new ResponseEntity<byte[]>(download.bytes, ['Content-Type':'application/zip'] as HttpHeaders, HttpStatus.OK)
2014-04-01 19:46:00 +01:00
2014-06-05 13:26:32 +01:00
cleanTempFiles(dir.name)
2014-04-01 19:46:00 +01:00
result
}
2014-06-05 13:26:32 +01:00
private void addTempFile(String group, File file) {
reactor.notify('/temp/' + group, Event.wrap(file))
}
private void cleanTempFiles(String group) {
reactor.notify('/clean/' + group)
}
2013-07-22 14:40:50 +01:00
2014-06-05 13:26:32 +01:00
def getProjectFiles(PomRequest request) {
2013-08-04 13:50:06 +01:00
2013-07-22 14:40:50 +01:00
def model = [:]
2014-06-05 13:26:32 +01:00
File dir = File.createTempFile('tmp','',new File(tmpdir));
addTempFile(dir.name, dir)
2013-07-22 14:40:50 +01:00
dir.delete()
dir.mkdirs()
2014-04-01 19:46:00 +01:00
2014-05-29 16:26:47 +01:00
if (request.type.contains('gradle')) {
String gradle = new String(gradle(request, model).body)
new File(dir, 'build.gradle').write(gradle)
} else {
String pom = new String(pom(request, model).body)
new File(dir, 'pom.xml').write(pom)
}
2014-04-01 19:46:00 +01:00
2014-05-30 09:50:24 +01:00
String language = request.language
File src = new File(new File(dir, 'src/main/' + language),request.packageName.replace('.', '/'))
2013-07-22 14:40:50 +01:00
src.mkdirs()
2014-05-30 09:50:24 +01:00
write(src, 'Application.' + language, model)
2014-05-29 16:26:47 +01:00
if (request.packaging=='war') {
2014-05-30 09:50:24 +01:00
write(src, 'ServletInitializer.' + language, model)
2014-05-29 16:26:47 +01:00
}
2013-07-22 14:40:50 +01:00
2014-05-30 09:50:24 +01:00
File test = new File(new File(dir, 'src/test/' + language),request.packageName.replace('.', '/'))
test.mkdirs()
if (model.styles.contains('-web')) {
model.testAnnotations = '@WebAppConfiguration\n'
model.testImports = 'import org.springframework.test.context.web.WebAppConfiguration;\n'
} else {
model.testAnnotations = ''
model.testImports = ''
}
2014-05-30 09:50:24 +01:00
write(test, 'ApplicationTests.' + language, model)
File resources = new File(dir, 'src/main/resources')
2014-04-01 08:57:06 +01:00
resources.mkdirs()
new File(resources, 'application.properties').write('')
2014-04-01 08:57:06 +01:00
2014-06-05 11:52:53 +01:00
if (request.isWebStyle()) {
new File(dir, 'src/main/resources/templates').mkdirs()
new File(dir, 'src/main/resources/static').mkdirs()
}
2014-06-05 13:26:32 +01:00
dir
2013-07-22 14:40:50 +01:00
}
def write(File src, String name, def model) {
def body = template name, model
new File(src, name).write(body)
}
@RequestMapping('/pom')
@ResponseBody
2013-07-22 14:40:50 +01:00
ResponseEntity<byte[]> pom(PomRequest request, Map model) {
2014-04-01 17:22:18 +01:00
model.bootVersion = bootVersion
new ResponseEntity<byte[]>(render('starter-pom.xml', request, model), ['Content-Type':'application/octet-stream'] as HttpHeaders, HttpStatus.OK)
2014-01-21 15:34:41 +00:00
}
@RequestMapping('/build')
2014-01-21 15:34:41 +00:00
@ResponseBody
ResponseEntity<byte[]> gradle(PomRequest request, Map model) {
2014-04-01 17:22:18 +01:00
model.bootVersion = bootVersion
new ResponseEntity<byte[]>(render('starter-build.gradle', request, model), ['Content-Type':'application/octet-stream'] as HttpHeaders, HttpStatus.OK)
2014-01-21 15:34:41 +00:00
}
byte[] render(String path, PomRequest request, Map model) {
2014-06-05 11:52:53 +01:00
if (request.packaging=='war' && !request.isWebStyle()) {
2014-05-29 16:26:47 +01:00
request.style << 'web'
}
2014-06-05 11:52:53 +01:00
log.info("Styles requested: ${request.style}, Type requested: ${request.type}")
request.properties.each { model[it.key] = it.value }
model.styles = fixStyles(request.style)
template path, model
}
2014-05-29 16:26:47 +01:00
2014-06-05 11:52:53 +01:00
private def fixStyles(def style) {
if (style==null || style.size()==0) {
style = ['']
}
if (!style.class.isArray() && !(style instanceof Collection)) {
style = [style]
}
style = style.collect{ it=='jpa' ? 'data-jpa' : it }
2014-06-05 11:52:53 +01:00
style.collect{ it=='' ? '' : '-' + it }
2014-05-29 16:26:47 +01:00
}
2013-06-06 12:19:15 +01:00
}
2014-05-28 17:26:53 +01:00
@EnableReactor
2014-05-28 19:25:35 +01:00
@Consumer
2013-08-04 13:50:06 +01:00
@Log
class TemporaryFileCleaner {
@Autowired
Reactor reactor
2014-06-05 13:26:32 +01:00
private Map files = [:].withDefault { [] }
@Selector(value='/temp/{stem}', type=SelectorType.URI)
void add(Event<File> file) {
String stem = file.headers.stem
files[stem] << file.data
}
@Selector(value='/clean/{stem}', type=SelectorType.URI)
void clean(Event<File> event) {
String stem = event.headers.stem
def tempFiles = files.remove(stem)
2014-05-29 16:26:47 +01:00
log.fine 'Tempfiles: ' + tempFiles
2014-06-05 13:26:32 +01:00
tempFiles.each { File file ->
if (file.directory) {
file.deleteDir()
} else {
file.delete()
2014-05-28 19:25:35 +01:00
}
}
2013-08-04 13:50:06 +01:00
}
}
class PomRequest {
def style = []
String name = 'demo'
String type = 'starter'
String description = 'Demo project for Spring Boot'
String groupId = 'org.test'
String artifactId
String version = '0.0.1-SNAPSHOT'
2014-05-29 16:26:47 +01:00
String packaging = 'jar'
2014-05-30 09:50:24 +01:00
String language = 'java'
String packageName
2014-05-30 06:18:33 +01:00
String javaVersion = '1.7'
2013-08-04 13:50:06 +01:00
String getArtifactId() {
artifactId == null ? name : artifactId
}
String getPackageName() {
2013-08-16 17:39:01 +01:00
packageName == null ? name.replace('-', '.') : packageName
}
2014-06-05 11:52:53 +01:00
boolean isWebStyle() {
style.any { webStyle(it) }
}
private boolean webStyle(String style) {
style.contains('web') || style.contains('thymeleaf') || style.contains('freemarker') || style.contains('velocity') || style.contains('groovy-template')
}
2013-08-16 17:39:01 +01:00
}
2014-05-28 19:25:35 +01:00
@Component
2014-05-28 19:25:35 +01:00
@ConfigurationProperties(prefix='projects', ignoreUnknownFields=false)
class Projects {
List<Map<String,Object>> styles
2014-05-29 16:26:47 +01:00
List<Type> types
List<Packaging> packagings
2014-05-30 06:18:33 +01:00
List<JavaVersion> javaVersions
2014-05-30 09:50:24 +01:00
List<Language> languages
static class Language {
String name
String value
boolean selected
}
2014-05-30 06:18:33 +01:00
static class JavaVersion {
String value
boolean selected
}
2014-05-29 16:26:47 +01:00
static class Packaging {
String name
String value
boolean selected
}
static class Type {
String name
String action
String value
boolean selected
}
2014-05-28 19:25:35 +01:00
}