001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.io.importexport;
003
004import java.io.File;
005import java.io.IOException;
006import java.io.ObjectOutputStream;
007import java.nio.file.Files;
008
009import org.openstreetmap.josm.data.StructUtils;
010import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
011import org.openstreetmap.josm.gui.MainApplication;
012import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
013import org.openstreetmap.josm.gui.layer.Layer;
014import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
015import org.openstreetmap.josm.tools.CheckParameterUtil;
016
017/**
018 * Export a WMS layer to a serialized binary file that can be imported later via {@link WMSLayerImporter}.
019 *
020 * @since 5457
021 */
022public class WMSLayerExporter extends FileExporter {
023
024    /** Which version of the file we export */
025    public static final int CURRENT_FILE_VERSION = 6;
026
027    /**
028     * Constructs a new {@code WMSLayerExporter}
029     */
030    public WMSLayerExporter() {
031        super(WMSLayerImporter.FILE_FILTER);
032    }
033
034    @Override
035    public void exportData(File file, Layer layer) throws IOException {
036        CheckParameterUtil.ensureParameterNotNull(file, "file");
037        CheckParameterUtil.ensureParameterNotNull(layer, "layer");
038
039        if (layer instanceof AbstractTileSourceLayer) {
040            try (ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(file.toPath()))) {
041                oos.writeInt(CURRENT_FILE_VERSION); // file version
042                oos.writeObject(MainApplication.getMap().mapView.getCenter());
043                ImageryPreferenceEntry entry = new ImageryPreferenceEntry(((AbstractTileSourceLayer<?>) layer).getInfo());
044                oos.writeObject(StructUtils.serializeStruct(entry, ImageryPreferenceEntry.class));
045            }
046        }
047    }
048
049    @Override
050    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
051        setEnabled(e.getSource().getActiveLayer() instanceof AbstractTileSourceLayer);
052    }
053}