Ticket #13956: 13956_v1.patch
| File 13956_v1.patch, 9.4 KB (added by , 9 years ago) |
|---|
-
src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
68 68 69 69 /** Normalized keys: the key should be substituted by the value if the key was not found in presets */ 70 70 private static final Map<String, String> harmonizedKeys = new HashMap<>(); 71 /** The spell check preset values */72 private static volatile MultiMap<String, String> presetsValueData;71 /** The spell check preset values which are not stored in TaggingPresets */ 72 private static volatile MultiMap<String, String> additinalPresetsValueData; 73 73 /** The TagChecker data */ 74 74 private static final List<CheckerData> checkerData = new ArrayList<>(); 75 75 private static final List<String> ignoreDataStartsWith = new ArrayList<>(); … … 258 258 259 259 Collection<TaggingPreset> presets = TaggingPresets.getTaggingPresets(); 260 260 if (!presets.isEmpty()) { 261 presetsValueData = new MultiMap<>();261 additinalPresetsValueData = new MultiMap<>(); 262 262 for (String a : OsmPrimitive.getUninterestingKeys()) { 263 presetsValueData.putVoid(a);263 additinalPresetsValueData.putVoid(a); 264 264 } 265 265 // TODO directionKeys are no longer in OsmPrimitive (search pattern is used instead) 266 266 for (String a : Main.pref.getCollection(ValidatorPreference.PREFIX + ".knownkeys", 267 267 Arrays.asList(new String[]{"is_in", "int_ref", "fixme", "population"}))) { 268 presetsValueData.putVoid(a);268 additinalPresetsValueData.putVoid(a); 269 269 } 270 270 for (TaggingPreset p : presets) { 271 271 for (TaggingPresetItem i : p.data) { … … 285 285 Collection<String> values = ky.getValues(); 286 286 if (ky.key != null && values != null) { 287 287 try { 288 presetsValueData.putAll(ky.key, values);289 288 harmonizedKeys.put(harmonizeKey(ky.key), ky.key); 290 289 } catch (NullPointerException e) { 291 290 Main.error(e, p+": Unable to initialize "+ky+'.'); … … 308 307 return false; 309 308 } 310 309 310 private static Set<String> getPresetValues(String key) { 311 Set<String> res = TaggingPresets.PRESET_TAG_CACHE.get(key); 312 if (res != null) 313 return res; 314 return additinalPresetsValueData.get(key); 315 } 316 311 317 /** 312 318 * Determines if the given key is in internal presets. 313 319 * @param key key … … 315 321 * @since 9023 316 322 */ 317 323 public static boolean isKeyInPresets(String key) { 318 return presetsValueData.get(key) != null;324 return getPresetValues(key) != null; 319 325 } 320 326 321 327 /** … … 326 332 * @since 9023 327 333 */ 328 334 public static boolean isTagInPresets(String key, String value) { 329 final Set<String> values = presetsValueData.get(key);335 final Set<String> values = getPresetValues(key); 330 336 return values != null && (values.isEmpty() || values.contains(value)); 331 337 } 332 338 … … 465 471 .build()); 466 472 withErrors.put(p, "HTML"); 467 473 } 468 if (checkValues && key != null && value != null && !value.isEmpty() && presetsValueData != null) {474 if (checkValues && key != null && value != null && !value.isEmpty() && additinalPresetsValueData != null) { 469 475 if (!isTagIgnored(key, value)) { 470 476 if (!isKeyInPresets(key)) { 471 477 String prettifiedKey = harmonizeKey(key); … … 491 497 } else if (!isTagInPresets(key, value)) { 492 498 // try to fix common typos and check again if value is still unknown 493 499 String fixedValue = harmonizeValue(prop.getValue()); 494 Map<String, String> possibleValues = getPossibleValues( presetsValueData.get(key));500 Map<String, String> possibleValues = getPossibleValues(getPresetValues(key)); 495 501 if (possibleValues.containsKey(fixedValue)) { 496 502 final String newKey = possibleValues.get(fixedValue); 497 503 // misspelled preset value -
src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java
14 14 import java.util.Set; 15 15 import java.util.function.Function; 16 16 17 import org.openstreetmap.josm.Main;18 17 import org.openstreetmap.josm.data.osm.DataSet; 19 18 import org.openstreetmap.josm.data.osm.OsmPrimitive; 20 19 import org.openstreetmap.josm.data.osm.Relation; … … 112 111 protected MultiMap<String, String> tagCache; 113 112 114 113 /** 115 * the same as tagCache but for the preset keys and values can be accessed directly116 */117 protected static final MultiMap<String, String> PRESET_TAG_CACHE = new MultiMap<>();118 119 /**120 114 * Cache for tags that have been entered by the user. 121 115 */ 122 116 protected static final Set<UserInputTag> USER_INPUT_TAG_CACHE = new LinkedHashSet<>(); … … 215 209 } 216 210 217 211 protected static void cachePresetItem(TaggingPreset p, TaggingPresetItem item) { 218 if (item instanceof KeyedItem) { 219 KeyedItem ki = (KeyedItem) item; 220 if (ki.key != null && ki.getValues() != null) { 221 try { 222 PRESET_TAG_CACHE.putAll(ki.key, ki.getValues()); 223 } catch (NullPointerException e) { 224 Main.error(e, p + ": Unable to cache " + ki); 225 } 226 } 227 } else if (item instanceof Roles) { 212 if (item instanceof Roles) { 228 213 Roles r = (Roles) item; 229 214 for (Role i : r.roles) { 230 215 if (i.key != null) { … … 260 245 } 261 246 262 247 protected List<String> getPresetKeys() { 263 return new ArrayList<>( PRESET_TAG_CACHE.keySet());248 return new ArrayList<>(TaggingPresets.PRESET_TAG_CACHE.keySet()); 264 249 } 265 250 266 251 protected Collection<String> getUserInputKeys() { … … 286 271 } 287 272 288 273 protected static List<String> getPresetValues(String key) { 289 return new ArrayList<>( PRESET_TAG_CACHE.getValues(key));274 return new ArrayList<>(TaggingPresets.PRESET_TAG_CACHE.getValues(key)); 290 275 } 291 276 292 277 protected static Collection<String> getUserInputValues(String key) { -
src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresets.java
14 14 import org.openstreetmap.josm.data.osm.OsmPrimitive; 15 15 import org.openstreetmap.josm.gui.MenuScroller; 16 16 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 17 import org.openstreetmap.josm.gui.tagging.presets.items.CheckGroup; 18 import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem; 19 import org.openstreetmap.josm.gui.tagging.presets.items.Roles; 20 import org.openstreetmap.josm.tools.MultiMap; 17 21 import org.openstreetmap.josm.tools.SubclassFilteredCollection; 18 22 19 23 /** … … 25 29 /** The collection of tagging presets */ 26 30 private static final Collection<TaggingPreset> taggingPresets = new ArrayList<>(); 27 31 32 /** cache for key/value pairs found in the preset */ 33 public static final MultiMap<String, String> PRESET_TAG_CACHE = new MultiMap<>(); 34 28 35 /** The collection of listeners */ 29 36 private static final Collection<TaggingPresetListener> listeners = new ArrayList<>(); 30 37 … … 38 45 public static void readFromPreferences() { 39 46 taggingPresets.clear(); 40 47 taggingPresets.addAll(TaggingPresetReader.readFromPreferences(false, false)); 48 cachePresets(taggingPresets); 41 49 } 42 50 43 51 /** … … 87 95 } 88 96 89 97 /** 98 * Initialize the cache for presets. This is done only once. 99 * @param presets Tagging presets to cache 100 */ 101 private static void cachePresets(Collection<TaggingPreset> presets) { 102 for (final TaggingPreset p : presets) { 103 for (TaggingPresetItem item : p.data) { 104 cachePresetItem(p, item); 105 } 106 } 107 } 108 109 private static void cachePresetItem(TaggingPreset p, TaggingPresetItem item) { 110 if (item instanceof KeyedItem) { 111 KeyedItem ki = (KeyedItem) item; 112 if (ki.key != null && ki.getValues() != null) { 113 try { 114 PRESET_TAG_CACHE.putAll(ki.key, ki.getValues()); 115 } catch (NullPointerException e) { 116 Main.error(e, p + ": Unable to cache " + ki); 117 } 118 } 119 } else if (item instanceof Roles) { 120 } else if (item instanceof CheckGroup) { 121 for (KeyedItem check : ((CheckGroup) item).checks) { 122 cachePresetItem(p, check); 123 } 124 } 125 } 126 127 /** 90 128 * Replies a new collection containing all tagging presets. 91 129 * @return a new collection containing all tagging presets. Empty if presets are not initialized (never null) 92 130 */
