From a3cb7bd5524d26b00e4c62376132512328f66f3f Mon Sep 17 00:00:00 2001 From: alessio-acitelli <97529051+alessio-acitelli@users.noreply.github.com> Date: Mon, 30 Sep 2024 09:17:22 +0200 Subject: [PATCH] feat: [PAGOPA-2032] sendRTV2 log (#123) Co-authored-by: aacitelli --- .../controller/ReceiptController.java | 43 ++++++++-- .../util/ReceiptRequestHandler.java | 78 +++++++++++++++++++ .../wispconverter/utility/LoggingTest.java | 4 +- .../utils/ReceiptRequestHandlerTest.java | 31 ++++++++ .../resources/requests/paSendRTV2Request.xml | 67 ++++++++++++++++ 5 files changed, 213 insertions(+), 10 deletions(-) create mode 100644 src/main/java/it/gov/pagopa/wispconverter/util/ReceiptRequestHandler.java create mode 100644 src/test/java/it/gov/pagopa/wispconverter/utils/ReceiptRequestHandlerTest.java create mode 100644 src/test/resources/requests/paSendRTV2Request.xml diff --git a/src/main/java/it/gov/pagopa/wispconverter/controller/ReceiptController.java b/src/main/java/it/gov/pagopa/wispconverter/controller/ReceiptController.java index f0ce6c58..b1817c88 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/controller/ReceiptController.java +++ b/src/main/java/it/gov/pagopa/wispconverter/controller/ReceiptController.java @@ -17,25 +17,28 @@ import it.gov.pagopa.wispconverter.service.model.ReceiptDto; import it.gov.pagopa.wispconverter.util.Constants; import it.gov.pagopa.wispconverter.util.ErrorUtil; +import it.gov.pagopa.wispconverter.util.ReceiptRequestHandler; import it.gov.pagopa.wispconverter.util.Trace; +import it.gov.pagopa.wispconverter.util.ReceiptRequestHandler.PaSendRTV2Request; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.lang3.StringUtils; import org.slf4j.MDC; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.ErrorResponse; import org.springframework.web.bind.annotation.*; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; -import javax.net.ssl.SSLSession; import java.io.IOException; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpHeaders; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; +import java.io.StringReader; import java.util.List; -import java.util.Optional; @RestController @RequestMapping("/receipt") @@ -56,6 +59,10 @@ public class ReceiptController { private final ObjectMapper mapper; private final ErrorUtil errorUtil; + + private final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); + + private final ReceiptRequestHandler receiptRequestHandler; @Operation(summary = "", description = "", security = {@SecurityRequirement(name = "ApiKey")}, tags = {"Receipt"}) @ApiResponses(value = { @@ -124,7 +131,7 @@ public void receiptKo(@RequestBody String request) throws Exception { public void receiptOk(@RequestBody ReceiptRequest request) throws IOException { try { - log.info("Invoking API operation receiptOk - args: {}", request.toString()); + log.info("Invoking API operation receiptOk - args: {}", this.getReceiptRequestInfoToLog(request.getContent())); receiptService.sendOkPaaInviaRtToCreditorInstitution(request.getContent()); log.info("Successful API operation receiptOk"); } catch (Exception ex) { @@ -137,4 +144,24 @@ public void receiptOk(@RequestBody ReceiptRequest request) throws IOException { throw ex; } } + + private String getReceiptRequestInfoToLog(String xml) { + String args = "n/a"; + try { + if (StringUtils.isNotEmpty(xml)) { + // fix for sonar issue XML external entity in user-controlled data + saxParserFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); + saxParserFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + saxParserFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + + saxParserFactory.newSAXParser().parse(new InputSource(new StringReader(xml)), receiptRequestHandler); + + PaSendRTV2Request result = receiptRequestHandler.getPaSendRTV2Request(); + args = "noticeNumber="+result.getNoticeNumber()+", fiscalCode="+result.getFiscalCode()+", creditorReferenceId="+result.getCreditorReferenceId(); + } + } catch (SAXException | IOException | ParserConfigurationException e) { + return args; + } + return args; + } } diff --git a/src/main/java/it/gov/pagopa/wispconverter/util/ReceiptRequestHandler.java b/src/main/java/it/gov/pagopa/wispconverter/util/ReceiptRequestHandler.java new file mode 100644 index 00000000..be576296 --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/util/ReceiptRequestHandler.java @@ -0,0 +1,78 @@ +package it.gov.pagopa.wispconverter.util; + +import org.springframework.stereotype.Component; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper=false) +@Component +public class ReceiptRequestHandler extends DefaultHandler { + + private static final String NOTICE_NUMBER = "noticeNumber"; + private static final String FISCAL_CODE = "fiscalCode"; + private static final String CREDITOR_REFERENCE_ID = "creditorReferenceId"; + + private PaSendRTV2Request paSendRTV2Request; + private StringBuilder elementValue; + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + if (elementValue == null) { + elementValue = new StringBuilder(); + } else { + elementValue.append(ch, start, length); + } + } + + @Override + public void startDocument() throws SAXException { + paSendRTV2Request = new PaSendRTV2Request(); + } + + @Override + public void startElement(String uri, String lName, String qName, Attributes attr) throws SAXException { + switch (qName) { + case NOTICE_NUMBER: + elementValue = new StringBuilder(); + break; + case FISCAL_CODE: + elementValue = new StringBuilder(); + break; + case CREDITOR_REFERENCE_ID: + elementValue = new StringBuilder(); + break; + default: + break; + } + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + switch (qName) { + case NOTICE_NUMBER: + paSendRTV2Request.setNoticeNumber(elementValue.toString()); + break; + case FISCAL_CODE: + paSendRTV2Request.setFiscalCode(elementValue.toString()); + break; + case CREDITOR_REFERENCE_ID: + paSendRTV2Request.setCreditorReferenceId(elementValue.toString()); + break; + default: + break; + } + } + + @Data + public class PaSendRTV2Request{ + private String noticeNumber; + private String fiscalCode; + private String creditorReferenceId; + } + +} diff --git a/src/test/java/it/gov/pagopa/wispconverter/utility/LoggingTest.java b/src/test/java/it/gov/pagopa/wispconverter/utility/LoggingTest.java index 4a3c2ff0..bcd9f0a5 100644 --- a/src/test/java/it/gov/pagopa/wispconverter/utility/LoggingTest.java +++ b/src/test/java/it/gov/pagopa/wispconverter/utility/LoggingTest.java @@ -103,7 +103,7 @@ public void testClientLogger2() { public void testServerLogger() { Method method = ReceiptController.class.getMethod("receiptOk", ReceiptRequest.class); - HandlerMethod handlerMethod = new HandlerMethod(new ReceiptController(null, null, null, null), method); + HandlerMethod handlerMethod = new HandlerMethod(new ReceiptController(null, null, null, null, null), method); HttpServletRequest httpRequest = mock(HttpServletRequest.class); HttpServletResponse httpResponse = mock(HttpServletResponse.class); @@ -131,7 +131,7 @@ public void testServerLogger() { public void testServerLogger2() { Method method = ReceiptController.class.getMethod("receiptOk", ReceiptRequest.class); - HandlerMethod handlerMethod = new HandlerMethod(new ReceiptController(null, null, null, null), method); + HandlerMethod handlerMethod = new HandlerMethod(new ReceiptController(null, null, null, null, null), method); HttpServletRequest httpRequest = mock(HttpServletRequest.class); HttpServletResponse httpResponse = mock(HttpServletResponse.class); diff --git a/src/test/java/it/gov/pagopa/wispconverter/utils/ReceiptRequestHandlerTest.java b/src/test/java/it/gov/pagopa/wispconverter/utils/ReceiptRequestHandlerTest.java new file mode 100644 index 00000000..d8f05764 --- /dev/null +++ b/src/test/java/it/gov/pagopa/wispconverter/utils/ReceiptRequestHandlerTest.java @@ -0,0 +1,31 @@ +package it.gov.pagopa.wispconverter.utils; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.junit.jupiter.api.Test; +import org.xml.sax.SAXException; + +import it.gov.pagopa.wispconverter.util.ReceiptRequestHandler; +import it.gov.pagopa.wispconverter.util.ReceiptRequestHandler.PaSendRTV2Request; + +class ReceiptRequestHandlerTest { + + @Test + void parsePaSendRTV2Request() throws ParserConfigurationException, SAXException, IOException { + ReceiptRequestHandler receiptRequestHandler = new ReceiptRequestHandler(); + SAXParserFactory factory = SAXParserFactory.newInstance(); + SAXParser saxParser = factory.newSAXParser(); + saxParser.parse("src/test/resources/requests/paSendRTV2Request.xml", receiptRequestHandler); + + PaSendRTV2Request result = receiptRequestHandler.getPaSendRTV2Request(); + assertEquals("348172725623804858", result.getNoticeNumber()); + assertEquals("15376371009", result.getFiscalCode()); + assertEquals("863965926210520", result.getCreditorReferenceId()); + } +} diff --git a/src/test/resources/requests/paSendRTV2Request.xml b/src/test/resources/requests/paSendRTV2Request.xml new file mode 100644 index 00000000..50480b47 --- /dev/null +++ b/src/test/resources/requests/paSendRTV2Request.xml @@ -0,0 +1,67 @@ + + + + + 15376371009 + 15376371009 + 15376371009_48 + + a0fffc676950472c94ca8e1456dc7b03 + 348172725623804858 + 15376371009 + OK + 863965926210520 + 16.00 + /RFB/863965926210520/16.00/TXT/DEBITORE/JHNDOE00A01F205N + PagoPA S.p.A. + + + M + JHNDOE00A01F205N + + John Doe + Via qualsiasi + 1 + 00100 + Roma + RM + IT + john.doe@test.it + + + + 1 + 16.00 + 77777777777 + + attachment + /RFB/863965926210520/16.00/TXT/DEBITORE/JHNDOE00A01F205N + 9/0301116TS + + + DatiSpecificiRiscossione + 9/0301116TS/9/11111111111 + + + + + BCITITMM + 88888888888 + Intesa Sanpaolo S.p.A + 88888888888_01 + app + creditCard + 734b9b88-6186-4034-a79e-813efacf36a0 + 0.35 + 2024-09-25T11:24:01 + 2024-09-25 + 2024-09-26 + + + + \ No newline at end of file