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;
017import org.openstreetmap.josm.tools.Utils;
018
019/**
020 * Import a WMS layer from a serialized binary file previously exported via {@link WMSLayerExporter}.
021 * @since 5457
022 */
023public class WMSLayerImporter extends FileImporter {
024
025    /**
026     * The file filter used in "open" and "save" dialogs for WMS layers.
027     */
028    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
029            "wms", "wms", tr("WMS Files (*.wms)"));
030
031    private final WMSLayer wmsLayer;
032
033    /**
034     * Constructs a new {@code WMSLayerImporter}.
035     */
036    public WMSLayerImporter() {
037        this(new WMSLayer());
038    }
039
040    /**
041     * Constructs a new {@code WMSLayerImporter} that will import data to the specified WMS layer.
042     * @param wmsLayer The WMS layer.
043     */
044    public WMSLayerImporter(WMSLayer wmsLayer) {
045        super(FILE_FILTER);
046        this.wmsLayer = wmsLayer;
047    }
048
049    @Override
050    public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
051        CheckParameterUtil.ensureParameterNotNull(file, "file");
052        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
053        try {
054            wmsLayer.readExternal(ois);
055        } catch (ClassNotFoundException e) {
056            throw new IllegalDataException(e);
057        } finally {
058            Utils.close(ois);
059        }
060
061        // FIXME: remove UI stuff from IO subsystem
062        GuiHelper.runInEDT(new Runnable() {
063            @Override
064            public void run() {
065                Main.main.addLayer(wmsLayer);
066                wmsLayer.onPostLoadFromFile();
067            }
068        });
069    }
070
071    /**
072     * Replies the imported WMS layer.
073     * @return The imported WMS layer.
074     * @see #importData(File, ProgressMonitor)
075     */
076    public final WMSLayer getWmsLayer() {
077        return wmsLayer;
078    }
079}