// This software is released into the Public Domain. See copying.txt for details.
//
// (c) 2007-2013 OpenStreetMap Foundation http://www.openstreetmap.org
// Original: https://github.com/openstreetmap/osmosis/blob/master/osmosis-xml/src/main/java/org/openstreetmap/osmosis/xml/v0_6/XmlReader.java
//
package org.locationtech.geogig.osm.internal;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.openstreetmap.osmosis.core.OsmosisRuntimeException;
import org.openstreetmap.osmosis.core.task.v0_6.RunnableSource;
import org.openstreetmap.osmosis.core.task.v0_6.Sink;
import org.openstreetmap.osmosis.xml.common.CompressionActivator;
import org.openstreetmap.osmosis.xml.common.CompressionMethod;
import org.openstreetmap.osmosis.xml.v0_6.impl.OsmHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
* An OSM data source reading from an xml file. The entire contents of the file are read.
* <p>
* This is a modified version of the original {@link org.openstreetmap.osmosis.xml.v0_6.XmlReader}
* to support an InputStream as argument instead of just a {@link File}
* </p>
*
* @author Brett Henderson
*/
class XmlReader implements RunnableSource {
private static Logger log = Logger.getLogger(XmlReader.class.getName());
private Sink sink;
private InputStream file;
private boolean enableDateParsing;
private CompressionMethod compressionMethod;
/**
* Creates a new instance.
*
* @param file The file to read.
* @param enableDateParsing If true, dates will be parsed from xml data, else the current date
* will be used thus saving parsing time.
* @param compressionMethod Specifies the compression method to employ.
*/
public XmlReader(InputStream file, boolean enableDateParsing,
CompressionMethod compressionMethod) {
this.file = file;
this.enableDateParsing = enableDateParsing;
this.compressionMethod = compressionMethod;
}
/**
* {@inheritDoc}
*/
public void setSink(Sink sink) {
this.sink = sink;
}
/**
* Creates a new SAX parser.
*
* @return The newly created SAX parser.
*/
private SAXParser createParser() {
try {
return SAXParserFactory.newInstance().newSAXParser();
} catch (ParserConfigurationException e) {
throw new OsmosisRuntimeException("Unable to create SAX Parser.", e);
} catch (SAXException e) {
throw new OsmosisRuntimeException("Unable to create SAX Parser.", e);
}
}
/**
* Reads all data from the file and send it to the sink.
*/
public void run() {
InputStream inputStream = this.file;
try {
SAXParser parser;
sink.initialize(Collections.<String, Object> emptyMap());
// make "-" an alias for /dev/stdin
// if (file.getName().equals("-")) {
// inputStream = System.in;
// } else {
// inputStream = new FileInputStream(file);
// }
inputStream = new CompressionActivator(compressionMethod)
.createCompressionInputStream(inputStream);
parser = createParser();
parser.parse(inputStream, new OsmHandler(sink, enableDateParsing));
sink.complete();
} catch (SAXParseException e) {
throw new OsmosisRuntimeException("Unable to parse xml file " + file + ". publicId=("
+ e.getPublicId() + "), systemId=(" + e.getSystemId() + "), lineNumber="
+ e.getLineNumber() + ", columnNumber=" + e.getColumnNumber() + ".", e);
} catch (SAXException e) {
throw new OsmosisRuntimeException("Unable to parse XML.", e);
} catch (IOException e) {
throw new OsmosisRuntimeException("Unable to read XML file " + file + ".", e);
} finally {
sink.release();
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
log.log(Level.SEVERE, "Unable to close input stream.", e);
}
inputStream = null;
}
}
}
}