OC-13448 Intermittent SOE when processing some BuildSettings

This commit is contained in:
irengrig
2016-05-30 11:45:30 +02:00
parent 4499e41ad9
commit 102df7c3d1
6 changed files with 118 additions and 6 deletions
@@ -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"