diff --git a/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java b/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java index 263b036..ae12113 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java +++ b/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java @@ -3,7 +3,6 @@ package ru.nbch.credit_tracker.config.xml; import jakarta.xml.bind.JAXBException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest; import ru.nbch.credit_tracker.entities.response.errors.MonitoringError; import ru.nbch.credit_tracker.entities.response.monitoring_signal_response.MonitoringSignalResponse; import ru.nbch.credit_tracker.entities.response.online_download.OnlineDownloadReport; @@ -12,10 +11,7 @@ import ru.nbch.credit_tracker.entities.response.success.MonitoringResponse; import ru.nbch.credit_tracker.entities.signal_package.Signals; import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor; import ru.nbch.credit_tracker.service.xml.jaxb.XmlProcessorImplAnyClasses; -import ru.nbch.credit_tracker.service.xml.stax.SgnlReportStatusStaxReader; -import ru.nbch.credit_tracker.service.xml.stax.StaxReader; -import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor; -import ru.nbch.credit_tracker.service.xml.stax.XmlProcessorStaxImpl; +import ru.nbch.credit_tracker.service.xml.stax.*; import java.nio.charset.Charset; import java.util.ArrayList; @@ -28,7 +24,6 @@ public class XmlConfig { public IXmlProcessor xmlProcessor() throws JAXBException { return new XmlProcessorImplAnyClasses(Charset.forName("windows-1251"), // unmarshalling classes - MonitoringRequest.class, OnlineDownloadReport.class, SgnlOnlineReport.class, // marshalling classes @@ -42,6 +37,7 @@ public class XmlConfig { public StaxXmlProcessor staxXmlProcessor() { List> staxReader = new ArrayList<>(); staxReader.add(new SgnlReportStatusStaxReader()); + staxReader.add(new MonitoringRequestStaxReader()); return new XmlProcessorStaxImpl(staxReader); } } diff --git a/src/main/java/ru/nbch/credit_tracker/entities/request/monitoring_request/MonitoringRequest.java b/src/main/java/ru/nbch/credit_tracker/entities/request/monitoring_request/MonitoringRequest.java index 3b91f3b..c736e30 100644 --- a/src/main/java/ru/nbch/credit_tracker/entities/request/monitoring_request/MonitoringRequest.java +++ b/src/main/java/ru/nbch/credit_tracker/entities/request/monitoring_request/MonitoringRequest.java @@ -10,10 +10,10 @@ import lombok.Setter; @Getter @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { - "userId", - "password", - "packageName", - "subjects" + "userId", + "password", + "packageName", + "subjects" }) @XmlRootElement(name = "MonitoringRequest") public class MonitoringRequest { @@ -27,5 +27,27 @@ public class MonitoringRequest { @XmlElement(name = "Subjects", required = true) protected Subjects subjects; + public Subjects getSubjects() { + if (subjects == null) { + subjects = new Subjects(); + } + return subjects; + } + + private Subject currentSubject; + + public Subject getCurrentSubject() { + if (currentSubject == null) { + currentSubject = new Subject(); + } + return currentSubject; + } + + public void finalizeSubject() { + if (currentSubject != null) { + getSubjects().getSubject().add(currentSubject); + currentSubject = null; + } + } } diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java index 0e1598c..95fd81d 100644 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java +++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java @@ -26,11 +26,12 @@ import ru.nbch.credit_tracker.service.SignalService; import ru.nbch.credit_tracker.service.indic.PhoneService; import ru.nbch.credit_tracker.service.scoring.AuthorizationService; import ru.nbch.credit_tracker.service.signal.SignalRestService; -import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor; +import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor; import ru.nbch.credit_tracker.utils.CTUtil; import ru.nbch.credit_tracker.utils.ValidationUtil; import ru.nbch.credit_tracker.utils.ZipUtils; +import javax.xml.stream.XMLStreamException; import java.io.File; import java.io.IOException; import java.time.LocalDateTime; @@ -52,7 +53,7 @@ public class SignalFacade { private final AuthorizationService authorizationService; private final SignalService signalService; private final SignalRestService signalRestService; - private final IXmlProcessor xmlProcessor; + private final StaxXmlProcessor staxXmlProcessor; private final ExecutorService executor; @@ -61,13 +62,13 @@ public class SignalFacade { AuthorizationService authorizationService, SignalService signalService, SignalRestService signalRestService, - IXmlProcessor xmlProcessor, + StaxXmlProcessor staxXmlProcessor, @Qualifier("executorService") ExecutorService executor) { this.config = config; this.authorizationService = authorizationService; this.signalService = signalService; this.signalRestService = signalRestService; - this.xmlProcessor = xmlProcessor; + this.staxXmlProcessor = staxXmlProcessor; this.executor = executor; } @@ -95,8 +96,11 @@ public class SignalFacade { zipInputStream = new ZipInputStream(file.getInputStream()); zipInputStream.getNextEntry(); - monitoringRequest = xmlProcessor.read(zipInputStream, MonitoringRequest.class); + monitoringRequest = staxXmlProcessor.read(zipInputStream.readAllBytes(), MonitoringRequest.class); } catch (Exception e) { + if (e.getCause() instanceof XMLStreamException) { + throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError); + } if (e instanceof SignalClientException) { throw (SignalClientException) e; } diff --git a/src/main/java/ru/nbch/credit_tracker/service/xml/stax/MonitoringRequestStaxReader.java b/src/main/java/ru/nbch/credit_tracker/service/xml/stax/MonitoringRequestStaxReader.java new file mode 100644 index 0000000..727bcda --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/service/xml/stax/MonitoringRequestStaxReader.java @@ -0,0 +1,39 @@ +package ru.nbch.credit_tracker.service.xml.stax; + +import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest; + +import javax.xml.stream.XMLStreamReader; + +public class MonitoringRequestStaxReader extends BaseStaxReader { + + @Override + public Class type() { + return MonitoringRequest.class; + } + + @Override + protected MonitoringRequest createObject() { + return new MonitoringRequest(); + } + + @Override + protected boolean innerProcess(XMLStreamReader reader, MonitoringRequest obj) { + String text = buffer.toString(); + String currPath = getPath(); + switch (currPath) { + case "/MonitoringRequest/UserId" -> + obj.setUserId(text); + case "/MonitoringRequest/Password" -> + obj.setPassword(text); + case "/MonitoringRequest/PackageName" -> + obj.setPackageName(text); + case "/MonitoringRequest/Subjects/Subject" -> + obj.finalizeSubject(); + case "/MonitoringRequest/Subjects/Subject/Id" -> + obj.getCurrentSubject().setId(text); + case "/MonitoringRequest/Subjects/Subject/ClientId" -> + obj.getCurrentSubject().setClientId(text); + } + return false; + } +} diff --git a/src/test/java/ru/nbch/credit_tracker/stax/StaxTest.java b/src/test/java/ru/nbch/credit_tracker/stax/StaxTest.java new file mode 100644 index 0000000..6186793 --- /dev/null +++ b/src/test/java/ru/nbch/credit_tracker/stax/StaxTest.java @@ -0,0 +1,87 @@ +package ru.nbch.credit_tracker.stax; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest; +import ru.nbch.credit_tracker.entities.request.monitoring_request.Subject; +import ru.nbch.credit_tracker.service.xml.stax.MonitoringRequestStaxReader; +import ru.nbch.credit_tracker.service.xml.stax.StaxReader; +import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor; +import ru.nbch.credit_tracker.service.xml.stax.XmlProcessorStaxImpl; + +import javax.xml.stream.XMLStreamException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +@SpringBootTest(classes = {StaxTest.TestConfig.class}) +public class StaxTest { + + private final StaxXmlProcessor staxXmlProcessor; + + @Autowired + public StaxTest(StaxXmlProcessor staxXmlProcessor) { + this.staxXmlProcessor = staxXmlProcessor; + } + + @Configuration + public static class TestConfig { + @Bean + public StaxXmlProcessor xmlProcessor() { + List> staxReader = new ArrayList<>(); + staxReader.add(new MonitoringRequestStaxReader()); + return new XmlProcessorStaxImpl(staxReader); + } + } + + + @Test + void testValidRequest() throws IOException { + MonitoringRequest monitoringRequest = staxXmlProcessor.read(getClass().getResourceAsStream("/monitoring_request/xml/valid_request.xml").readAllBytes(), MonitoringRequest.class); + Assertions.assertNotNull(monitoringRequest); + Assertions.assertEquals("0001XX000001", monitoringRequest.getUserId()); + Assertions.assertEquals("test", monitoringRequest.getPassword()); + Assertions.assertEquals("MY_BATCH_170", monitoringRequest.getPackageName()); + Subject firstSubject = monitoringRequest.getSubjects().getSubject().get(0); + Assertions.assertEquals("abc123", firstSubject.getId()); + Assertions.assertEquals("273104246", firstSubject.getClientId()); + Subject secondSubject = monitoringRequest.getSubjects().getSubject().get(1); + Assertions.assertEquals("abc124", secondSubject.getId()); + Assertions.assertEquals("272354001", secondSubject.getClientId()); + } + + @Test + void testInvalidXmlRequest() { + Exception ex = null; + try { + staxXmlProcessor.read(getClass().getResourceAsStream("/monitoring_request/xml/invalid_xml_request.xml").readAllBytes(), MonitoringRequest.class); + } catch (Exception e) { + ex = e; + } + Assertions.assertNotNull(ex); + Assertions.assertEquals(XMLStreamException.class, ex.getCause().getClass()); + } + + @Test + void testEmptyXmlRequest() { + Exception ex = null; + try { + staxXmlProcessor.read(getClass().getResourceAsStream("/monitoring_request/xml/empty_request.xml").readAllBytes(), MonitoringRequest.class); + } catch (Exception e) { + ex = e; + } + Assertions.assertNotNull(ex); + Assertions.assertEquals(XMLStreamException.class, ex.getCause().getClass()); + } + + @Test + void testNonEpectedTag() throws IOException { + MonitoringRequest monitoringRequest = staxXmlProcessor.read(getClass().getResourceAsStream("/monitoring_request/xml/non_expected_tag_request.xml").readAllBytes(), MonitoringRequest.class); + Assertions.assertNull(monitoringRequest.getSubjects().getSubject().get(0).getId()); + } + +} diff --git a/src/test/resources/monitoring_request/xml/empty_request.xml b/src/test/resources/monitoring_request/xml/empty_request.xml new file mode 100644 index 0000000..e69de29 diff --git a/src/test/resources/monitoring_request/xml/invalid_xml_request.xml b/src/test/resources/monitoring_request/xml/invalid_xml_request.xml new file mode 100644 index 0000000..016aa5c --- /dev/null +++ b/src/test/resources/monitoring_request/xml/invalid_xml_request.xml @@ -0,0 +1,15 @@ + + + 0001XX000001 + test + MY_BATCH_170 + + + abc123 + 273104246 + + + abc124 + + + diff --git a/src/test/resources/monitoring_request/xml/non_expected_tag_request.xml b/src/test/resources/monitoring_request/xml/non_expected_tag_request.xml new file mode 100644 index 0000000..c691b3b --- /dev/null +++ b/src/test/resources/monitoring_request/xml/non_expected_tag_request.xml @@ -0,0 +1,12 @@ + + + 0001XX000001 + test + + + abc123 + 273104246 + + + + diff --git a/src/test/resources/monitoring_request/xml/valid_request.xml b/src/test/resources/monitoring_request/xml/valid_request.xml new file mode 100644 index 0000000..f4a7b33 --- /dev/null +++ b/src/test/resources/monitoring_request/xml/valid_request.xml @@ -0,0 +1,17 @@ + + + 0001XX000001 + test + MY_BATCH_170 + + + abc123 + 273104246 + + + abc124 + 272354001 + + + +