From 6964e0bc8578abcbdf7e49ffa36c49197df67787 Mon Sep 17 00:00:00 2001 From: Szymon Szukalski Date: Tue, 23 Jul 2024 21:25:54 +1000 Subject: Enforce text/xml+marker content type for /import endpoint --- .../com/stileeducation/markr/config/WebConfig.java | 17 +++++++++ .../markr/controller/TestResultsController.java | 4 +- .../markr/converter/XmlMarkrMessageConverter.java | 43 ++++++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/stileeducation/markr/config/WebConfig.java create mode 100644 src/main/java/com/stileeducation/markr/converter/XmlMarkrMessageConverter.java (limited to 'src/main/java/com/stileeducation') diff --git a/src/main/java/com/stileeducation/markr/config/WebConfig.java b/src/main/java/com/stileeducation/markr/config/WebConfig.java new file mode 100644 index 0000000..6d9c1a0 --- /dev/null +++ b/src/main/java/com/stileeducation/markr/config/WebConfig.java @@ -0,0 +1,17 @@ +package com.stileeducation.markr.config; + +import com.stileeducation.markr.converter.XmlMarkrMessageConverter; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void extendMessageConverters(List> converters) { + converters.add(new XmlMarkrMessageConverter()); + } +} diff --git a/src/main/java/com/stileeducation/markr/controller/TestResultsController.java b/src/main/java/com/stileeducation/markr/controller/TestResultsController.java index f5f8a44..5667027 100644 --- a/src/main/java/com/stileeducation/markr/controller/TestResultsController.java +++ b/src/main/java/com/stileeducation/markr/controller/TestResultsController.java @@ -20,8 +20,8 @@ public class TestResultsController { this.testResultsService = testResultsService; } - // TODO - update to consume text/xml+markr, consider return value - @PostMapping(value = IMPORT_ENDPOINT, consumes = "application/xml", produces = "application/json") + // TODO consider return value + @PostMapping(value = IMPORT_ENDPOINT, consumes = "text/xml+markr", produces = "application/json") public ResponseEntity handleXmlRequest(@RequestBody MCQTestResultsDTO testResults) { testResultsService.importTestResults(testResults); return new ResponseEntity<>(HttpStatus.NO_CONTENT); diff --git a/src/main/java/com/stileeducation/markr/converter/XmlMarkrMessageConverter.java b/src/main/java/com/stileeducation/markr/converter/XmlMarkrMessageConverter.java new file mode 100644 index 0000000..04207a1 --- /dev/null +++ b/src/main/java/com/stileeducation/markr/converter/XmlMarkrMessageConverter.java @@ -0,0 +1,43 @@ +package com.stileeducation.markr.converter; + +import com.stileeducation.markr.dto.MCQTestResultsDTO; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.Marshaller; +import jakarta.xml.bind.Unmarshaller; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter; + +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import java.util.Collections; +import java.util.List; + +public class XmlMarkrMessageConverter extends AbstractXmlHttpMessageConverter { + + public static final MediaType MEDIA_TYPE = new MediaType("text", "xml+markr"); + + @Override + protected MCQTestResultsDTO readFromSource(Class clazz, HttpHeaders headers, Source source) throws Exception { + JAXBContext jaxbContext = JAXBContext.newInstance(MCQTestResultsDTO.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + return (MCQTestResultsDTO) unmarshaller.unmarshal(source); + } + + @Override + protected void writeToResult(MCQTestResultsDTO testResultsDTO, HttpHeaders headers, Result result) throws Exception { + JAXBContext jaxbContext = JAXBContext.newInstance(MCQTestResultsDTO.class); + Marshaller marshaller = jaxbContext.createMarshaller(); + marshaller.marshal(testResultsDTO, result); + } + + @Override + protected boolean supports(Class clazz) { + return MCQTestResultsDTO.class.isAssignableFrom(clazz); + } + + @Override + public List getSupportedMediaTypes() { + return Collections.singletonList(MEDIA_TYPE); + } +} -- cgit v1.2.3