001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.io;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.io.File;
007import java.io.FileInputStream;
008import java.io.IOException;
009import java.io.ObjectInputStream;
010
011import org.openstreetmap.josm.Main;
012import org.openstreetmap.josm.actions.ExtensionFileFilter;
013import org.openstreetmap.josm.gui.layer.WMSLayer;
014import org.openstreetmap.josm.gui.progress.ProgressMonitor;
015import org.openstreetmap.josm.gui.util.GuiHelper;
016import org.openstreetmap.josm.tools.CheckParameterUtil;
017
018/**
019 * Import a WMS layer from a serialized binary file previously exported via {@link WMSLayerExporter}.
020 * @since 5457
021 */
022public class WMSLayerImporter extends FileImporter {
023
024    /**
025     * The file filter used in "open" and "save" dialogs for WMS layers.
026     */
027    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
028            "wms", "wms", tr("WMS Files (*.wms)"));
029
030    private final WMSLayer wmsLayer;
031
032    /**
033     * Constructs a new {@code WMSLayerImporter}.
034     */
035    public WMSLayerImporter() {
036        this(new WMSLayer());
037    }
038
039    /**
040     * Constructs a new {@code WMSLayerImporter} that will import data to the specified WMS layer.
041     * @param wmsLayer The WMS layer.
042     */
043    public WMSLayerImporter(WMSLayer wmsLayer) {
044        super(FILE_FILTER);
045        this.wmsLayer = wmsLayer;
046    }
047
048    @Override
049    public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
050        CheckParameterUtil.ensureParameterNotNull(file, "file");
051        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
052            wmsLayer.readExternal(ois);
053        } catch (ClassNotFoundException e) {
054            throw new IllegalDataException(e);
055        }
056
057        // FIXME: remove UI stuff from IO subsystem
058        GuiHelper.runInEDT(new Runnable() {
059            @Override
060            public void run() {
061                Main.main.addLayer(wmsLayer);
062                wmsLayer.onPostLoadFromFile();
063            }
064        });
065    }
066
067    /**
068     * Replies the imported WMS layer.
069     * @return The imported WMS layer.
070     * @see #importData(File, ProgressMonitor)
071     */
072    public final WMSLayer getWmsLayer() {
073        return wmsLayer;
074    }
075}