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 be383a7..db3a5f6 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 @@ -14,6 +14,7 @@ import ru.nbch.credit_tracker.service.xml.stax.*; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; @Configuration public class XmlConfig { @@ -30,11 +31,11 @@ public class XmlConfig { @Bean public StaxXmlProcessor staxXmlProcessor() { - List> staxReader = new ArrayList<>(); - staxReader.add(new SgnlReportStatusStaxReader()); - staxReader.add(new MonitoringRequestStaxReader()); - staxReader.add(new OnlineDownloadReportPersonsStaxReader()); - staxReader.add(new MonitoringSignalResponseStaxXmlReader()); + List>> staxReader = new ArrayList<>(); + staxReader.add(SgnlReportStatusStaxReader::new); + staxReader.add(MonitoringRequestStaxReader::new); + staxReader.add(OnlineDownloadReportPersonsStaxReader::new); + staxReader.add(MonitoringSignalResponseStaxXmlReader::new); return new XmlProcessorStaxImpl(staxReader); } } 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 d01f9ab..89673e7 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 @@ -1,6 +1,5 @@ package ru.nbch.credit_tracker.service.xml.stax; -import org.springframework.stereotype.Component; import ru.nbch.credit_tracker.entities.external_response.errors.Error; import ru.nbch.credit_tracker.entities.external_response.errors.InputParams; import ru.nbch.credit_tracker.entities.external_response.errors.SgnlReport; @@ -8,7 +7,6 @@ import ru.nbch.credit_tracker.entities.external_response.errors.SgnlReport; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; -@Component public class SgnlReportStatusStaxReader extends BaseStaxReader { @Override diff --git a/src/main/java/ru/nbch/credit_tracker/service/xml/stax/XmlProcessorStaxImpl.java b/src/main/java/ru/nbch/credit_tracker/service/xml/stax/XmlProcessorStaxImpl.java index 3088443..052ed62 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/xml/stax/XmlProcessorStaxImpl.java +++ b/src/main/java/ru/nbch/credit_tracker/service/xml/stax/XmlProcessorStaxImpl.java @@ -17,13 +17,14 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Supplier; public class XmlProcessorStaxImpl implements StaxXmlProcessor { private final Logger log = LoggerFactory.getLogger(getClass()); protected XMLInputFactory xmlInputFactory; - protected Map, StaxReader> staxReaders = new HashMap<>(); + protected Map, Supplier>> staxReaders = new HashMap<>(); - public XmlProcessorStaxImpl(List> staxReaders) { + public XmlProcessorStaxImpl(List>> staxReaders) { this.xmlInputFactory = XMLInputFactory.newInstance(); this.xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false); // полностью выключить DOCTYPE Declaration // или выключить особо опасные возможности (менее строгое ограничение XXE, но достаточное): @@ -32,10 +33,13 @@ public class XmlProcessorStaxImpl implements StaxXmlProcessor { this.xmlInputFactory.setXMLResolver((publicID, systemID, baseURI, namespace) -> { throw new XMLStreamException("External entities are disabled"); }); - staxReaders.forEach(reader -> this.staxReaders.put(reader.type(), reader)); + staxReaders.forEach(supplier -> { + Class type = supplier.get().type(); + this.staxReaders.put(type, supplier); + }); } - public XmlProcessorStaxImpl(StaxReader... staxReaders) { + public XmlProcessorStaxImpl(Supplier>... staxReaders) { this(Arrays.asList(staxReaders)); } @@ -43,8 +47,9 @@ public class XmlProcessorStaxImpl implements StaxXmlProcessor { public Z read(String xml, Class clazz) { try { XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new StringReader(xml)); + Supplier> staxReaderSupplier = staxReaders.get(clazz); @SuppressWarnings("unchecked") - StaxReader staxProcessor = (StaxReader) staxReaders.get(clazz); + StaxReader staxProcessor = (StaxReader) staxReaderSupplier.get(); if (staxProcessor != null) { return staxProcessor.read(xmlStreamReader); } @@ -62,8 +67,9 @@ public class XmlProcessorStaxImpl implements StaxXmlProcessor { public Z read(byte[] xml, Class clazz) { try { XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new ByteArrayInputStream(xml)); + Supplier> staxReaderSupplier = staxReaders.get(clazz); @SuppressWarnings("unchecked") - StaxReader staxProcessor = (StaxReader) staxReaders.get(clazz); + StaxReader staxProcessor = (StaxReader) staxReaderSupplier.get(); if (staxProcessor != null) { return staxProcessor.read(xmlStreamReader); } @@ -81,8 +87,9 @@ public class XmlProcessorStaxImpl implements StaxXmlProcessor { public Z read(InputStream inputStream, Class clazz) { try { XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inputStream); + Supplier> staxReaderSupplier = staxReaders.get(clazz); @SuppressWarnings("unchecked") - StaxReader staxProcessor = (StaxReader) staxReaders.get(clazz); + StaxReader staxProcessor = (StaxReader) staxReaderSupplier.get(); if (staxProcessor != null) { return staxProcessor.read(xmlStreamReader); } @@ -100,8 +107,9 @@ public class XmlProcessorStaxImpl implements StaxXmlProcessor { public Z read(InputStream inputStream, Class clazz, Consumer objProcessor, Function emptyBatchCheckFunction, Integer batchSize, String endBatchElementPath) { try { XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inputStream); + Supplier> staxReaderSupplier = staxReaders.get(clazz); @SuppressWarnings("unchecked") - StaxReader staxProcessor = (StaxReader) staxReaders.get(clazz); + StaxReader staxProcessor = (StaxReader) staxReaderSupplier.get(); if (staxProcessor != null) { return staxProcessor.read(xmlStreamReader, objProcessor, emptyBatchCheckFunction, batchSize, endBatchElementPath); } diff --git a/src/test/java/ru/nbch/credit_tracker/stax/StaxTest.java b/src/test/java/ru/nbch/credit_tracker/stax/StaxTest.java index eb9e3cc..a8f2ba9 100644 --- a/src/test/java/ru/nbch/credit_tracker/stax/StaxTest.java +++ b/src/test/java/ru/nbch/credit_tracker/stax/StaxTest.java @@ -16,6 +16,7 @@ import javax.xml.stream.XMLStreamException; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; @SpringBootTest(classes = {StaxTest.TestConfig.class}) public class StaxTest { @@ -31,9 +32,9 @@ public class StaxTest { public static class TestConfig { @Bean public StaxXmlProcessor xmlProcessor() { - List> staxReader = new ArrayList<>(); - staxReader.add(new MonitoringRequestStaxReader()); - staxReader.add(new OnlineDownloadReportPersonsStaxReader()); + List>> staxReader = new ArrayList<>(); + staxReader.add(MonitoringRequestStaxReader::new); + staxReader.add(OnlineDownloadReportPersonsStaxReader::new); return new XmlProcessorStaxImpl(staxReader); } } diff --git a/src/test/java/ru/nbch/credit_tracker/utils/ValidationUtilTest.java b/src/test/java/ru/nbch/credit_tracker/utils/ValidationUtilTest.java index b4ba069..b8146f3 100644 --- a/src/test/java/ru/nbch/credit_tracker/utils/ValidationUtilTest.java +++ b/src/test/java/ru/nbch/credit_tracker/utils/ValidationUtilTest.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.Supplier; import java.util.stream.Stream; import java.util.zip.ZipInputStream; @@ -41,8 +42,8 @@ public class ValidationUtilTest { public static class TestConfig { @Bean public StaxXmlProcessor xmlProcessor() { - List> staxReader = new ArrayList<>(); - staxReader.add(new MonitoringRequestStaxReader()); + List>> staxReader = new ArrayList<>(); + staxReader.add(MonitoringRequestStaxReader::new); return new XmlProcessorStaxImpl(staxReader); } }