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 c736e30..abbb692 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 @@ -36,18 +36,16 @@ public class MonitoringRequest { private Subject currentSubject; + public void createCurrentSubject() { + currentSubject = new Subject(); + } + public Subject getCurrentSubject() { - if (currentSubject == null) { - currentSubject = new Subject(); - } return currentSubject; } public void finalizeSubject() { - if (currentSubject != null) { - getSubjects().getSubject().add(currentSubject); - currentSubject = null; - } + getSubjects().getSubject().add(currentSubject); } } diff --git a/src/main/java/ru/nbch/credit_tracker/service/xml/stax/BaseStaxReader.java b/src/main/java/ru/nbch/credit_tracker/service/xml/stax/BaseStaxReader.java index 3e4d6ac..8dd6bec 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/xml/stax/BaseStaxReader.java +++ b/src/main/java/ru/nbch/credit_tracker/service/xml/stax/BaseStaxReader.java @@ -15,31 +15,38 @@ public abstract class BaseStaxReader implements StaxReader { @Override public T read(XMLStreamReader reader) throws XMLStreamException { T obj = createObject(); - while (reader.hasNext()) { - boolean breakExecution = false; - int ev = reader.next(); - switch (ev) { - case XMLStreamConstants.START_ELEMENT -> { - buffer.setLength(0); - startElement(reader.getLocalName()); + try { + while (reader.hasNext()) { + boolean breakExecution = false; + int ev = reader.next(); + switch (ev) { + case XMLStreamConstants.START_ELEMENT -> { + buffer.setLength(0); + startElement(reader.getLocalName()); + innerProcessStartElement(reader, obj); + } + case XMLStreamConstants.CHARACTERS -> { + String text = reader.getText().trim(); + if (!text.isEmpty()) buffer.append(text); + } + case XMLStreamConstants.END_ELEMENT -> { + breakExecution = innerProcess(reader, obj); + endElement(); + } + default -> {} } - case XMLStreamConstants.CHARACTERS -> { - String text = reader.getText().trim(); - if (!text.isEmpty()) buffer.append(text); - } - case XMLStreamConstants.END_ELEMENT -> { - breakExecution = innerProcess(reader, obj); - endElement(); - } - default -> {} + if (breakExecution) break; } - if (breakExecution) break; + return obj; + } catch (Exception e) { + stack.clear(); + throw e; } - return obj; } protected abstract boolean innerProcess(XMLStreamReader reader, T obj) throws XMLStreamException; + protected abstract void innerProcessStartElement(XMLStreamReader reader, T obj) throws XMLStreamException; public void startElement(String localName) { localName = substringAfterColon(localName); 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 index 727bcda..8bf1ffc 100644 --- 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 @@ -2,6 +2,7 @@ package ru.nbch.credit_tracker.service.xml.stax; import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest; +import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; public class MonitoringRequestStaxReader extends BaseStaxReader { @@ -36,4 +37,15 @@ public class MonitoringRequestStaxReader extends BaseStaxReader + obj.createCurrentSubject(); + } + } } diff --git a/src/main/java/ru/nbch/credit_tracker/service/xml/stax/SgnlReportStatusStaxReader.java b/src/main/java/ru/nbch/credit_tracker/service/xml/stax/SgnlReportStatusStaxReader.java index 17f4cb5..a4da8b1 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/xml/stax/SgnlReportStatusStaxReader.java +++ b/src/main/java/ru/nbch/credit_tracker/service/xml/stax/SgnlReportStatusStaxReader.java @@ -5,6 +5,7 @@ import ru.nbch.credit_tracker.entities.response.external_errors.Error; import ru.nbch.credit_tracker.entities.response.external_errors.InputParams; import ru.nbch.credit_tracker.entities.response.external_errors.SgnlReport; +import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; @Component @@ -39,4 +40,9 @@ public class SgnlReportStatusStaxReader extends BaseStaxReader { } return false; } + + @Override + protected void innerProcessStartElement(XMLStreamReader reader, SgnlReport obj) throws XMLStreamException { + + } } diff --git a/src/test/java/ru/nbch/credit_tracker/utils/UtilTest.java b/src/test/java/ru/nbch/credit_tracker/utils/UtilTest.java index c7dc696..e842d18 100644 --- a/src/test/java/ru/nbch/credit_tracker/utils/UtilTest.java +++ b/src/test/java/ru/nbch/credit_tracker/utils/UtilTest.java @@ -1,6 +1,5 @@ package ru.nbch.credit_tracker.utils; -import jakarta.xml.bind.JAXBException; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -11,34 +10,42 @@ 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.enums.SignalError; +import ru.nbch.credit_tracker.enums.XmlErrorFormat; import ru.nbch.credit_tracker.exceptions.SignalClientException; -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.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.nio.charset.Charset; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Optional; import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp; + @SpringBootTest(classes = {UtilTest.TestConfig.class}) public class UtilTest { - private final IXmlProcessor xmlProcessor; + private final StaxXmlProcessor staxXmlProcessor; @Autowired - public UtilTest(IXmlProcessor xmlProcessor) { - this.xmlProcessor = xmlProcessor; + public UtilTest(StaxXmlProcessor staxXmlProcessor) { + this.staxXmlProcessor = staxXmlProcessor; } @Configuration public static class TestConfig { @Bean - public IXmlProcessor xmlProcessor() throws JAXBException { - return new XmlProcessorImplAnyClasses(Charset.forName("windows-1251"), - MonitoringRequest.class); + public StaxXmlProcessor xmlProcessor() { + List> staxReader = new ArrayList<>(); + staxReader.add(new MonitoringRequestStaxReader()); + return new XmlProcessorStaxImpl(staxReader); } } @@ -125,13 +132,18 @@ public class UtilTest { @MethodSource("validationTestCases") void testMonitoringRequestValidation(String path, SignalError signalError, Object[] args) { ZipInputStream zipInputStream = null; - MonitoringRequest monitoringRequest; + MonitoringRequest monitoringRequest = null; + SignalClientException ex = null; try { zipInputStream = new ZipInputStream(getClass().getResourceAsStream(path)); zipInputStream.getNextEntry(); - monitoringRequest = xmlProcessor.read(zipInputStream, MonitoringRequest.class); + monitoringRequest = staxXmlProcessor.read(zipInputStream.readAllBytes(), MonitoringRequest.class); } catch (Exception e) { - throw new RuntimeException(e); + if (e.getCause() instanceof XMLStreamException) { + ex = clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError); + } else { + throw new RuntimeException(e); + } } finally { if (zipInputStream != null) { try { @@ -142,11 +154,12 @@ public class UtilTest { } } - SignalClientException ex = null; - try { - ValidationUtil.validateMonitoringRequest(monitoringRequest); - } catch (SignalClientException e) { - ex = e; + if(ex == null) { + try { + ValidationUtil.validateMonitoringRequest(monitoringRequest); + } catch (SignalClientException e) { + ex = e; + } } if (ex != null) { Assertions.assertEquals(signalError, ex.getErrorMessage().getSubject());