package org.osm2world.core.osm.creation;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import org.osm2world.core.osm.data.OSMData;
/**
* DataSource providing information from a single .osm file, including common
* non-standard variants such as those files produced by JOSM. The file is read
* during the {@link #getData()} call, there will be no updates when the file is
* changed later. This class internally uses Osmosis to read the file.
*
* At its core, this reader combines the capabilities of the {@link OSMFileReader}
* and the {@link JOSMFileReader}.
*/
public class OSMFileReader implements OSMDataReader {
private final File file;
public OSMFileReader(File file) throws FileNotFoundException {
this.file = file;
if (!file.exists()) {
throw new FileNotFoundException(file.toString());
}
}
@Override
public OSMData getData() throws IOException {
OSMData osmData = null;
boolean useJOSMReader = false;
if (isJOSMGenerated(file)) {
useJOSMReader = true;
} else {
/* try to read file using Osmosis */
try {
osmData = new StrictOSMFileReader(file).getData();
} catch (IOException e) {
System.out.println("could not read file," +
" trying workaround for files created by JOSM");
useJOSMReader = true;
}
}
/* try reading the file while taking into account JOSM-specific extensions */
if (useJOSMReader) {
try {
osmData = new JOSMFileReader(file).getData();
} catch (Exception e2) {
throw new IOException("could not read OSM file" +
" (not even with workaround for JOSM files)", e2);
}
}
return osmData;
}
/**
* Returns true if the file was identified as being generated by JOSM.
* This method peeks into the first lines of the file,
* trying to find the generator tag.
*/
public static final boolean isJOSMGenerated(File file) {
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
for (int i=0; i<100; i++) {
String line = reader.readLine();
if (line != null) {
if (line.contains("generator='JOSM'")) {
return true;
}
}
}
reader.close();
} catch (IOException e) { }
return false;
}
}