From dec9426a777b307b207e8a13d02f91b7c07c16f2 Mon Sep 17 00:00:00 2001 From: Allen Averbukh Date: Wed, 29 Jan 2025 16:44:42 -0800 Subject: [PATCH] changed xml to be nonconcurrent --- .../github/ambry/frontend/s3/S3MessagePayload.java | 14 +++++++------- .../ambry/frontend/s3/S3BatchDeleteHandler.java | 8 ++++---- .../ambry/frontend/S3BatchDeleteHandlerTest.java | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ambry-api/src/main/java/com/github/ambry/frontend/s3/S3MessagePayload.java b/ambry-api/src/main/java/com/github/ambry/frontend/s3/S3MessagePayload.java index 65a780e4df..94550dd05e 100644 --- a/ambry-api/src/main/java/com/github/ambry/frontend/s3/S3MessagePayload.java +++ b/ambry-api/src/main/java/com/github/ambry/frontend/s3/S3MessagePayload.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import java.util.concurrent.ConcurrentLinkedQueue; @@ -404,26 +405,26 @@ public static class DeleteResult { @JacksonXmlElementWrapper(useWrapping = false) @JacksonXmlProperty(localName = "Error") // Maps to in XML - private ConcurrentLinkedQueue errors; + private List errors; @JacksonXmlElementWrapper(useWrapping = false) @JacksonXmlProperty(localName = "Deleted") // Maps to in XML - private ConcurrentLinkedQueue deleted; + private List deleted; // Getters and setters - public ConcurrentLinkedQueue getErrors() { + public List getErrors() { return errors; } - public void setErrors(ConcurrentLinkedQueue errors) { + public void setErrors(List errors) { this.errors = errors; } - public ConcurrentLinkedQueue getDeleted() { + public List getDeleted() { return deleted; } - public void setDeleted(ConcurrentLinkedQueue deleted) { + public void setDeleted(List deleted) { this.deleted = deleted; } } @@ -491,6 +492,5 @@ public String toString() { return "S3DeletedObject{key='" + key + "'}"; } } - } diff --git a/ambry-frontend/src/main/java/com/github/ambry/frontend/s3/S3BatchDeleteHandler.java b/ambry-frontend/src/main/java/com/github/ambry/frontend/s3/S3BatchDeleteHandler.java index 06f7763dae..c251b0429f 100644 --- a/ambry-frontend/src/main/java/com/github/ambry/frontend/s3/S3BatchDeleteHandler.java +++ b/ambry-frontend/src/main/java/com/github/ambry/frontend/s3/S3BatchDeleteHandler.java @@ -41,6 +41,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.nio.charset.StandardCharsets; +import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator; import static com.github.ambry.frontend.FrontendUtils.*; import static com.github.ambry.frontend.s3.S3Constants.*; @@ -143,10 +144,9 @@ else if (exception instanceof RestServiceException) { .whenComplete((result, exception) -> { try { // Add XML declaration at the top - String xmlDeclaration = "\n"; - outputStream.write(xmlDeclaration.getBytes(StandardCharsets.UTF_8)); - response.setDeleted(deleted); - response.setErrors(errors); + xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true); + response.setDeleted(new ArrayList<>(deleted)); + response.setErrors(new ArrayList<>(errors)); xmlMapper.writeValue(outputStream, response); ReadableStreamChannel finalreadableStreamChannel = new ByteBufferReadableStreamChannel(ByteBuffer.wrap(outputStream.toByteArray())); diff --git a/ambry-frontend/src/test/java/com/github/ambry/frontend/S3BatchDeleteHandlerTest.java b/ambry-frontend/src/test/java/com/github/ambry/frontend/S3BatchDeleteHandlerTest.java index 722123912a..1de9138e11 100644 --- a/ambry-frontend/src/test/java/com/github/ambry/frontend/S3BatchDeleteHandlerTest.java +++ b/ambry-frontend/src/test/java/com/github/ambry/frontend/S3BatchDeleteHandlerTest.java @@ -116,8 +116,8 @@ public void deleteObjectTest() throws Exception { XmlMapper xmlMapper = new XmlMapper(); S3MessagePayload.DeleteResult response = xmlMapper.readValue(byteBuffer.array(), S3MessagePayload.DeleteResult.class); - assertEquals(response.getDeleted().peek().getKey(), KEY_NAME); - assertEquals(response.getErrors().peek().toString(), new S3MessagePayload.S3ErrorObject("key-error","InternalServerError").toString()); + assertEquals(response.getDeleted().get(0).getKey(), KEY_NAME); + assertEquals(response.getErrors().get(0).toString(), new S3MessagePayload.S3ErrorObject("key-error","InternalServerError").toString()); assertEquals("Mismatch on status", ResponseStatus.Ok, restResponseChannel.getStatus()); }