1 | // License: GPL. For details, see LICENSE file.
|
---|
2 | package org.openstreetmap.josm.io.session;
|
---|
3 |
|
---|
4 | import static org.openstreetmap.josm.tools.I18n.tr;
|
---|
5 |
|
---|
6 | import java.io.IOException;
|
---|
7 | import java.util.HashMap;
|
---|
8 | import java.util.Map;
|
---|
9 |
|
---|
10 | import org.openstreetmap.josm.data.StructUtils;
|
---|
11 | import org.openstreetmap.josm.data.imagery.ImageryInfo;
|
---|
12 | import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
|
---|
13 | import org.openstreetmap.josm.data.imagery.OffsetBookmark;
|
---|
14 | import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
|
---|
15 | import org.openstreetmap.josm.gui.layer.ImageryLayer;
|
---|
16 | import org.openstreetmap.josm.gui.layer.Layer;
|
---|
17 | import org.openstreetmap.josm.gui.layer.TMSLayer;
|
---|
18 | import org.openstreetmap.josm.gui.layer.WMSLayer;
|
---|
19 | import org.openstreetmap.josm.gui.layer.WMTSLayer;
|
---|
20 | import org.openstreetmap.josm.gui.layer.imagery.ImageryFilterSettings;
|
---|
21 | import org.openstreetmap.josm.gui.progress.ProgressMonitor;
|
---|
22 | import org.openstreetmap.josm.io.IllegalDataException;
|
---|
23 | import org.openstreetmap.josm.io.session.SessionReader.ImportSupport;
|
---|
24 | import org.openstreetmap.josm.tools.Logging;
|
---|
25 | import org.openstreetmap.josm.tools.Utils;
|
---|
26 | import org.w3c.dom.Element;
|
---|
27 | import org.w3c.dom.Node;
|
---|
28 | import org.w3c.dom.NodeList;
|
---|
29 |
|
---|
30 | /**
|
---|
31 | * Session importer for {@link TMSLayer}, {@link WMSLayer} and {@link WMTSLayer}.
|
---|
32 | * @since 5391
|
---|
33 | */
|
---|
34 | public class ImagerySessionImporter implements SessionLayerImporter {
|
---|
35 |
|
---|
36 | @Override
|
---|
37 | public Layer load(Element elem, ImportSupport support, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
|
---|
38 | String version = elem.getAttribute("version");
|
---|
39 | if (!"0.1".equals(version)) {
|
---|
40 | throw new IllegalDataException(tr("Version ''{0}'' of meta data for imagery layer is not supported. Expected: 0.1", version));
|
---|
41 | }
|
---|
42 | Map<String, String> attributes = readProperties(elem);
|
---|
43 |
|
---|
44 | ImageryPreferenceEntry prefEntry = StructUtils.deserializeStruct(attributes, ImageryPreferenceEntry.class);
|
---|
45 | ImageryInfo info = new ImageryInfo(prefEntry);
|
---|
46 | ImageryLayer layer = ImageryLayer.create(info);
|
---|
47 | Utils.instanceOfThen(layer, AbstractTileSourceLayer.class, tsLayer -> {
|
---|
48 | tsLayer.getDisplaySettings().applyFromPropertiesMap(attributes);
|
---|
49 | if (!tsLayer.getDisplaySettings().isAutoZoom()) {
|
---|
50 | String zoomStr = attributes.get("zoom-level");
|
---|
51 | if (zoomStr != null) {
|
---|
52 | support.addPostLayersTask(() -> {
|
---|
53 | try {
|
---|
54 | tsLayer.setZoomLevel(Integer.parseInt(zoomStr));
|
---|
55 | } catch (NumberFormatException e) {
|
---|
56 | Logging.warn(e);
|
---|
57 | }
|
---|
58 | });
|
---|
59 | }
|
---|
60 | }
|
---|
61 | Element offsetEl = getFirstElementByTagName(elem, "offset");
|
---|
62 | if (offsetEl != null) {
|
---|
63 | Map<String, String> offsetAttributes = readProperties(offsetEl);
|
---|
64 | OffsetBookmark offset = OffsetBookmark.fromPropertiesMap(offsetAttributes);
|
---|
65 | tsLayer.getDisplaySettings().setOffsetBookmark(offset);
|
---|
66 | }
|
---|
67 | });
|
---|
68 | Element filtersEl = getFirstElementByTagName(elem, "filters");
|
---|
69 | if (filtersEl != null) {
|
---|
70 | ImageryFilterSettings filterSettings = layer.getFilterSettings();
|
---|
71 | if (filterSettings != null) {
|
---|
72 | Map<String, String> filtersProps = readProperties(filtersEl);
|
---|
73 | filterSettings.getProcessors().stream()
|
---|
74 | .flatMap(Utils.castToStream(SessionAwareReadApply.class))
|
---|
75 | .forEach(proc -> proc.applyFromPropertiesMap(filtersProps));
|
---|
76 | }
|
---|
77 | }
|
---|
78 | return layer;
|
---|
79 | }
|
---|
80 |
|
---|
81 | private static Element getFirstElementByTagName(Element el, String name) {
|
---|
82 | NodeList nl = el.getElementsByTagName(name);
|
---|
83 | if (nl.getLength() == 0)
|
---|
84 | return null;
|
---|
85 | return (Element) nl.item(0);
|
---|
86 | }
|
---|
87 |
|
---|
88 | private static Map<String, String> readProperties(Element elem) {
|
---|
89 | Map<String, String> attributes = new HashMap<>();
|
---|
90 | NodeList nodes = elem.getChildNodes();
|
---|
91 | for (int i = 0; i < nodes.getLength(); ++i) {
|
---|
92 | Node node = nodes.item(i);
|
---|
93 | if (node.getNodeType() == Node.ELEMENT_NODE && node.getChildNodes().getLength() <= 1) {
|
---|
94 | Element e = (Element) node;
|
---|
95 | attributes.put(e.getTagName(), e.getTextContent());
|
---|
96 | }
|
---|
97 | }
|
---|
98 | return attributes;
|
---|
99 | }
|
---|
100 | }
|
---|