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