001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.layer.gpx; 003 004import java.util.Arrays; 005import java.util.Collection; 006import java.util.Iterator; 007import java.util.Optional; 008 009import org.openstreetmap.josm.data.gpx.GpxConstants; 010import org.openstreetmap.josm.data.osm.DataSet; 011import org.openstreetmap.josm.data.osm.Node; 012import org.openstreetmap.josm.gui.layer.OsmDataLayer; 013import org.openstreetmap.josm.gui.layer.markerlayer.Marker; 014import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer; 015import org.openstreetmap.josm.spi.preferences.Config; 016import org.openstreetmap.josm.tools.Logging; 017 018/** 019 * Converts a {@link MarkerLayer} to a {@link OsmDataLayer}. 020 * @since 14129 (extracted from {@link ConvertToDataLayerAction}) 021 */ 022public class ConvertFromMarkerLayerAction extends ConvertToDataLayerAction<MarkerLayer> { 023 024 /** 025 * Converts a {@link MarkerLayer} to a {@link OsmDataLayer}. 026 * @param layer marker layer 027 */ 028 public ConvertFromMarkerLayerAction(MarkerLayer layer) { 029 super(layer); 030 } 031 032 @Override 033 public DataSet convert() { 034 final DataSet ds = new DataSet(); 035 for (Marker marker : layer.data) { 036 final Node node = new Node(marker.getCoor()); 037 final Collection<String> mapping = Config.getPref().getList("gpx.to-osm-mapping", Arrays.asList( 038 GpxConstants.GPX_NAME, "name", 039 GpxConstants.GPX_DESC, "description", 040 GpxConstants.GPX_CMT, "note", 041 GpxConstants.GPX_SRC, "source", 042 GpxConstants.PT_SYM, "gpxicon")); 043 if (mapping.size() % 2 == 0) { 044 final Iterator<String> it = mapping.iterator(); 045 while (it.hasNext()) { 046 final String gpxKey = it.next(); 047 final String osmKey = it.next(); 048 Optional.ofNullable(marker.getTemplateValue(gpxKey, false)) 049 .map(String::valueOf) 050 .ifPresent(s -> node.put(osmKey, s)); 051 } 052 } else { 053 Logging.warn("Invalid gpx.to-osm-mapping Einstein setting: expecting even number of entries"); 054 } 055 ds.addPrimitive(node); 056 } 057 return ds; 058 } 059}