Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion src/main/java/org/entur/netex/NetexParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.xml.stream.XMLStreamReader;
import org.entur.netex.index.api.NetexEntitiesIndex;
import org.entur.netex.index.impl.NetexEntitiesIndexImpl;
import org.entur.netex.loader.NetexXmlParser;
Expand All @@ -20,6 +21,22 @@ public class NetexParser {

private final NetexXmlParser xmlParser = new NetexXmlParser();

private final XmlStreamReaderFactory xmlStreamReaderFactory;

/**
* Create a default NetexParser. The default implementation relies on a SAX parser.
*/
public NetexParser() {
xmlStreamReaderFactory = null;
}

/**
* Create a NeTexParser that parses a NeTEx document through an XML stream reader (StAX).
*/
public NetexParser(XmlStreamReaderFactory xmlStreamReaderFactory) {
this.xmlStreamReaderFactory = xmlStreamReaderFactory;
}

/**
* Parse a NeTEx publication delivery from one or more files in
* a zip archive
Expand Down Expand Up @@ -87,7 +104,15 @@ public NetexEntitiesIndex parse(

private void load(NetexEntitiesIndex index, InputStream inputStream) {
try {
PublicationDeliveryStructure doc = xmlParser.parseXmlDoc(inputStream);
PublicationDeliveryStructure doc;
if (xmlStreamReaderFactory != null) {
XMLStreamReader xmlReader =
xmlStreamReaderFactory.createXmlStreamReader(inputStream);
doc = xmlParser.parseXmlDoc(xmlReader);
} else {
doc = xmlParser.parseXmlDoc(inputStream);
}

NetexDocumentParser.parseAndPopulateIndex(index, doc);
} catch (JAXBException e) {
throw new RuntimeException(e.getMessage(), e);
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/org/entur/netex/XmlStreamReaderFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.entur.netex;

import java.io.InputStream;
import javax.xml.stream.XMLStreamReader;

/**
* Factory for XMLStreamReader. Concrete implementations can be used to ignore elements within the XML document
*/
public interface XmlStreamReaderFactory {
XMLStreamReader createXmlStreamReader(InputStream inputStream);
}
15 changes: 15 additions & 0 deletions src/main/java/org/entur/netex/loader/NetexXmlParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Unmarshaller;
import java.io.InputStream;
import javax.xml.stream.XMLStreamReader;
import org.rutebanken.netex.model.PublicationDeliveryStructure;

/** Simple wrapper to perform typesafe xml parsing and simple error handling. */
Expand All @@ -31,6 +32,20 @@ public PublicationDeliveryStructure parseXmlDoc(InputStream stream)
return root.getValue();
}

/**
* Parse an input stream and return the root document type for the given xml file (stream).
*/
public PublicationDeliveryStructure parseXmlDoc(XMLStreamReader reader)
throws JAXBException {
@SuppressWarnings("unchecked")
JAXBElement<PublicationDeliveryStructure> root =
(JAXBElement<PublicationDeliveryStructure>) unmarshaller.unmarshal(
reader
);

return root.getValue();
}

/** factory method for unmarshaller */
private static Unmarshaller createUnmarshaller() {
try {
Expand Down