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(() -> { 088 Main.getLayerManager().addLayer(layer); 089 if (zoomTo != null) { 090 Main.map.mapView.zoomTo(zoomTo); 091 } 092 }); 093 } 094}