From be60079b1caa52ceda22a30213a4cb158b7dfab1 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Sun, 18 Dec 2016 14:37:16 -0800 Subject: [PATCH] Add support for rendering mustache views and start with the get/200 view --- build.gradle | 1 + .../io/lasagna/httpwizard/HttpWizard.groovy | 9 ++++- .../httpwizard/HttpWizardConfiguration.groovy | 6 ++++ .../httpwizard/StandardResponse.groovy | 10 ++++++ .../lasagna/httpwizard/resources/Get.groovy | 36 +++++++++++++++---- .../views/standard-response.mustache | 21 +++++++++++ 6 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/views/standard-response.mustache diff --git a/build.gradle b/build.gradle index 90ea1bf..61ce87c 100644 --- a/build.gradle +++ b/build.gradle @@ -31,6 +31,7 @@ repositories { dependencies { compile 'org.codehaus.groovy:groovy-all:[2.4.7,2.5.0)' compile "io.dropwizard:dropwizard-core:${dropwizardVersion}" + compile "io.dropwizard:dropwizard-views-mustache:${dropwizardVersion}" testCompile "io.dropwizard:dropwizard-testing:${dropwizardVersion}" testCompile 'org.spockframework:spock-core:1.0-groovy-2.4' diff --git a/src/main/groovy/io/lasagna/httpwizard/HttpWizard.groovy b/src/main/groovy/io/lasagna/httpwizard/HttpWizard.groovy index a0312a7..e1d0c4a 100644 --- a/src/main/groovy/io/lasagna/httpwizard/HttpWizard.groovy +++ b/src/main/groovy/io/lasagna/httpwizard/HttpWizard.groovy @@ -21,9 +21,11 @@ package io.lasagna.httpwizard import io.lasagna.httpwizard.checks.VersionCheck import io.lasagna.httpwizard.resources.GetResource +import com.google.common.collect.ImmutableMap import io.dropwizard.Application import io.dropwizard.setup.Bootstrap import io.dropwizard.setup.Environment +import io.dropwizard.views.ViewBundle /** * HttpWizard is the main Dropwizard application class @@ -44,6 +46,11 @@ class HttpWizard extends Application { @Override void initialize(Bootstrap bootstrap) { - /* nothing to do yet */ + bootstrap.addBundle(new ViewBundle() { + @Override + ImmutableMap> getViewConfiguration(HttpWizardConfiguration c) { + return c.viewRendererConfiguration + } + }) } } diff --git a/src/main/groovy/io/lasagna/httpwizard/HttpWizardConfiguration.groovy b/src/main/groovy/io/lasagna/httpwizard/HttpWizardConfiguration.groovy index 15a7f9b..37d9f5e 100644 --- a/src/main/groovy/io/lasagna/httpwizard/HttpWizardConfiguration.groovy +++ b/src/main/groovy/io/lasagna/httpwizard/HttpWizardConfiguration.groovy @@ -18,6 +18,8 @@ package io.lasagna.httpwizard +import com.fasterxml.jackson.annotation.JsonProperty +import com.google.common.collect.ImmutableMap import io.dropwizard.Configuration import org.hibernate.validator.constraints.NotEmpty @@ -29,4 +31,8 @@ import org.hibernate.validator.constraints.NotEmpty class HttpWizardConfiguration extends Configuration { @NotEmpty String appVersion + + @JsonProperty + private ImmutableMap> \ + viewRendererConfiguration = ImmutableMap.of() } diff --git a/src/main/groovy/io/lasagna/httpwizard/StandardResponse.groovy b/src/main/groovy/io/lasagna/httpwizard/StandardResponse.groovy index c0fbb07..d5db800 100644 --- a/src/main/groovy/io/lasagna/httpwizard/StandardResponse.groovy +++ b/src/main/groovy/io/lasagna/httpwizard/StandardResponse.groovy @@ -19,7 +19,9 @@ package io.lasagna.httpwizard import com.fasterxml.jackson.annotation.JsonProperty +import javax.ws.rs.core.HttpHeaders import javax.ws.rs.core.MultivaluedMap +import javax.ws.rs.core.UriInfo /** * @@ -30,4 +32,12 @@ class StandardResponse { @JsonProperty String uri + + + static StandardResponse fromRequest(UriInfo info, HttpHeaders headers) { + StandardResponse r = new StandardResponse() + r.uri = info.absolutePath + r.headers = headers.requestHeaders + return r + } } diff --git a/src/main/groovy/io/lasagna/httpwizard/resources/Get.groovy b/src/main/groovy/io/lasagna/httpwizard/resources/Get.groovy index d97b567..f8023d7 100644 --- a/src/main/groovy/io/lasagna/httpwizard/resources/Get.groovy +++ b/src/main/groovy/io/lasagna/httpwizard/resources/Get.groovy @@ -20,30 +20,52 @@ package io.lasagna.httpwizard.resources import io.lasagna.httpwizard.StandardResponse +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.SerializationFeature + +import com.google.common.base.Charsets import com.codahale.metrics.annotation.Metered import groovy.transform.TypeChecked import javax.ws.rs.core.Context -import javax.ws.rs.core.UriInfo import javax.ws.rs.core.HttpHeaders +import javax.ws.rs.core.MediaType +//import javax.ws.rs.core.Response +import javax.ws.rs.core.UriInfo +import javax.ws.rs.DefaultValue import javax.ws.rs.GET +import javax.ws.rs.QueryParam import javax.ws.rs.Path import javax.ws.rs.Produces -import javax.ws.rs.core.MediaType +import io.dropwizard.views.View @Path('/get') -@Produces(MediaType.APPLICATION_JSON) @TypeChecked class GetResource { @GET @Path('200') @Metered + @Produces(MediaType.APPLICATION_JSON) StandardResponse returns200(@Context UriInfo ui, @Context HttpHeaders headers) { - StandardResponse r = new StandardResponse() - r.uri = ui.absolutePath - r.headers = headers.requestHeaders - return r + return StandardResponse.fromRequest(ui, headers) } + @GET + @Path('200') + @Metered + @Produces(MediaType.TEXT_HTML) + View returns200(@DefaultValue('true') @QueryParam('pretty') boolean pretty, + @Context UriInfo ui, + @Context HttpHeaders headers) { + return new View('/views/standard-response.mustache', Charsets.UTF_8) { + String getTitle() { return ui.path } + String getUri() { return ui.absolutePath } + String getJson() { + ObjectMapper mapper = new ObjectMapper() + mapper.enable(SerializationFeature.INDENT_OUTPUT) + return mapper.writeValueAsString(StandardResponse.fromRequest(ui, headers)) + } + } + } } diff --git a/src/main/resources/views/standard-response.mustache b/src/main/resources/views/standard-response.mustache new file mode 100644 index 0000000..0a88900 --- /dev/null +++ b/src/main/resources/views/standard-response.mustache @@ -0,0 +1,21 @@ + + + + + {{title}} + + + +
+

+ {{title}} +

+
+

+

{{json}}
+

+ + +