diff --git a/json/src/com/jetbrains/jsonSchema/ide/JsonSchemaService.java b/json/src/com/jetbrains/jsonSchema/ide/JsonSchemaService.java index 4fb2b2de1590..29e91a4116e5 100644 --- a/json/src/com/jetbrains/jsonSchema/ide/JsonSchemaService.java +++ b/json/src/com/jetbrains/jsonSchema/ide/JsonSchemaService.java @@ -24,7 +24,7 @@ public interface JsonSchemaService { return ServiceManager.getService(project, JsonSchemaService.class); } public static JsonSchemaServiceEx getEx(@NotNull Project project) { - return (JsonSchemaServiceEx) ServiceManager.getService(project, JsonSchemaService.class); + return (JsonSchemaServiceEx) get(project); } } diff --git a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java index 08dbf0fb0a3b..25afa6561dda 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java +++ b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java @@ -42,14 +42,15 @@ import java.util.*; public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { private static final Logger LOGGER = Logger.getInstance(JsonSchemaServiceImpl.class); private static final Logger RARE_LOGGER = RareLogger.wrap(LOGGER, false); - @Nullable + @NotNull private final Project myProject; private final Object myLock; private final Map myWrappers = new HashMap<>(); - private final Set mySchemaFiles = new HashSet<>(); + private final Set mySchemaFiles = ContainerUtil.newConcurrentSet(); + private volatile boolean initialized; private final JsonSchemaExportedDefinitions myDefinitions; - public JsonSchemaServiceImpl(@Nullable Project project) { + public JsonSchemaServiceImpl(@NotNull Project project) { myLock = new Object(); myProject = project; myDefinitions = new JsonSchemaExportedDefinitions( @@ -59,10 +60,9 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { iterateSchemas(consumer); } }); - if (project != null) { - ApplicationManager - .getApplication().getMessageBus().connect(project).subscribe(VirtualFileManager.VFS_CHANGES, new JsonSchemaVfsListener(project, this)); - } + ApplicationManager + .getApplication().getMessageBus().connect(project).subscribe(VirtualFileManager.VFS_CHANGES, new JsonSchemaVfsListener(project, this)); + ensureSchemaFiles(project); } @NotNull @@ -90,21 +90,23 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { @Override public boolean isRegisteredSchemaFile(@NotNull Project project, @NotNull VirtualFile file) { - synchronized (myLock) { + if (!initialized) { ensureSchemaFiles(project); - return mySchemaFiles.contains(file); } + return mySchemaFiles.contains(file); } private void ensureSchemaFiles(@NotNull final Project project) { synchronized (myLock) { - if (!mySchemaFiles.isEmpty()) return; - final JsonSchemaProviderFactory[] factories = getProviderFactories(); - for (JsonSchemaProviderFactory factory : factories) { - final List providers = factory.getProviders(project); - for (JsonSchemaFileProvider provider : providers) { - mySchemaFiles.add(provider.getSchemaFile()); + if (!initialized) { + final JsonSchemaProviderFactory[] factories = getProviderFactories(); + for (JsonSchemaProviderFactory factory : factories) { + final List providers = factory.getProviders(project); + for (JsonSchemaFileProvider provider : providers) { + mySchemaFiles.add(provider.getSchemaFile()); + } } + initialized = true; } } } @@ -169,7 +171,7 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { @Nullable private JsonSchemaObjectCodeInsightWrapper createWrapper(@NotNull JsonSchemaFileProvider provider) { final JsonSchemaObject resultObject = readObject(provider, getDefinitions()); - if (resultObject == null || myProject == null) return null; + if (resultObject == null) return null; return new JsonSchemaObjectCodeInsightWrapper(myProject, provider.getName(), provider.getSchemaType(), provider.getSchemaFile(), resultObject); } @@ -211,6 +213,7 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { synchronized (myLock) { myWrappers.clear(); myDefinitions.reset(); + initialized = false; mySchemaFiles.clear(); } } @@ -257,7 +260,7 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { @Nullable private List getWrappers(@Nullable VirtualFile file) { - if (file == null || myProject == null) return null; + if (file == null) return null; final List wrappers = new ArrayList<>(); JsonSchemaProviderFactory[] factories = getProviderFactories(); synchronized (myLock) { @@ -284,9 +287,9 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { private static class CompositeCodeInsightProviderWithWarning implements CodeInsightProviders { private final List myWrappers; - private CompletionContributor myContributor; - private Annotator myAnnotator; - private DocumentationProvider myDocumentationProvider; + private final CompletionContributor myContributor; + private final Annotator myAnnotator; + private final DocumentationProvider myDocumentationProvider; public CompositeCodeInsightProviderWithWarning(List wrappers) { final List userSchemaWrappers = diff --git a/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestServiceImpl.java b/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestServiceImpl.java index f78b5bd23f72..e8de8d019598 100644 --- a/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestServiceImpl.java +++ b/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestServiceImpl.java @@ -19,7 +19,7 @@ public class JsonSchemaTestServiceImpl extends JsonSchemaServiceImpl { private static JsonSchemaFileProvider provider; - public JsonSchemaTestServiceImpl(@Nullable Project project) { + public JsonSchemaTestServiceImpl(@NotNull Project project) { super(project); }