Updated BaseStaxReader; Updated tests; Fix issue with stax reader;

This commit is contained in:
Mikhail Trofimov 2025-07-10 11:30:13 +03:00
parent 9a1ead682d
commit 9b2e723f4c
5 changed files with 79 additions and 43 deletions

View file

@ -36,18 +36,16 @@ public class MonitoringRequest {
private Subject currentSubject; private Subject currentSubject;
public Subject getCurrentSubject() { public void createCurrentSubject() {
if (currentSubject == null) {
currentSubject = new Subject(); currentSubject = new Subject();
} }
public Subject getCurrentSubject() {
return currentSubject; return currentSubject;
} }
public void finalizeSubject() { public void finalizeSubject() {
if (currentSubject != null) {
getSubjects().getSubject().add(currentSubject); getSubjects().getSubject().add(currentSubject);
currentSubject = null;
}
} }
} }

View file

@ -15,6 +15,7 @@ public abstract class BaseStaxReader<T> implements StaxReader<T> {
@Override @Override
public T read(XMLStreamReader reader) throws XMLStreamException { public T read(XMLStreamReader reader) throws XMLStreamException {
T obj = createObject(); T obj = createObject();
try {
while (reader.hasNext()) { while (reader.hasNext()) {
boolean breakExecution = false; boolean breakExecution = false;
int ev = reader.next(); int ev = reader.next();
@ -22,6 +23,7 @@ public abstract class BaseStaxReader<T> implements StaxReader<T> {
case XMLStreamConstants.START_ELEMENT -> { case XMLStreamConstants.START_ELEMENT -> {
buffer.setLength(0); buffer.setLength(0);
startElement(reader.getLocalName()); startElement(reader.getLocalName());
innerProcessStartElement(reader, obj);
} }
case XMLStreamConstants.CHARACTERS -> { case XMLStreamConstants.CHARACTERS -> {
String text = reader.getText().trim(); String text = reader.getText().trim();
@ -36,10 +38,15 @@ public abstract class BaseStaxReader<T> implements StaxReader<T> {
if (breakExecution) break; if (breakExecution) break;
} }
return obj; return obj;
} catch (Exception e) {
stack.clear();
throw e;
}
} }
protected abstract boolean innerProcess(XMLStreamReader reader, T obj) throws XMLStreamException; 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) { public void startElement(String localName) {
localName = substringAfterColon(localName); localName = substringAfterColon(localName);

View file

@ -2,6 +2,7 @@ package ru.nbch.credit_tracker.service.xml.stax;
import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest; import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamReader;
public class MonitoringRequestStaxReader extends BaseStaxReader<MonitoringRequest> { public class MonitoringRequestStaxReader extends BaseStaxReader<MonitoringRequest> {
@ -36,4 +37,15 @@ public class MonitoringRequestStaxReader extends BaseStaxReader<MonitoringReques
} }
return false; return false;
} }
@Override
protected void innerProcessStartElement(XMLStreamReader reader, MonitoringRequest obj) throws XMLStreamException {
String text = buffer.toString();
String currPath = getPath();
switch (currPath) {
case "/MonitoringRequest/Subjects/Subject" ->
obj.createCurrentSubject();
}
}
} }

View file

@ -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.InputParams;
import ru.nbch.credit_tracker.entities.response.external_errors.SgnlReport; import ru.nbch.credit_tracker.entities.response.external_errors.SgnlReport;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamReader;
@Component @Component
@ -39,4 +40,9 @@ public class SgnlReportStatusStaxReader extends BaseStaxReader<SgnlReport> {
} }
return false; return false;
} }
@Override
protected void innerProcessStartElement(XMLStreamReader reader, SgnlReport obj) throws XMLStreamException {
}
} }

View file

@ -1,6 +1,5 @@
package ru.nbch.credit_tracker.utils; package ru.nbch.credit_tracker.utils;
import jakarta.xml.bind.JAXBException;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.Arguments;
@ -11,34 +10,42 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; 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.MonitoringRequest;
import ru.nbch.credit_tracker.enums.SignalError; 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.exceptions.SignalClientException;
import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor; import ru.nbch.credit_tracker.service.xml.stax.MonitoringRequestStaxReader;
import ru.nbch.credit_tracker.service.xml.jaxb.XmlProcessorImplAnyClasses; 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.io.IOException;
import java.nio.charset.Charset; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Stream; import java.util.stream.Stream;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
@SpringBootTest(classes = {UtilTest.TestConfig.class}) @SpringBootTest(classes = {UtilTest.TestConfig.class})
public class UtilTest { public class UtilTest {
private final IXmlProcessor xmlProcessor; private final StaxXmlProcessor staxXmlProcessor;
@Autowired @Autowired
public UtilTest(IXmlProcessor xmlProcessor) { public UtilTest(StaxXmlProcessor staxXmlProcessor) {
this.xmlProcessor = xmlProcessor; this.staxXmlProcessor = staxXmlProcessor;
} }
@Configuration @Configuration
public static class TestConfig { public static class TestConfig {
@Bean @Bean
public IXmlProcessor xmlProcessor() throws JAXBException { public StaxXmlProcessor xmlProcessor() {
return new XmlProcessorImplAnyClasses(Charset.forName("windows-1251"), List<StaxReader<?>> staxReader = new ArrayList<>();
MonitoringRequest.class); staxReader.add(new MonitoringRequestStaxReader());
return new XmlProcessorStaxImpl(staxReader);
} }
} }
@ -125,13 +132,18 @@ public class UtilTest {
@MethodSource("validationTestCases") @MethodSource("validationTestCases")
void testMonitoringRequestValidation(String path, SignalError signalError, Object[] args) { void testMonitoringRequestValidation(String path, SignalError signalError, Object[] args) {
ZipInputStream zipInputStream = null; ZipInputStream zipInputStream = null;
MonitoringRequest monitoringRequest; MonitoringRequest monitoringRequest = null;
SignalClientException ex = null;
try { try {
zipInputStream = new ZipInputStream(getClass().getResourceAsStream(path)); zipInputStream = new ZipInputStream(getClass().getResourceAsStream(path));
zipInputStream.getNextEntry(); zipInputStream.getNextEntry();
monitoringRequest = xmlProcessor.read(zipInputStream, MonitoringRequest.class); monitoringRequest = staxXmlProcessor.read(zipInputStream.readAllBytes(), MonitoringRequest.class);
} catch (Exception e) { } catch (Exception e) {
if (e.getCause() instanceof XMLStreamException) {
ex = clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError);
} else {
throw new RuntimeException(e); throw new RuntimeException(e);
}
} finally { } finally {
if (zipInputStream != null) { if (zipInputStream != null) {
try { try {
@ -142,12 +154,13 @@ public class UtilTest {
} }
} }
SignalClientException ex = null; if(ex == null) {
try { try {
ValidationUtil.validateMonitoringRequest(monitoringRequest); ValidationUtil.validateMonitoringRequest(monitoringRequest);
} catch (SignalClientException e) { } catch (SignalClientException e) {
ex = e; ex = e;
} }
}
if (ex != null) { if (ex != null) {
Assertions.assertEquals(signalError, ex.getErrorMessage().getSubject()); Assertions.assertEquals(signalError, ex.getErrorMessage().getSubject());
Assertions.assertArrayEquals(args, ex.getErrorMessage().getArgs()); Assertions.assertArrayEquals(args, ex.getErrorMessage().getArgs());