001// License: Apache 2.0. For details, see LICENSE file.
002package org.openstreetmap.josm.plugins.wkt;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.io.File;
007import java.io.IOException;
008import java.io.InputStream;
009import java.util.Arrays;
010
011import javax.swing.JOptionPane;
012
013import org.openstreetmap.josm.actions.ExtensionFileFilter;
014import org.openstreetmap.josm.data.osm.DataSet;
015import org.openstreetmap.josm.gui.MainApplication;
016import org.openstreetmap.josm.gui.io.importexport.FileImporter;
017import org.openstreetmap.josm.gui.layer.OsmDataLayer;
018import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
019import org.openstreetmap.josm.gui.progress.ProgressMonitor;
020import org.openstreetmap.josm.gui.util.GuiHelper;
021import org.openstreetmap.josm.io.CachedFile;
022import org.openstreetmap.josm.io.Compression;
023import org.openstreetmap.josm.io.IllegalDataException;
024import org.openstreetmap.josm.tools.Logging;
025
026/**
027 * Modified version of geojson plugin. Thanks to the geojson authors:
028 * @author Ian Dees <ian.dees@gmail.com>
029 * @author matthieun <https://github.com/matthieun>
030 */
031public class WktFileImporter extends FileImporter {
032
033    private static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
034        "wkt,txt", "wkt", tr("WKT file") + " (*.wkt, *.txt)");
035
036    /**
037     * Constructs a new WKT File importer with an extension filter for .wkt and .txt
038     */
039    public WktFileImporter() {
040        super(FILE_FILTER);
041    }
042
043    @Override
044    public void importData(final File file, final ProgressMonitor progressMonitor) {
045        progressMonitor.beginTask(tr("Loading wkt file…"));
046        progressMonitor.setTicksCount(2);
047        Logging.info("Parsing WKT: {0}", file.getAbsolutePath());
048        try (InputStream fileInputStream = Compression.getUncompressedFileInputStream(file)) {
049            DataSet data = new WktReader().doParseDataSet(fileInputStream, progressMonitor);
050            progressMonitor.worked(1);
051            MainApplication.getLayerManager().addLayer(new OsmDataLayer(data, file.getName(), file));
052        } catch (final Exception e) {
053            Logging.error("Error while reading wkt file!");
054            Logging.error(e);
055            GuiHelper.runInEDT(() -> JOptionPane.showMessageDialog(
056                null, tr("Error loading wkt file {0}", file.getAbsolutePath()), tr("Error"), JOptionPane.WARNING_MESSAGE));
057        } finally {
058            progressMonitor.finishTask();
059        }
060    }
061
062    public DataSet parseDataSet(final String source) throws IOException, IllegalDataException {
063        try (CachedFile cf = new CachedFile(source)) {
064            InputStream fileInputStream = Compression.getUncompressedFileInputStream(cf.getFile());
065            return WktReader.parseDataSet(fileInputStream, NullProgressMonitor.INSTANCE);
066        }
067    }
068}