diff --git a/json/src/com/jetbrains/jsonSchema/JsonSchemaFileType.java b/json/src/com/jetbrains/jsonSchema/JsonSchemaFileType.java index ce35bd313bde..d505b8e13bbb 100644 --- a/json/src/com/jetbrains/jsonSchema/JsonSchemaFileType.java +++ b/json/src/com/jetbrains/jsonSchema/JsonSchemaFileType.java @@ -19,10 +19,8 @@ import com.intellij.icons.AllIcons; import com.intellij.json.JsonLanguage; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.ex.FileTypeIdentifiableByVirtualFile; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.jsonSchema.ide.JsonSchemaService; +import com.jetbrains.jsonSchema.impl.JsonSchemaResourcesRootsProvider; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -64,7 +62,7 @@ public class JsonSchemaFileType extends LanguageFileType implements FileTypeIden @Override public boolean isMyFileType(@NotNull VirtualFile file) { - final Project project = ProjectUtil.guessProjectForFile(file); - return project != null && JsonSchemaService.Impl.get(project).isRegisteredSchemaFile(project, file); + if (JsonSchemaResourcesRootsProvider.ourFiles.getValue().contains(file)) return true; + return JsonSchemaFileTypeManager.getInstance().isJsonSchemaFile(file); } } diff --git a/json/src/com/jetbrains/jsonSchema/JsonSchemaFileTypeManager.java b/json/src/com/jetbrains/jsonSchema/JsonSchemaFileTypeManager.java new file mode 100644 index 000000000000..45fd1c74fffc --- /dev/null +++ b/json/src/com/jetbrains/jsonSchema/JsonSchemaFileTypeManager.java @@ -0,0 +1,99 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jetbrains.jsonSchema; + +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.project.ProjectManagerListener; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.FileContentUtilCore; +import com.jetbrains.jsonSchema.ide.JsonSchemaService; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author Irina.Chernushina on 5/30/2016. + */ +public class JsonSchemaFileTypeManager implements ProjectManagerListener { + private final Map> myFileSets = new ConcurrentHashMap>(); + private volatile boolean mySetsInitialized; + private static final Object LOCK = new Object(); + + public static JsonSchemaFileTypeManager getInstance() { + return ServiceManager.getService(JsonSchemaFileTypeManager.class); + } + + public boolean isJsonSchemaFile(@NotNull final VirtualFile file) { + ensureInitialized(); + for (Collection files : myFileSets.values()) { + if (files.contains(file)) return true; + } + return false; + } + + private void ensureInitialized() { + if (mySetsInitialized) return; + synchronized (LOCK) { + if (mySetsInitialized) return; + Project[] openProjects = ProjectManager.getInstance().getOpenProjects(); + for (Project openProject : openProjects) { + addProjectFiles(openProject); + } + mySetsInitialized = true; + } + } + + private Set addProjectFiles(@NotNull final Project project) { + final Set files = JsonSchemaService.Impl.getEx(project).getSchemaFiles(); + myFileSets.put(project, files); + return files; + } + + @Override + public void projectOpened(Project project) { + reparseFiles(addProjectFiles(project)); + } + + public void reset(@NotNull final Project project) { + final Collection files = myFileSets.remove(project); + reparseFiles(files); + } + + private static void reparseFiles(Collection files) { + if (files != null && !files.isEmpty()) { + FileContentUtilCore.reparseFiles(files); + } + } + + @Override + public boolean canCloseProject(Project project) { + return true; + } + + @Override + public void projectClosed(Project project) { + myFileSets.remove(project); + } + + @Override + public void projectClosing(Project project) { + } +} diff --git a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaResourcesRootsProvider.java b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaResourcesRootsProvider.java index df3fc11d9d14..b64ca49d694e 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaResourcesRootsProvider.java +++ b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaResourcesRootsProvider.java @@ -36,7 +36,7 @@ import java.util.Set; * @author Irina.Chernushina on 4/14/2016. */ public class JsonSchemaResourcesRootsProvider extends IndexableSetContributor { - private static final NotNullLazyValue> ourFiles = new AtomicNotNullLazyValue>() { + public static final NotNullLazyValue> ourFiles = new AtomicNotNullLazyValue>() { @NotNull @Override protected Set compute() { diff --git a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceEx.java b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceEx.java index 8c566a5eebaa..56e5e7db6e8b 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceEx.java +++ b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceEx.java @@ -19,10 +19,14 @@ import com.intellij.openapi.vfs.VirtualFile; import com.jetbrains.jsonSchema.ide.JsonSchemaService; import org.jetbrains.annotations.NotNull; +import java.util.Set; + /** * @author Irina.Chernushina on 4/1/2016. */ public interface JsonSchemaServiceEx extends JsonSchemaService { boolean checkFileForId(@NotNull String id, @NotNull VirtualFile file); + + Set getSchemaFiles(); } diff --git a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java index 789b30e2e89b..b2b16b002723 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java +++ b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java @@ -27,6 +27,7 @@ import com.intellij.util.NotNullFunction; import com.intellij.util.PairConsumer; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.Convertor; +import com.jetbrains.jsonSchema.JsonSchemaFileTypeManager; import com.jetbrains.jsonSchema.JsonSchemaVfsListener; import com.jetbrains.jsonSchema.extension.JsonSchemaFileProvider; import com.jetbrains.jsonSchema.extension.JsonSchemaImportedProviderMarker; @@ -205,6 +206,7 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { initialized = false; mySchemaFiles.clear(); } + JsonSchemaFileTypeManager.getInstance().reset(myProject); } @Nullable @@ -357,4 +359,12 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { public boolean checkFileForId(@NotNull final String id, @NotNull final VirtualFile file) { return myDefinitions.checkFileForId(id, file); } + + @Override + public Set getSchemaFiles() { + if (!initialized) { + ensureSchemaFiles(myProject); + } + return Collections.unmodifiableSet(mySchemaFiles); + } } diff --git a/platform/platform-resources/src/META-INF/JsonPlugin.xml b/platform/platform-resources/src/META-INF/JsonPlugin.xml index 7084bf11b9f1..856fcfcc1694 100644 --- a/platform/platform-resources/src/META-INF/JsonPlugin.xml +++ b/platform/platform-resources/src/META-INF/JsonPlugin.xml @@ -67,6 +67,7 @@ instance="com.jetbrains.jsonSchema.JsonSchemaMappingsConfigurable" nonDefaultProject="true"/> +