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.osm.AbstractPrimitive;
016import org.openstreetmap.josm.data.osm.OsmPrimitive;
017import org.openstreetmap.josm.gui.MainApplication;
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 = false;
030        OUTER: for (OsmPrimitive osm : objectsToUpload) {
031            for (String key : osm.keySet()) {
032                if (discardableKeys.contains(key)) {
033                    needsChange = true;
034                    break OUTER;
035                }
036            }
037        }
038
039        if (needsChange) {
040            Map<String, String> map = new HashMap<>();
041            for (String key : discardableKeys) {
042                map.put(key, null);
043            }
044
045            SequenceCommand removeKeys = new SequenceCommand(tr("Removed obsolete tags"),
046                    new ChangePropertyCommand(objectsToUpload, map));
047            MainApplication.undoRedo.add(removeKeys);
048        }
049        return true;
050    }
051
052}