// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.io;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InvalidClassException;
import java.io.ObjectInputStream;
import java.util.Map;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.ExtensionFileFilter;
import org.openstreetmap.josm.data.Preferences;
import org.openstreetmap.josm.data.coor.EastNorth;
import org.openstreetmap.josm.data.imagery.ImageryInfo;
import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
import org.openstreetmap.josm.gui.layer.ImageryLayer;
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
import org.openstreetmap.josm.gui.util.GuiHelper;
import org.openstreetmap.josm.tools.CheckParameterUtil;
/**
* Import a WMS layer from a serialized binary file previously exported via {@link WMSLayerExporter}.
* @since 5457
*/
public class WMSLayerImporter extends FileImporter {
/**
* The file filter used in "open" and "save" dialogs for WMS layers.
*/
public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
"wms", "wms", tr("WMS Files (*.wms)"));
/**
* Constructs a new {@code WMSLayerImporter}.
*/
public WMSLayerImporter() {
super(FILE_FILTER);
}
@Override
public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
CheckParameterUtil.ensureParameterNotNull(file, "file");
final EastNorth zoomTo;
ImageryInfo info = null;
final ImageryLayer layer;
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
int sfv = ois.readInt();
if (sfv < 5) {
throw new InvalidClassException(tr("Unsupported WMS file version; found {0}, expected {1}", sfv, 5));
} else if (sfv == 5) {
ois.readInt(); // dax - not needed
ois.readInt(); // day - not needed
zoomTo = null;
int imageSize = ois.readInt();
double pixelPerDegree = ois.readDouble();
String name = (String) ois.readObject();
String extendedUrl = (String) ois.readObject();
info = new ImageryInfo(name);
info.setExtendedUrl(extendedUrl);
info.setPixelPerDegree(pixelPerDegree);
info.setTileSize(imageSize);
} else if (sfv == WMSLayerExporter.CURRENT_FILE_VERSION) {
zoomTo = (EastNorth) ois.readObject();
@SuppressWarnings("unchecked")
ImageryPreferenceEntry entry = Preferences.deserializeStruct(
(Map<String, String>) ois.readObject(),
ImageryPreferenceEntry.class);
info = new ImageryInfo(entry);
} else {
throw new InvalidClassException(tr("Unsupported WMS file version; found {0}, expected {1}", sfv, 6));
}
} catch (ClassNotFoundException e) {
throw new IllegalDataException(e);
}
layer = ImageryLayer.create(info);
// FIXME: remove UI stuff from IO subsystem
GuiHelper.runInEDT(() -> {
Main.getLayerManager().addLayer(layer);
if (zoomTo != null) {
Main.map.mapView.zoomTo(zoomTo);
}
});
}
}