source: josm/trunk/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java@ 14630

Last change on this file since 14630 was 12851, checked in by bastiK, 7 years ago

see #15229 - extract "struct" handling from Preference to StructUtils

  • Property svn:eol-style set to native
File size: 4.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io.session;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.io.IOException;
7import java.util.HashMap;
8import java.util.Map;
9
10import org.openstreetmap.josm.data.StructUtils;
11import org.openstreetmap.josm.data.imagery.ImageryInfo;
12import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
13import org.openstreetmap.josm.data.imagery.OffsetBookmark;
14import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
15import org.openstreetmap.josm.gui.layer.ImageryLayer;
16import org.openstreetmap.josm.gui.layer.Layer;
17import org.openstreetmap.josm.gui.layer.TMSLayer;
18import org.openstreetmap.josm.gui.layer.WMSLayer;
19import org.openstreetmap.josm.gui.layer.WMTSLayer;
20import org.openstreetmap.josm.gui.layer.imagery.ImageryFilterSettings;
21import org.openstreetmap.josm.gui.progress.ProgressMonitor;
22import org.openstreetmap.josm.io.IllegalDataException;
23import org.openstreetmap.josm.io.session.SessionReader.ImportSupport;
24import org.openstreetmap.josm.tools.Logging;
25import org.openstreetmap.josm.tools.Utils;
26import org.w3c.dom.Element;
27import org.w3c.dom.Node;
28import org.w3c.dom.NodeList;
29
30/**
31 * Session importer for {@link TMSLayer}, {@link WMSLayer} and {@link WMTSLayer}.
32 * @since 5391
33 */
34public 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}
Note: See TracBrowser for help on using the repository browser.