001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.tagging.presets;
003
004import java.util.Collection;
005import java.util.EnumSet;
006import java.util.LinkedList;
007import java.util.List;
008
009import org.openstreetmap.josm.Main;
010import org.openstreetmap.josm.data.osm.OsmPrimitive;
011
012/**
013 * List of tagging presets with name templates, allows to find appropriate template based on existing primitive
014 */
015public final class TaggingPresetNameTemplateList implements TaggingPresetListener {
016
017    private static TaggingPresetNameTemplateList instance;
018
019    private final List<TaggingPreset> presetsWithPattern = new LinkedList<>();
020
021    /**
022     * Replies the unique instance.
023     * @return the unique instance
024     */
025    public static synchronized TaggingPresetNameTemplateList getInstance() {
026        if (instance == null) {
027            instance = new TaggingPresetNameTemplateList();
028            TaggingPresets.addListener(instance);
029        }
030        return instance;
031    }
032
033    private TaggingPresetNameTemplateList() {
034        buildPresetsWithPattern();
035    }
036
037    private void buildPresetsWithPattern() {
038        synchronized (this) {
039            Main.debug("Building list of presets with name template");
040            presetsWithPattern.clear();
041            for (TaggingPreset tp : TaggingPresets.getTaggingPresets()) {
042                if (tp.nameTemplate != null) {
043                    presetsWithPattern.add(tp);
044                }
045            }
046        }
047    }
048
049    /**
050     * Finds and returns the first occurence of preset with template name matching the given primitive
051     * @param primitive The primitive to match
052     * @return the first occurence of preset with template name matching the primitive
053     */
054    public TaggingPreset findPresetTemplate(OsmPrimitive primitive) {
055        synchronized (this) {
056            for (TaggingPreset t : presetsWithPattern) {
057                Collection<TaggingPresetType> type = EnumSet.of(TaggingPresetType.forPrimitive(primitive));
058                if (t.typeMatches(type)) {
059                    if (t.nameTemplateFilter != null) {
060                        if (t.nameTemplateFilter.match(primitive))
061                            return t;
062                        else {
063                            continue;
064                        }
065                    } else if (t.matches(type, primitive.getKeys(), false)) {
066                        return t;
067                    }
068                }
069            }
070        }
071        return null;
072    }
073
074    @Override
075    public void taggingPresetsModified() {
076        buildPresetsWithPattern();
077    }
078}