diff --git a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java index ca518177ef11..cf6189101dcf 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java +++ b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java @@ -16,6 +16,7 @@ import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.impl.http.HttpVirtualFile; import com.intellij.util.containers.ConcurrentList; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; import com.intellij.util.messages.MessageBusConnection; import com.jetbrains.jsonSchema.JsonSchemaCatalogProjectConfiguration; import com.jetbrains.jsonSchema.JsonSchemaVfsListener; @@ -23,7 +24,6 @@ import com.jetbrains.jsonSchema.extension.*; import com.jetbrains.jsonSchema.ide.JsonSchemaService; import com.jetbrains.jsonSchema.remote.JsonFileResolver; import com.jetbrains.jsonSchema.remote.JsonSchemaCatalogManager; -import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -213,7 +213,7 @@ public class JsonSchemaServiceImpl implements JsonSchemaService { @Override public List getAllUserVisibleSchemas() { List schemas = myCatalogManager.getAllCatalogSchemas(); - Collection providers = myState.getProviders(); + Collection providers = myState.getProviders(); List results = ContainerUtil.newArrayListWithCapacity(schemas.size() + providers.size()); Set processedRemotes = ContainerUtil.newHashSet(); for (JsonSchemaFileProvider provider: providers) { @@ -406,23 +406,23 @@ public class JsonSchemaServiceImpl implements JsonSchemaService { private static class MyState { @NotNull private final Factory> myFactory; @NotNull private final Project myProject; - @NotNull private final ClearableLazyValue> myData; + @NotNull private final ClearableLazyValue> myData; private final AtomicBoolean myIsComputed = new AtomicBoolean(false); private MyState(@NotNull final Factory> factory, @NotNull Project project) { myFactory = factory; myProject = project; - myData = new ClearableLazyValue>() { + myData = new ClearableLazyValue>() { @NotNull @Override - public Map compute() { + public MultiMap compute() { myIsComputed.set(true); - return Collections.unmodifiableMap(createFileProviderMap(myFactory.create(), myProject)); + return createFileProviderMap(myFactory.create(), myProject); } @NotNull @Override - public final synchronized Map getValue() { + public final synchronized MultiMap getValue() { return super.getValue(); } @@ -439,7 +439,7 @@ public class JsonSchemaServiceImpl implements JsonSchemaService { } @NotNull - public Collection getProviders() { + public Collection getProviders() { return myData.getValue().values(); } @@ -450,7 +450,8 @@ public class JsonSchemaServiceImpl implements JsonSchemaService { @Nullable public JsonSchemaFileProvider getProvider(@NotNull final VirtualFile file) { - return myData.getValue().get(file); + final Collection providers = myData.getValue().get(file); + return providers.stream().filter(p -> p.getSchemaType() == SchemaType.userSchema).findFirst().orElse(providers.stream().findFirst().orElse(null)); } public boolean isComputed() { @@ -458,15 +459,15 @@ public class JsonSchemaServiceImpl implements JsonSchemaService { } @NotNull - private static Map createFileProviderMap(@NotNull final List list, + private static MultiMap createFileProviderMap(@NotNull final List list, @NotNull Project project) { // if there are different providers with the same schema files, // stream API does not allow to collect same keys with Collectors.toMap(): throws duplicate key - final Map map = new THashMap<>(); + final MultiMap map = MultiMap.create(); for (JsonSchemaFileProvider provider : list) { VirtualFile schemaFile = getSchemaForProvider(project, provider); if (schemaFile != null) { - map.put(schemaFile, provider); + map.putValue(schemaFile, provider); } } return map;