// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.core.io.geographic; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.nio.charset.IllegalCharsetNameException; import java.nio.charset.UnsupportedCharsetException; import java.nio.file.Files; import java.util.ArrayList; import java.util.List; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.gui.progress.ProgressMonitor; import org.openstreetmap.josm.io.AbstractReader; import org.openstreetmap.josm.io.IllegalDataException; import org.openstreetmap.josm.plugins.opendata.core.OdConstants; public abstract class AbstractMapInfoReader extends AbstractReader { protected static final String VERSION_1 = "1"; protected static final String VERSION_2 = "2"; protected static final String VERSION_300 = "300"; protected static final String VERSION_450 = "450"; protected static final String CHARSET_WINDOWS_LATIN = "WindowsLatin1"; protected static final String CHARSET_WINDOWS_CYRILLIC = "WindowsCyrillic"; protected static final String CHARSET_NEUTRAL = "Neutral"; protected static final String CHARSET_MAC = "MacRoman"; protected BufferedReader headerReader; protected String line; protected int lineNum = 0; protected String version; // Columns protected int numcolumns = -1; protected List<String> columns; @Override protected DataSet doParseDataSet(InputStream source, ProgressMonitor progressMonitor) throws IllegalDataException { return null; } protected final File getDataFile(File headerFile, String extension) { String filename = headerFile.getName().substring(0, headerFile.getName().lastIndexOf('.')); File dataFile = new File(headerFile.getParent() + File.separator + filename + extension.toUpperCase()); if (!dataFile.exists()) { dataFile = new File(headerFile.getParent() + File.separator + filename + extension.toLowerCase()); } return dataFile; } protected final BufferedReader getDataReader(File headerFile, String extension, Charset charset) throws IOException { File dataFile = getDataFile(headerFile, extension); return dataFile.exists() ? Files.newBufferedReader(dataFile.toPath(), charset) : null; } protected Charset parseCharset(String[] words) throws IllegalCharsetNameException, UnsupportedCharsetException { return parseCharset(words, 1); } protected Charset parseCharset(String[] words, int index) throws IllegalCharsetNameException, UnsupportedCharsetException { words[index] = words[index].replace("\"", ""); if (words[index].equalsIgnoreCase(CHARSET_WINDOWS_LATIN)) { return Charset.forName(OdConstants.CP1252); } else if (words[index].equalsIgnoreCase(CHARSET_WINDOWS_CYRILLIC)) { return Charset.forName(OdConstants.CP1251); } else if (words[index].equalsIgnoreCase(CHARSET_NEUTRAL)) { return Charset.forName(OdConstants.ISO8859_15); } else if (words[index].equalsIgnoreCase(CHARSET_MAC)) { return Charset.forName(OdConstants.MAC_ROMAN); } else { Main.error("Line "+lineNum+". Unknown charset detected: "+line); return Charset.forName(words[index]); } } protected void parseVersion(String[] words) { version = words[1]; } protected void parseColumns(String[] words) { columns = new ArrayList<>(); numcolumns = Integer.parseInt(words[1]); } protected final void parseHeader() throws IOException { while ((line = headerReader.readLine()) != null) { lineNum++; while (line.contains(" ")) { line = line.replace(" ", " "); } String[] words = line.isEmpty() ? null : line.trim().split(" "); if (words != null && words.length > 0) { parseHeaderLine(words); } } } protected abstract void parseHeaderLine(String[] words) throws IOException; }