diff --git a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java index ed5457116938..47e409329072 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java @@ -139,6 +139,7 @@ public class BasePathMacroManager extends PathMacroManager { } private class MyTrackingPathMacroSubstitutor implements TrackingPathMacroSubstitutor { + private final String myLock = new String("MyTrackingPathMacroSubstitutor.lock"); private final Map> myMacroToComponentNames = new FactoryMap>() { @Override protected Set create(String key) { @@ -158,8 +159,10 @@ public class BasePathMacroManager extends PathMacroManager { @Override public void reset() { - myMacroToComponentNames.clear(); - myComponentNameToMacros.clear(); + synchronized (myLock) { + myMacroToComponentNames.clear(); + myComponentNameToMacros.clear(); + } } @Override @@ -188,45 +191,52 @@ public class BasePathMacroManager extends PathMacroManager { @Override public void invalidateUnknownMacros(final Set macros) { - for (final String macro : macros) { - final Set components = myMacroToComponentNames.get(macro); - for (final String component : components) { - myComponentNameToMacros.remove(component); - } + synchronized (myLock) { + for (final String macro : macros) { + final Set components = myMacroToComponentNames.get(macro); + for (final String component : components) { + myComponentNameToMacros.remove(component); + } - myMacroToComponentNames.remove(macro); + myMacroToComponentNames.remove(macro); + } } } @Override public Collection getComponents(final Collection macros) { - final Set result = new HashSet(); - for (String macro : myMacroToComponentNames.keySet()) { - if (macros.contains(macro)) { - result.addAll(myMacroToComponentNames.get(macro)); + synchronized (myLock) { + final Set result = new HashSet(); + for (String macro : myMacroToComponentNames.keySet()) { + if (macros.contains(macro)) { + result.addAll(myMacroToComponentNames.get(macro)); + } } - } - return result; + return result; + } } @Override public Collection getUnknownMacros(final String componentName) { - final Set result = new HashSet(); - result.addAll(componentName == null ? myMacroToComponentNames.keySet() : myComponentNameToMacros.get(componentName)); - return Collections.unmodifiableCollection(result); + synchronized (myLock) { + final Set result = new HashSet(); + result.addAll(componentName == null ? myMacroToComponentNames.keySet() : myComponentNameToMacros.get(componentName)); + return Collections.unmodifiableCollection(result); + } } @Override public void addUnknownMacros(final String componentName, final Collection unknownMacros) { if (unknownMacros.isEmpty()) return; - - for (String unknownMacro : unknownMacros) { - final Set stringList = myMacroToComponentNames.get(unknownMacro); - stringList.add(componentName); - } - myComponentNameToMacros.get(componentName).addAll(unknownMacros); + synchronized (myLock) { + for (String unknownMacro : unknownMacros) { + myMacroToComponentNames.get(unknownMacro).add(componentName); + } + + myComponentNameToMacros.get(componentName).addAll(unknownMacros); + } } }