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.InvalidClassException;
010import java.io.ObjectInputStream;
011import java.util.Map;
012
013import org.openstreetmap.josm.Main;
014import org.openstreetmap.josm.actions.ExtensionFileFilter;
015import org.openstreetmap.josm.data.Preferences;
016import org.openstreetmap.josm.data.coor.EastNorth;
017import org.openstreetmap.josm.data.imagery.ImageryInfo;
018import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
019import org.openstreetmap.josm.gui.layer.ImageryLayer;
020import org.openstreetmap.josm.gui.progress.ProgressMonitor;
021import org.openstreetmap.josm.gui.util.GuiHelper;
022import org.openstreetmap.josm.tools.CheckParameterUtil;
023
024/**
025 * Import a WMS layer from a serialized binary file previously exported via {@link WMSLayerExporter}.
026 * @since 5457
027 */
028public class WMSLayerImporter extends FileImporter {
029
030    /**
031     * The file filter used in "open" and "save" dialogs for WMS layers.
032     */
033    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
034            "wms", "wms", tr("WMS Files (*.wms)"));
035
036    /**
037     * Constructs a new {@code WMSLayerImporter}.
038     */
039    public WMSLayerImporter() {
040        super(FILE_FILTER);
041    }
042
043    @Override
044    public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
045        CheckParameterUtil.ensureParameterNotNull(file, "file");
046        final EastNorth zoomTo;
047        ImageryInfo info = null;
048        final ImageryLayer layer;
049
050        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
051            int sfv = ois.readInt();
052            if (sfv < 5) {
053                throw new InvalidClassException(tr("Unsupported WMS file version; found {0}, expected {1}", sfv, 5));
054            } else if (sfv == 5) {
055                ois.readInt(); // dax - not needed
056                ois.readInt(); // day - not needed
057                zoomTo = null;
058
059                int imageSize = ois.readInt();
060                double pixelPerDegree = ois.readDouble();
061
062                String name = (String) ois.readObject();
063                String extendedUrl = (String) ois.readObject();
064
065                info = new ImageryInfo(name);
066                info.setExtendedUrl(extendedUrl);
067                info.setPixelPerDegree(pixelPerDegree);
068                info.setTileSize(imageSize);
069            } else if (sfv == WMSLayerExporter.CURRENT_FILE_VERSION) {
070                zoomTo = (EastNorth) ois.readObject();
071
072                @SuppressWarnings("unchecked")
073                ImageryPreferenceEntry entry = Preferences.deserializeStruct(
074                        (Map<String, String>) ois.readObject(),
075                        ImageryPreferenceEntry.class);
076                info = new ImageryInfo(entry);
077            } else {
078                throw new InvalidClassException(tr("Unsupported WMS file version; found {0}, expected {1}", sfv, 6));
079            }
080        } catch (ClassNotFoundException e) {
081            throw new IllegalDataException(e);
082        }
083        layer = ImageryLayer.create(info);
084
085
086        // FIXME: remove UI stuff from IO subsystem
087        GuiHelper.runInEDT(new Runnable() {
088            @Override
089            public void run() {
090                Main.getLayerManager().addLayer(layer);
091                if (zoomTo != null) {
092                    Main.map.mapView.zoomTo(zoomTo);
093                }
094            }
095        });
096    }
097}