From 57bcd734d11007b250f4c4aa0b0332f709bd2d13 Mon Sep 17 00:00:00 2001 From: Chris Manning Date: Fri, 20 Mar 2015 15:24:34 -0400 Subject: [PATCH] Adding endpoint for .json similar to .yml, .yaml, and .properties Fixes gh-113, fixes gh-112 --- .../config/server/EnvironmentController.java | 76 ++++++++++++------- .../server/EnvironmentControllerTests.java | 28 ++++++- 2 files changed, 75 insertions(+), 29 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/EnvironmentController.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/EnvironmentController.java index 688351b8..6cbc1b71 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/EnvironmentController.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/EnvironmentController.java @@ -1,11 +1,7 @@ package org.springframework.cloud.config.server; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; import javax.servlet.http.HttpServletResponse; @@ -72,31 +68,35 @@ public class EnvironmentController { @RequestMapping("/{label}/{name}-{profiles}.properties") public ResponseEntity labelledProperties(@PathVariable String name, @PathVariable String profiles, @PathVariable String label) throws IOException { - if (name.contains("-") || profiles.contains("-")) { - throw new IllegalArgumentException( - "Properties output not supported for name or profiles containing hyphens"); - } + validateNameAndProfiles(name, profiles); Map properties = convertToProperties(labelled(name, profiles, label)); - return getSuccess(sortLines(properties)); + return getSuccess(getPropertiesString(properties)); } - private String sortLines(Map properties) throws IOException { - List list = new ArrayList(); - for (Entry entry : properties.entrySet()) { - if (entry.getKey().equals("spring.profiles")) { - continue; - } - String line = entry.getKey() + ": " + entry.getValue(); - list.add(line); - } - Collections.sort(list); + @RequestMapping("{name}-{profiles}.json") + public ResponseEntity> jsonProperties(@PathVariable String name, + @PathVariable String profiles) throws IOException { + return labelledJsonProperties(name, profiles, defaultLabel); + } + + @RequestMapping("/{label}/{name}-{profiles}.json") + public ResponseEntity> labelledJsonProperties(@PathVariable String name, + @PathVariable String profiles, @PathVariable String label) throws IOException { + validateNameAndProfiles(name, profiles); + Map properties = convertToProperties(labelled(name, profiles, + label)); + return getSuccess(properties); + } + + private String getPropertiesString(Map properties) { StringBuilder output = new StringBuilder(); - for (String item : list) { + for (Entry entry : properties.entrySet()) { if (output.length() > 0) { output.append("\n"); } - output.append(item); + String line = entry.getKey() + ": " + entry.getValue(); + output.append(line); } return output.toString(); } @@ -136,10 +136,25 @@ public class EnvironmentController { response.sendError(HttpStatus.BAD_REQUEST.value()); } + private void validateNameAndProfiles(String name, String profiles) { + if (name.contains("-") || profiles.contains("-")) { + throw new IllegalArgumentException( + "Properties output not supported for name or profiles containing hyphens"); + } + } + + private HttpHeaders getHttpHeaders(MediaType mediaType) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(mediaType); + return httpHeaders; + } + private ResponseEntity getSuccess(String body) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.TEXT_PLAIN); - return new ResponseEntity(body, headers, HttpStatus.OK); + return new ResponseEntity<>(body, getHttpHeaders(MediaType.TEXT_PLAIN), HttpStatus.OK); + } + + private ResponseEntity> getSuccess(Map body) { + return new ResponseEntity<>(body, getHttpHeaders(MediaType.APPLICATION_JSON), HttpStatus.OK); } /** @@ -193,7 +208,7 @@ public class EnvironmentController { } private Map convertToProperties(Environment profiles) { - Map map = new LinkedHashMap(); + Map map = new TreeMap(); List sources = new ArrayList( profiles.getPropertySources()); Collections.reverse(sources); @@ -202,9 +217,18 @@ public class EnvironmentController { Map value = (Map) source.getSource(); map.putAll(value); } + postProcessProperties(map); return map; } + private void postProcessProperties(Map propertiesMap) { + for(String key : propertiesMap.keySet()) { + if(key.equals("spring.profiles")) { + propertiesMap.remove(key); + } + } + } + /** * @param defaultLabel */ diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/EnvironmentControllerTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/EnvironmentControllerTests.java index b6062f8b..0f594356 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/EnvironmentControllerTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/EnvironmentControllerTests.java @@ -29,9 +29,6 @@ import org.junit.rules.ExpectedException; import org.mockito.Mockito; import org.springframework.cloud.config.environment.Environment; import org.springframework.cloud.config.environment.PropertySource; -import org.springframework.cloud.config.server.EncryptionController; -import org.springframework.cloud.config.server.EnvironmentController; -import org.springframework.cloud.config.server.EnvironmentRepository; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -180,6 +177,31 @@ public class EnvironmentControllerTests { MockMvcResultMatchers.status().isBadRequest()); } + @Test + public void mappingforLabelledJsonProperties() throws Exception { + Mockito.when(repository.findOne("foo", "bar", "other")).thenReturn(environment); + MockMvc mvc = MockMvcBuilders.standaloneSetup(controller).build(); + mvc.perform(MockMvcRequestBuilders.get("/other/foo-bar.json")).andExpect( + MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON)); + } + + @Test + public void mappingforJsonProperties() throws Exception { + Mockito.when(repository.findOne("foo", "bar", "master")).thenReturn(environment); + MockMvc mvc = MockMvcBuilders.standaloneSetup(controller).build(); + mvc.perform(MockMvcRequestBuilders.get("/foo-bar.json")).andExpect( + MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON)); + } + + @Test + public void mappingForLabelledJsonPropertiesWithHyphen() throws Exception { + Mockito.when(repository.findOne("foo", "bar-spam", "other")).thenReturn( + environment); + MockMvc mvc = MockMvcBuilders.standaloneSetup(controller).build(); + mvc.perform(MockMvcRequestBuilders.get("/other/foo-bar-spam.json")).andExpect( + MockMvcResultMatchers.status().isBadRequest()); + } + @Test public void allowOverrideFalse() throws Exception { controller.setOverrides(Collections.singletonMap("foo", "bar"));