21 package org.matsim.core.events;
23 import java.io.InputStream;
25 import java.util.LinkedHashMap;
26 import java.util.Locale;
28 import java.util.Stack;
30 import org.apache.logging.log4j.LogManager;
31 import org.apache.logging.log4j.Logger;
38 import org.xml.sax.Attributes;
39 import org.xml.sax.SAXException;
59 this.customEventMappers.put(eventType, mapper);
78 String lcFilename = filename.toLowerCase(Locale.ROOT);
79 if (lcFilename.endsWith(
".xml") || lcFilename.endsWith(
".xml.gz") || lcFilename.endsWith(
".xml.zst") || lcFilename.endsWith(
".xml.lz4")) {
81 }
else if (lcFilename.endsWith(
".ndjson") || lcFilename.endsWith(
".ndjson.gz") || lcFilename.endsWith(
".ndjson.zst")) {
83 customEventMappers.forEach(reader::addCustomEventMapper);
84 reader.parse(filename);
85 }
else if (lcFilename.endsWith(
".txt") || lcFilename.endsWith(
".txt.gz")) {
86 throw new RuntimeException(
"text events are no longer supported. Please use MATSim 0.6.1 or earlier to read text events.");
88 throw new IllegalArgumentException(
"Cannot recognize the format of the events-file " + filename);
103 throw new UnsupportedOperationException(
104 "PB (Protobuf) is currently not supported to read from a stream");
107 customEventMappers.forEach(reader::addCustomEventMapper);
108 reader.parse(stream);
115 if (url.getFile().contains(
".xml")) {
117 }
else if (url.getFile().contains(
".ndjson")) {
119 customEventMappers.forEach(reader::addCustomEventMapper);
127 private final static String EVENTS_V1 =
"events_v1.dtd";
128 private MatsimXmlEventsParser delegate = null;
130 private final Map<String, CustomEventMapper>
map ;
136 this.setValidating(
false);
137 setDoctype(
"events_v1.dtd");
141 public void startTag(
final String name,
final Attributes atts,
final Stack<String> context) {
142 this.delegate.startTag(name, atts, context);
146 public void characters(
char[]
ch,
int start,
int length)
throws SAXException {
157 public void endTag(
final String name,
final String content,
final Stack<String> context) {
158 this.delegate.endTag(name, content, context);
163 super.setDoctype(doctype);
165 if (EVENTS_V1.equals(doctype)) {
167 map.forEach(delegate::addCustomEventMapper);
168 log.info(
"using events_v1-reader.");
170 throw new IllegalArgumentException(
"Doctype \"" + doctype +
"\" not known.");
final Map< String, CustomEventMapper > map
final void readURL(final URL url)
void endTag(final String name, final String content, final Stack< String > context)
final void parse(final URL url)
void readFile(final String filename)
void startTag(final String name, final Attributes atts, final Stack< String > context)
void characters(char[] ch, int start, int length)
Event apply(GenericEvent event)
MatsimEventsReader(final EventsManager events)
void readStream(final InputStream stream, final ControllerConfigGroup.EventsFileFormat format)
void readURL(final URL url)
final Map< String, CustomEventMapper > customEventMappers
final void readFile(final String filename)
void addCustomEventMapper(String eventType, CustomEventMapper mapper)
final EventsManager events
void setDoctype(final String doctype)
void readStream(final InputStream stream)
XmlEventsReader(final EventsManager events, Map< String, CustomEventMapper > map)