mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
OC-13448 Intermittent SOE when processing some BuildSettings
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Project, Collection<VirtualFile>> myFileSets = new ConcurrentHashMap<Project, Collection<VirtualFile>>();
|
||||
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<VirtualFile> 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<VirtualFile> addProjectFiles(@NotNull final Project project) {
|
||||
final Set<VirtualFile> 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<VirtualFile> files = myFileSets.remove(project);
|
||||
reparseFiles(files);
|
||||
}
|
||||
|
||||
private static void reparseFiles(Collection<VirtualFile> 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) {
|
||||
}
|
||||
}
|
||||
@@ -36,7 +36,7 @@ import java.util.Set;
|
||||
* @author Irina.Chernushina on 4/14/2016.
|
||||
*/
|
||||
public class JsonSchemaResourcesRootsProvider extends IndexableSetContributor {
|
||||
private static final NotNullLazyValue<Set<VirtualFile>> ourFiles = new AtomicNotNullLazyValue<Set<VirtualFile>>() {
|
||||
public static final NotNullLazyValue<Set<VirtualFile>> ourFiles = new AtomicNotNullLazyValue<Set<VirtualFile>>() {
|
||||
@NotNull
|
||||
@Override
|
||||
protected Set<VirtualFile> compute() {
|
||||
|
||||
@@ -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<VirtualFile> getSchemaFiles();
|
||||
}
|
||||
|
||||
@@ -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<VirtualFile> getSchemaFiles() {
|
||||
if (!initialized) {
|
||||
ensureSchemaFiles(myProject);
|
||||
}
|
||||
return Collections.unmodifiableSet(mySchemaFiles);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
instance="com.jetbrains.jsonSchema.JsonSchemaMappingsConfigurable" nonDefaultProject="true"/>
|
||||
<projectService serviceInterface="com.jetbrains.jsonSchema.ide.JsonSchemaService"
|
||||
serviceImplementation="com.jetbrains.jsonSchema.impl.JsonSchemaServiceImpl"/>
|
||||
<applicationService serviceImplementation="com.jetbrains.jsonSchema.JsonSchemaFileTypeManager"/>
|
||||
<annotator language="JSON" implementationClass="com.jetbrains.jsonSchema.ide.JsonSchemaAnnotator"/>
|
||||
<completion.contributor order="last, before JsonSchemaCompletionContributor" language="JSON" implementationClass="com.jetbrains.jsonSchema.ide.JsonSchemaCompletionContributor"/>
|
||||
<lang.documentationProvider language="JSON"
|
||||
|
||||
Reference in New Issue
Block a user