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 advanced setting: expecting even number of entries");
054            }
055            ds.addPrimitive(node);
056        }
057        return ds;
058    }
059}