001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions.upload;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.util.Collection;
007import java.util.HashMap;
008import java.util.HashSet;
009import java.util.List;
010import java.util.Map;
011
012import org.openstreetmap.josm.command.ChangePropertyCommand;
013import org.openstreetmap.josm.command.SequenceCommand;
014import org.openstreetmap.josm.data.APIDataSet;
015import org.openstreetmap.josm.data.UndoRedoHandler;
016import org.openstreetmap.josm.data.osm.AbstractPrimitive;
017import org.openstreetmap.josm.data.osm.OsmPrimitive;
018
019/**
020 * Removes discardable tags such as created_by from all modified objects before upload
021 */
022public class DiscardTagsHook implements UploadHook {
023
024    @Override
025    public boolean checkUpload(APIDataSet apiDataSet) {
026        List<OsmPrimitive> objectsToUpload = apiDataSet.getPrimitives();
027        Collection<String> discardableKeys = new HashSet<>(AbstractPrimitive.getDiscardableKeys());
028
029        boolean needsChange = objectsToUpload.stream().flatMap(AbstractPrimitive::keys)
030                .anyMatch(discardableKeys::contains);
031
032        if (needsChange) {
033            Map<String, String> map = new HashMap<>();
034            for (String key : discardableKeys) {
035                map.put(key, null);
036            }
037
038            SequenceCommand removeKeys = new SequenceCommand(tr("Removed obsolete tags"),
039                    new ChangePropertyCommand(objectsToUpload, map));
040            UndoRedoHandler.getInstance().add(removeKeys);
041        }
042        return true;
043    }
044
045}