@Grab("org.springframework.zero:spring-actuator:0.5.0.BUILD-SNAPSHOT") @Grab("org.codehaus.groovy:groovy-ant:2.1.6") @Grab("org.codehaus.groovy.modules.http-builder:http-builder:0.5.2") @Grab(group='net.sf.json-lib', module='json-lib', version='2.3', classifier='jdk15') import groovyx.net.http.* @Controller @Log class MainController { @Value('${info.home:http://localhost:8080/}') private String home @Value('${TMPDIR:.}') private String tmpdir private gettingStartedRepos = [] @RequestMapping("/") @ResponseBody String home() { def model = [:] model["styles"] = [[name:"Standard", value:""]] model["styles"] << [name:"Web", value:"web"] model["styles"] << [name:"Actuator", value:"actuator"] model["styles"] << [name:"Batch", value:"batch"] model["styles"] << [name:"JPA", value:"jpa"] model["types"] = [[name:"Maven POM", value:"pom", selected: true], [name:"Maven Project", value:"pomproject", selected: false]] template "home.html", model } @RequestMapping("/installer") @ResponseBody String installer(@RequestHeader(required=false) String host) { template "installer.sh", [host: host!=null ? host : home] } @RequestMapping("/spring") @ResponseBody ResponseEntity 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/**") } } log.info("Downloading: " + download) new ResponseEntity(download.bytes, ["Content-Type":"application/zip"] as HttpHeaders, HttpStatus.OK) } @RequestMapping("/starter") @ResponseBody ResponseEntity spring(PomRequest request) { def model = [:] String pom = new String(pom(request, model).body) File dir = File.createTempFile("tmp","",new File(tmpdir)); dir.delete() dir.mkdirs() new File(dir, "pom.xml").write(pom) File src = new File(new File(dir, "src/main/java"),request.packageName.replace(".", "/")) src.mkdirs() def body = template "Application.java", model log.info("Creating: " + src + "Application.java") new File(src, "Application.java").write(body) File download = new File(tmpdir, dir.name + ".zip") log.info("Creating: " + download) new AntBuilder().zip(destfile: download) { zipfileset(dir:dir, includes:"**") } log.info("Downloading: " + download) new ResponseEntity(download.bytes, ["Content-Type":"application/zip"] as HttpHeaders, HttpStatus.OK) } @RequestMapping("/pom") @ResponseBody ResponseEntity pom(PomRequest request, Map model) { def style = request.style log.info("Styles requested: " + style) model.groupId = request.groupId model.artifactId = request.artifactId model.version = request.version model.name = request.name model.description = request.description model.packageName = request.packageName if (style==null || style.size()==0) { style = [""] } model["styles"] = style.collect{ it=="" ? "" : "-" + it } log.info("Model: " + model) def body = template "starter-pom.xml", model new ResponseEntity(body, ["Content-Type":"application/octet-stream"] as HttpHeaders, HttpStatus.OK) } @RequestMapping("/gs") @ResponseBody String gettingStartedList(@RequestHeader("Authorization") auth) { if (gettingStartedRepos.empty) { RESTClient github = new RESTClient("https://api.github.com") if (auth) { github.headers['Authorization'] = auth } github.headers['User-Agent'] = 'Mozilla/4.0' def names = github.get( path : "orgs/springframework-meta/repos").data.collect { it.name } names = names.findAll { it.startsWith "gs-"} gettingStartedRepos = names.collect { [repo:it, name:it.split("-").findAll{it!="gs"}.collect{it.capitalize()}.join(" ")]} } template "gs.html", [repos:gettingStartedRepos] } @RequestMapping("/gs/{repo}") @ResponseBody ResponseEntity gettingStartedProject(java.security.Principal principal, @RequestHeader("Authorization") auth, @PathVariable String repo) { RESTClient github = new RESTClient("https://api.github.com") if (auth) { github.headers['Authorization'] = auth } github.headers['User-Agent'] = 'Mozilla/4.0' def body = github.get( path : "repos/springframework-meta/${repo}/zipball/master").data.bytes log.info("Downloaded: " + body.length + " bytes of ${repo} for ${principal.name}") new ResponseEntity(body, ["Content-Type":"application/zip"] as HttpHeaders, HttpStatus.OK) } } import org.springframework.actuate.properties.SecurityProperties @EnableWebSecurity @Configuration @Log class SecurityConfiguration { @Bean(name = "org.springframework.actuate.properties.SecurityProperties") SecurityProperties securityProperties() { SecurityProperties security = new SecurityProperties() security.getBasic().setPath("/gs/**") security.getBasic().setRealm("Github Credentials") security } @Bean AuthenticationManager authenticationManager() { new AuthenticationManager() { Authentication authenticate(Authentication authentication) { log.info("Authenticating: " + authentication.name) new UsernamePasswordAuthenticationToken(authentication.name, "", AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER")) } } } } class PomRequest { def style = [] String name = "demo" String description = "Demo project for Spring Zero" String groupId = "org.test" String artifactId String version = "0.0.1.SNAPSHOT" String packageName String getName() { artifactId == null ? name : artifactId } String getPackageName() { packageName == null ? name : packageName } }