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.Main;
013import org.openstreetmap.josm.command.ChangePropertyCommand;
014import org.openstreetmap.josm.command.SequenceCommand;
015import org.openstreetmap.josm.data.APIDataSet;
016import org.openstreetmap.josm.data.osm.OsmPrimitive;
017
018/**
019 * Removes discardable tags such as created_by from all modified objects before upload
020 */
021public class DiscardTagsHook implements UploadHook {
022
023    @Override
024    public boolean checkUpload(APIDataSet apiDataSet) {
025        List<OsmPrimitive> objectsToUpload = apiDataSet.getPrimitives();
026        Collection<String> discardableKeys = new HashSet<>(OsmPrimitive.getDiscardableKeys());
027
028        boolean needsChange = false;
029        OUTER: for (OsmPrimitive osm : objectsToUpload) {
030            for (String key : osm.keySet()) {
031                if (discardableKeys.contains(key)) {
032                    needsChange = true;
033                    break OUTER;
034                }
035            }
036        }
037
038        if (needsChange) {
039            Map<String, String> map = new HashMap<>();
040            for (String key : discardableKeys) {
041                map.put(key, null);
042            }
043
044            SequenceCommand removeKeys = new SequenceCommand(tr("Removed obsolete tags"),
045                    new ChangePropertyCommand(objectsToUpload, map));
046            Main.main.undoRedo.add(removeKeys);
047        }
048        return true;
049    }
050
051}