diff --git a/json/src/com/jetbrains/jsonSchema/JsonSchemaConfigurable.java b/json/src/com/jetbrains/jsonSchema/JsonSchemaConfigurable.java index 91387f95db3a..2c92ba7d6e43 100644 --- a/json/src/com/jetbrains/jsonSchema/JsonSchemaConfigurable.java +++ b/json/src/com/jetbrains/jsonSchema/JsonSchemaConfigurable.java @@ -8,6 +8,8 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.CollectConsumer; import com.jetbrains.jsonSchema.ide.JsonSchemaService; import com.jetbrains.jsonSchema.impl.JsonSchemaReader; @@ -103,8 +105,11 @@ public class JsonSchemaConfigurable extends NamedConfigurable collectConsumer = new CollectConsumer<>(); final File file = new File(myProject.getBasePath(), myView.getSchemaSubPath()); + VirtualFile vFile = null; + if (!file.exists() || (vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file)) == null) + throw new ConfigurationException("Schema file does not exist"); final JsonSchemaService service = JsonSchemaService.Impl.get(myProject); - if (service != null && !service.isSchemaFile(file, collectConsumer)) { + if (service != null && !service.isSchemaFile(vFile, collectConsumer)) { final String message; if (collectConsumer.getResult().isEmpty()) message = "Can not read JSON schema from file (Unknown reason)"; else message = "Can not read JSON schema from file: " + StringUtil.join(collectConsumer.getResult(), "; "); diff --git a/json/src/com/jetbrains/jsonSchema/JsonSchemaMappingsConfigurable.java b/json/src/com/jetbrains/jsonSchema/JsonSchemaMappingsConfigurable.java index 1e8a6cd430e5..b490a58c1119 100644 --- a/json/src/com/jetbrains/jsonSchema/JsonSchemaMappingsConfigurable.java +++ b/json/src/com/jetbrains/jsonSchema/JsonSchemaMappingsConfigurable.java @@ -356,19 +356,18 @@ public class JsonSchemaMappingsConfigurable extends MasterDetailsComponent imple private String myError; public boolean checkSchemaFile() { - final File ioFile = new File(myFile.getPath()); - final long length = ioFile.length(); - if (length > MAX_SCHEMA_LENGTH) { - myError = "JSON schema was not loaded from '" + myFile.getName() + "' because it's too large (file size is " + length + " bytes)."; - return false; - } - if (length == 0) { - myError = "JSON schema was not loaded from '" + myFile.getName() + "'. File is empty."; - return false; - } + final long length = myFile.getLength(); + if (length > MAX_SCHEMA_LENGTH) { + myError = "JSON schema was not loaded from '" + myFile.getName() + "' because it's too large (file size is " + length + " bytes)."; + return false; + } + if (length == 0) { + myError = "JSON schema was not loaded from '" + myFile.getName() + "'. File is empty."; + return false; + } final CollectConsumer collectConsumer = new CollectConsumer<>(); final JsonSchemaService service = JsonSchemaService.Impl.get(myProject); - if (service != null && !service.isSchemaFile(ioFile, collectConsumer)) { + if (service != null && !service.isSchemaFile(myFile, collectConsumer)) { myError = "JSON Schema not found or contain error in '" + myFile.getName() + "'"; if (!collectConsumer.getResult().isEmpty()) { myError += ": " + StringUtil.join(collectConsumer.getResult(), "; "); diff --git a/json/src/com/jetbrains/jsonSchema/JsonSchemaVfsListener.java b/json/src/com/jetbrains/jsonSchema/JsonSchemaVfsListener.java index 87a9481be673..5577b2059199 100644 --- a/json/src/com/jetbrains/jsonSchema/JsonSchemaVfsListener.java +++ b/json/src/com/jetbrains/jsonSchema/JsonSchemaVfsListener.java @@ -16,14 +16,10 @@ package com.jetbrains.jsonSchema; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.*; -import com.jetbrains.jsonSchema.extension.SchemaType; import com.jetbrains.jsonSchema.impl.JsonSchemaServiceImpl; import org.jetbrains.annotations.NotNull; -import java.io.File; - /** * @author Irina.Chernushina on 3/30/2016. */ @@ -68,7 +64,7 @@ public class JsonSchemaVfsListener extends VirtualFileAdapter { private void onFileChange(@NotNull final VirtualFile file) { if (myMappingsProjectConfiguration.isRegisteredSchemaFile(file)) { - myService.dropProviderFromCache(Pair.create(SchemaType.userSchema, new File(file.getPath()))); + myService.dropProviderFromCache(file); } } } diff --git a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaFileProvider.java b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaFileProvider.java index 7281ef4f0b74..fd9475873c24 100644 --- a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaFileProvider.java +++ b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaFileProvider.java @@ -1,22 +1,16 @@ package com.jetbrains.jsonSchema.extension; -import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.io.Reader; - -public interface JsonSchemaFileProvider { +public interface JsonSchemaFileProvider { boolean isAvailable(@NotNull VirtualFile file); - @Nullable - Reader getSchemaReader(); - @NotNull String getName(); - @NotNull - Pair getKey(); + VirtualFile getSchemaFile(); + + SchemaType getSchemaType(); } diff --git a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaImportedProviderFactory.java b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaImportedProviderFactory.java index 67b27c4e4bc5..1bb4ea9cca59 100644 --- a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaImportedProviderFactory.java +++ b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaImportedProviderFactory.java @@ -3,8 +3,7 @@ package com.jetbrains.jsonSchema.extension; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; @@ -17,9 +16,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -29,12 +25,12 @@ import java.util.regex.Matcher; /** * @author Irina.Chernushina on 2/13/2016. */ -public class JsonSchemaImportedProviderFactory implements JsonSchemaProviderFactory { +public class JsonSchemaImportedProviderFactory implements JsonSchemaProviderFactory { private static final Logger LOG = Logger.getInstance("#com.jetbrains.jsonSchema.extension.JsonSchemaImportedProviderFactory"); @Override - public List> getProviders(@Nullable Project project) { - final List> list = new ArrayList<>(); + public List getProviders(@Nullable Project project) { + final List list = new ArrayList<>(); if (project != null) { processConfiguration(project, JsonSchemaMappingsProjectConfiguration.getInstance(project), list); @@ -44,17 +40,18 @@ public class JsonSchemaImportedProviderFactory implements JsonSchemaProviderFact } private static void processConfiguration(@Nullable Project project, @NotNull final JsonSchemaMappingsConfigurationBase configuration, - @NotNull final List> list) { + @NotNull final List list) { final Map map = configuration.getStateMap(); for (JsonSchemaMappingsConfigurationBase.SchemaInfo info : map.values()) { list.add(new MyProvider(project, info.getName(), configuration.convertToAbsoluteFile(info.getRelativePathToSchema()), info.getPatterns())); } } - private static class MyProvider implements JsonSchemaFileProvider, JsonSchemaImportedProviderMarker { + private static class MyProvider implements JsonSchemaFileProvider, JsonSchemaImportedProviderMarker { @Nullable private final Project myProject; @NotNull private final String myName; @NotNull private final File myFile; + private VirtualFile myVirtualFile; @NotNull private final List> myPatterns; public MyProvider(@Nullable final Project project, @@ -115,10 +112,20 @@ public class JsonSchemaImportedProviderFactory implements JsonSchemaProviderFact } } - @NotNull @Override - public Pair getKey() { - return Pair.create(SchemaType.userSchema, myFile); + public VirtualFile getSchemaFile() { + if (myVirtualFile != null && myVirtualFile.isValid()) return myVirtualFile; + final LocalFileSystem lfs = LocalFileSystem.getInstance(); + myVirtualFile = lfs.findFileByIoFile(myFile); + if (myVirtualFile == null) { + myVirtualFile = lfs.refreshAndFindFileByIoFile(myFile); + } + return myVirtualFile; + } + + @Override + public SchemaType getSchemaType() { + return SchemaType.userSchema; } @NotNull @@ -137,19 +144,6 @@ public class JsonSchemaImportedProviderFactory implements JsonSchemaProviderFact return false; } - @Nullable - @Override - public Reader getSchemaReader() { - try { - final String text = FileUtil.loadFile(myFile); - return new StringReader(text); - } - catch (IOException e) { - LOG.info(e); - return null; - } - } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProjectSelfProviderFactory.java b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProjectSelfProviderFactory.java index 46477e7c7353..b9a3f3152453 100644 --- a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProjectSelfProviderFactory.java +++ b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProjectSelfProviderFactory.java @@ -20,16 +20,10 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.ResourceUtil; import com.jetbrains.jsonSchema.JsonSchemaFileType; import com.jetbrains.jsonSchema.JsonSchemaMappingsProjectConfiguration; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.net.URL; import java.util.Collections; import java.util.List; @@ -39,7 +33,7 @@ import java.util.List; public class JsonSchemaProjectSelfProviderFactory { private static final Logger LOG = Logger.getInstance("#com.jetbrains.jsonSchema.extension.JsonSchemaProjectSelfProviderFactory"); public static final String SCHEMA_JSON_FILE_NAME = "schema.json"; - private final List> myProviders; + private final List myProviders; public static JsonSchemaProjectSelfProviderFactory getInstance(final Project project) { return ServiceManager.getService(project, JsonSchemaProjectSelfProviderFactory.class); @@ -49,11 +43,11 @@ public class JsonSchemaProjectSelfProviderFactory { myProviders = Collections.singletonList(new MyJsonSchemaFileProvider(project)); } - public List> getProviders() { + public List getProviders() { return myProviders; } - private static class MyJsonSchemaFileProvider implements JsonSchemaFileProvider { + private static class MyJsonSchemaFileProvider implements JsonSchemaFileProvider { public static final Pair KEY = Pair.create(SchemaType.schema, SchemaType.schema); private final Project myProject; @@ -67,39 +61,20 @@ public class JsonSchemaProjectSelfProviderFactory { return JsonSchemaMappingsProjectConfiguration.getInstance(myProject).isRegisteredSchemaFile(file); } - @Nullable - @Override - public Reader getSchemaReader() { - final String content = getContent(); - return content == null ? null : new StringReader(content); - } - @NotNull @Override public String getName() { return SCHEMA_JSON_FILE_NAME; } - @NotNull @Override - public Pair getKey() { - return KEY; + public VirtualFile getSchemaFile() { + return JsonSchemaProviderFactory.getResourceFile(JsonSchemaSelfProviderFactory.class, "jsonSchema/schema.json"); } - @Nullable - private static String getContent() { - ClassLoader loader = JsonSchemaSelfProviderFactory.class.getClassLoader(); - try { - URL resource = loader.getResource("jsonSchema/schema.json"); - assert resource != null; - - return ResourceUtil.loadText(resource); - } - catch (IOException e) { - LOG.error(e.getMessage(), e); - } - - return null; + @Override + public SchemaType getSchemaType() { + return SchemaType.schema; } @Override diff --git a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProviderFactory.java b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProviderFactory.java index dd8f7e0e821c..ec7dbec07848 100644 --- a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProviderFactory.java +++ b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProviderFactory.java @@ -3,12 +3,26 @@ package com.jetbrains.jsonSchema.extension; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.net.URL; import java.util.List; -public interface JsonSchemaProviderFactory { +public interface JsonSchemaProviderFactory { ExtensionPointName EP_NAME = ExtensionPointName.create("JavaScript.JsonSchema.ProviderFactory"); - List> getProviders(@Nullable Project project); + List getProviders(@Nullable Project project); + + static VirtualFile getResourceFile(@NotNull Class baseClass, @NotNull String resourcePath) { + final ClassLoader loader = baseClass.getClassLoader(); + final URL resource = loader.getResource(resourcePath); + assert resource != null; + + final VirtualFile file = VfsUtil.findFileByURL(resource); + assert file != null; + return file; + } } diff --git a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaSelfProviderFactory.java b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaSelfProviderFactory.java index 59cf2b812bc1..bf5c19cac9cc 100644 --- a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaSelfProviderFactory.java +++ b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaSelfProviderFactory.java @@ -23,9 +23,9 @@ import java.util.List; /** * @author Irina.Chernushina on 2/16/2016. */ -public class JsonSchemaSelfProviderFactory implements JsonSchemaProviderFactory { +public class JsonSchemaSelfProviderFactory implements JsonSchemaProviderFactory { @Override - public List> getProviders(@Nullable Project project) { + public List getProviders(@Nullable Project project) { return JsonSchemaProjectSelfProviderFactory.getInstance(project).getProviders(); } } diff --git a/json/src/com/jetbrains/jsonSchema/ide/JsonSchemaService.java b/json/src/com/jetbrains/jsonSchema/ide/JsonSchemaService.java index c04352faf63e..66df74ad20f5 100644 --- a/json/src/com/jetbrains/jsonSchema/ide/JsonSchemaService.java +++ b/json/src/com/jetbrains/jsonSchema/ide/JsonSchemaService.java @@ -13,7 +13,6 @@ import com.jetbrains.jsonSchema.impl.JsonSchemaServiceEx; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.File; import java.util.List; public interface JsonSchemaService { @@ -33,7 +32,7 @@ public interface JsonSchemaService { @Nullable CompletionContributor getCompletionContributor(@Nullable VirtualFile file); - boolean isSchemaFile(@NotNull File file, @NotNull Consumer errorConsumer); + boolean isSchemaFile(@NotNull VirtualFile file, @NotNull Consumer errorConsumer); @Nullable DocumentationProvider getDocumentationProvider(@Nullable VirtualFile file); diff --git a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaExportedDefinitions.java b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaExportedDefinitions.java index bc4409cc9a17..742898d3ec9a 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaExportedDefinitions.java +++ b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaExportedDefinitions.java @@ -15,17 +15,13 @@ */ package com.jetbrains.jsonSchema.impl; -import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import com.intellij.util.PairConsumer; import com.intellij.util.containers.BidirectionalMap; import com.intellij.util.containers.MultiMap; -import com.jetbrains.jsonSchema.extension.JsonSchemaProjectSelfProviderFactory; -import com.jetbrains.jsonSchema.extension.SchemaType; import org.jetbrains.annotations.NotNull; -import java.io.File; import java.util.*; import static com.jetbrains.jsonSchema.impl.JsonSchemaReader.LOG; @@ -37,12 +33,12 @@ public class JsonSchemaExportedDefinitions { private final Object myLock; private boolean myInitialized; private boolean myDirty; - private final BidirectionalMap> myId2Key; - private final MultiMap, Pair> myCrossDependencies; + private final BidirectionalMap myId2Key; + private final MultiMap myCrossDependencies; private final Map> myMap; - @NotNull private final Consumer, Consumer>>> mySchemasIterator; + @NotNull private final Consumer>>> mySchemasIterator; - public JsonSchemaExportedDefinitions(@NotNull Consumer, Consumer>>> schemasIterator) { + public JsonSchemaExportedDefinitions(@NotNull Consumer>>> schemasIterator) { mySchemasIterator = schemasIterator; myLock = new Object(); myMap = new HashMap<>(); @@ -50,7 +46,7 @@ public class JsonSchemaExportedDefinitions { myCrossDependencies = new MultiMap<>(); } - public void register(@NotNull Pair key, @NotNull final String url, @NotNull final Map map) { + public void register(@NotNull VirtualFile key, @NotNull final String url, @NotNull final Map map) { synchronized (myLock) { myMap.put(url, map); myId2Key.put(url, key); @@ -60,16 +56,16 @@ public class JsonSchemaExportedDefinitions { } } - public JsonSchemaObject findDefinition(@NotNull Pair requestingSchemaKey, @NotNull final String url, + public JsonSchemaObject findDefinition(@NotNull VirtualFile requestingSchemaKey, @NotNull final String url, @NotNull final String relativePart, @NotNull final JsonSchemaObject rootObject) { synchronized (myLock) { ensureInitialized(); - final Pair pair = myId2Key.get(url); - if (pair != null) myCrossDependencies.putValue(pair, requestingSchemaKey); + final VirtualFile key = myId2Key.get(url); + if (key != null) myCrossDependencies.putValue(key, requestingSchemaKey); final Map map = myMap.get(url); if (map != null) { - return JsonSchemaReader.findDefinition(pair, relativePart, rootObject, map, null); + return JsonSchemaReader.findDefinition(key, relativePart, rootObject, map, null); } } return null; @@ -78,9 +74,9 @@ public class JsonSchemaExportedDefinitions { private void ensureInitialized() { synchronized (myLock) { if (myInitialized && !myDirty) return; - mySchemasIterator.consume(new PairConsumer, Consumer>>() { + mySchemasIterator.consume(new PairConsumer>>() { @Override - public void consume(Pair key, Consumer> consumer) { + public void consume(VirtualFile key, Consumer> consumer) { if (!myInitialized || !myId2Key.containsValue(key)) { consumer.consume(new Consumer() { @Override @@ -106,21 +102,21 @@ public class JsonSchemaExportedDefinitions { } } - public Set> dropKey(@NotNull Pair key) { - final Set> dirtyKeys = new HashSet<>(); + public Set dropKey(@NotNull VirtualFile key) { + final Set dirtyKeys = new HashSet<>(); synchronized (myLock) { myDirty = true; - final ArrayDeque> queue = new ArrayDeque<>(); + final ArrayDeque queue = new ArrayDeque<>(); queue.add(key); while (!queue.isEmpty()) { - final Pair current = queue.remove(); + final VirtualFile current = queue.remove(); dirtyKeys.add(current); final List keys = myId2Key.getKeysByValue(current); myId2Key.removeValue(current); if (keys != null && !keys.isEmpty()) { assert keys.size() == 1; myMap.remove(keys.get(0)); - final Collection> dependencies = myCrossDependencies.remove(current); + final Collection dependencies = myCrossDependencies.remove(current); if (dependencies != null) { queue.addAll(dependencies); } @@ -131,17 +127,9 @@ public class JsonSchemaExportedDefinitions { } public boolean checkFileForId(@NotNull final String id, @NotNull final VirtualFile file) { - final Pair pair; synchronized (myLock) { ensureInitialized(); - pair = myId2Key.get(id); + return file.equals(myId2Key.get(id)); } - if (pair == null) return false; - if (SchemaType.schema.equals(pair.getFirst())) return JsonSchemaProjectSelfProviderFactory.SCHEMA_JSON_FILE_NAME - .equals(file.getName()); - if (SchemaType.embeddedSchema.equals(pair.getFirst())) return file.getName().equals(pair.getSecond()); - if (SchemaType.userSchema.equals(pair.getFirst())) return pair.getSecond() != null && - pair.getSecond().equals(new File(file.getPath())); - return false; } } diff --git a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaReader.java b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaReader.java index 55db02281b87..d13010ee184a 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaReader.java +++ b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaReader.java @@ -6,12 +6,11 @@ import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import com.intellij.notification.NotificationGroup; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import com.intellij.util.PairConvertor; import com.intellij.util.ThrowablePairConsumer; -import com.jetbrains.jsonSchema.extension.SchemaType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,9 +24,9 @@ import java.util.*; public class JsonSchemaReader { public static final Logger LOG = Logger.getInstance("#com.jetbrains.jsonSchema.impl.JsonSchemaReader"); public static final NotificationGroup ERRORS_NOTIFICATION = NotificationGroup.logOnlyGroup("JSON Schema"); - @NotNull private final Pair myKey; + @Nullable private final VirtualFile myKey; - public JsonSchemaReader(@NotNull final Pair key) { + public JsonSchemaReader(@Nullable final VirtualFile key) { myKey = key; } @@ -51,7 +50,7 @@ public class JsonSchemaReader { } public static boolean isJsonSchema(@NotNull JsonSchemaExportedDefinitions definitions, - @NotNull Pair key, + @NotNull VirtualFile key, @NotNull final String string, Consumer errorConsumer) throws IOException { final JsonSchemaReader reader = new JsonSchemaReader(key); @@ -76,7 +75,7 @@ public class JsonSchemaReader { return true; } - public static void registerObjectsExportedDefinitions(@NotNull Pair key, + public static void registerObjectsExportedDefinitions(@NotNull VirtualFile key, @NotNull final JsonSchemaExportedDefinitions definitionsObject, @NotNull final JsonSchemaObject object) { String id = object.getId(); @@ -162,7 +161,7 @@ public class JsonSchemaReader { } @Nullable - public static JsonSchemaObject findDefinition(@NotNull Pair key, + public static JsonSchemaObject findDefinition(@Nullable VirtualFile key, @NotNull String ref, @NotNull final JsonSchemaObject root, @NotNull final Map ids, @@ -175,7 +174,7 @@ public class JsonSchemaReader { if (!ref.startsWith("#/")) { int idx = ref.indexOf("#/"); if (idx == -1) throw new RuntimeException("Non-relative or erroneous reference: " + ref); - if (definitions == null) return null; + if (definitions == null || key == null) return null; final String url = ref.substring(0, idx); final String relative = ref.substring(idx); return definitions.findDefinition(key, url, relative, root); diff --git a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java index 1dc558bfe371..2d5fb9ad7ee6 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java +++ b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java @@ -16,7 +16,7 @@ import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.psi.PsiElement; @@ -28,13 +28,12 @@ import com.jetbrains.jsonSchema.JsonSchemaVfsListener; import com.jetbrains.jsonSchema.extension.JsonSchemaFileProvider; import com.jetbrains.jsonSchema.extension.JsonSchemaImportedProviderMarker; import com.jetbrains.jsonSchema.extension.JsonSchemaProviderFactory; -import com.jetbrains.jsonSchema.extension.SchemaType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.File; import java.io.IOException; import java.io.Reader; +import java.io.StringReader; import java.util.*; public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { @@ -43,16 +42,16 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { @Nullable private final Project myProject; private final Object myLock; - private final Map, JsonSchemaObjectCodeInsightWrapper> myWrappers = new HashMap<>(); + private final Map myWrappers = new HashMap<>(); private final JsonSchemaExportedDefinitions myDefinitions; public JsonSchemaServiceImpl(@Nullable Project project) { myLock = new Object(); myProject = project; myDefinitions = new JsonSchemaExportedDefinitions( - new Consumer, Consumer>>>() { + new Consumer>>>() { @Override - public void consume(PairConsumer, Consumer>> consumer) { + public void consume(PairConsumer>> consumer) { iterateSchemas(consumer); } }); @@ -63,7 +62,7 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { } @NotNull - protected JsonSchemaProviderFactory[] getProviderFactories() { + protected JsonSchemaProviderFactory[] getProviderFactories() { return JsonSchemaProviderFactory.EP_NAME.getExtensions(); } @@ -86,17 +85,17 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { } @Override - public boolean isSchemaFile(@NotNull File file, @NotNull final Consumer errorConsumer) { + public boolean isSchemaFile(@NotNull VirtualFile file, @NotNull final Consumer errorConsumer) { final String text; try { - text = FileUtil.loadFile(file); + text = VfsUtil.loadText(file); } catch (IOException e) { errorConsumer.consume(e.getMessage()); return false; } try { - return JsonSchemaReader.isJsonSchema(getDefinitions(), Pair.create(SchemaType.userSchema, file), text, errorConsumer); + return JsonSchemaReader.isJsonSchema(getDefinitions(), file, text, errorConsumer); } catch (IOException e) { reset(); @@ -136,13 +135,22 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { } @Nullable - private JsonSchemaObjectCodeInsightWrapper createWrapper(@NotNull JsonSchemaFileProvider provider) { - Reader reader = provider.getSchemaReader(); + private JsonSchemaObjectCodeInsightWrapper createWrapper(@NotNull JsonSchemaFileProvider provider) { + final JsonSchemaObject resultObject = readObject(provider, getDefinitions()); + if (resultObject == null) return null; + return new JsonSchemaObjectCodeInsightWrapper(provider.getName(), provider.getSchemaType(), resultObject); + } + + private static JsonSchemaObject readObject(@NotNull JsonSchemaFileProvider provider, + @Nullable final JsonSchemaExportedDefinitions definitions) { + final VirtualFile file = provider.getSchemaFile(); + if (file == null) return null; + Reader reader = null; try { - if (reader != null) { - final JsonSchemaObject resultObject = new JsonSchemaReader(provider.getKey()).read(reader, getDefinitions()); - return new JsonSchemaObjectCodeInsightWrapper(provider.getName(), provider.getKey().getFirst(), resultObject); - } + //noinspection StaticMethodReferencedViaSubclass + final String text = VfsUtil.loadText(file); + reader = new StringReader(text); + return new JsonSchemaReader(provider.getSchemaFile()).read(reader, definitions); } catch (Exception e) { logException(provider, e); @@ -188,35 +196,28 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { return null; } - public void iterateSchemas(@NotNull final PairConsumer, Consumer>> consumer) { - final JsonSchemaProviderFactory[] factories = getProviderFactories(); - for (JsonSchemaProviderFactory factory : factories) { - for (JsonSchemaFileProvider provider : factory.getProviders(myProject)) { - consumer.consume(provider.getKey(), + public void iterateSchemas(@NotNull final PairConsumer>> consumer) { + final JsonSchemaProviderFactory[] factories = getProviderFactories(); + for (JsonSchemaProviderFactory factory : factories) { + for (JsonSchemaFileProvider provider : factory.getProviders(myProject)) { + consumer.consume(provider.getSchemaFile(), new Consumer>() { @Override public void consume(Consumer consumer) { - final Reader reader = provider.getSchemaReader(); - if (reader == null) return; - try { - final JsonSchemaObject resultObject = new JsonSchemaReader(provider.getKey()).read(reader, null); - consumer.consume(resultObject); - } - catch (IOException e) { - logException(provider, e); - } + final JsonSchemaObject resultObject = readObject(provider, null); + if (resultObject != null) consumer.consume(resultObject); } }); } } } - public void dropProviderFromCache(@NotNull final Pair key) { + public void dropProviderFromCache(@NotNull final VirtualFile key) { synchronized (myLock) { - final Set> dirtySet = myDefinitions.dropKey(key); - final Iterator> iterator = myWrappers.keySet().iterator(); + final Set dirtySet = myDefinitions.dropKey(key); + final Iterator iterator = myWrappers.keySet().iterator(); while (iterator.hasNext()) { - final Pair current = iterator.next(); + final VirtualFile current = iterator.next(); if (dirtySet.contains(current)) iterator.remove(); } } @@ -226,11 +227,11 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { private List getWrappers(@Nullable VirtualFile file) { if (file == null) return null; final List wrappers = new ArrayList<>(); - JsonSchemaProviderFactory[] factories = getProviderFactories(); - for (JsonSchemaProviderFactory factory : factories) { - for (JsonSchemaFileProvider provider : factory.getProviders(myProject)) { + JsonSchemaProviderFactory[] factories = getProviderFactories(); + for (JsonSchemaProviderFactory factory : factories) { + for (JsonSchemaFileProvider provider : factory.getProviders(myProject)) { if (provider.isAvailable(file)) { - final Pair key = provider.getKey(); + final VirtualFile key = provider.getSchemaFile(); synchronized (myLock) { JsonSchemaObjectCodeInsightWrapper wrapper = myWrappers.get(key); if (wrapper == null) { diff --git a/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaHighlightingTest.java b/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaHighlightingTest.java index eff82464666b..2d72aa083ec1 100644 --- a/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaHighlightingTest.java +++ b/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaHighlightingTest.java @@ -11,13 +11,16 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; +import com.intellij.testFramework.PlatformTestCase; import com.intellij.testFramework.PlatformTestUtil; import com.jetbrains.jsonSchema.ide.JsonSchemaAnnotator; import com.jetbrains.jsonSchema.ide.JsonSchemaService; import org.jetbrains.annotations.NotNull; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -285,8 +288,13 @@ public class JsonSchemaHighlightingTest extends DaemonAnalyzerTestCase { doTest(file.getVirtualFile(), true, false); } - public static void registerProvider(Project project, @NotNull String schema) { - JsonSchemaTestServiceImpl.setProvider(new JsonSchemaTestProvider(schema)); + public static void registerProvider(Project project, @NotNull String schema) throws IOException { + File dir = PlatformTestCase.createTempDir("json_schema_test", true); + File child = new File(dir, "schema.json"); + child.createNewFile(); + FileUtil.writeToFile(child, schema); + VirtualFile schemaFile = getVirtualFile(child); + JsonSchemaTestServiceImpl.setProvider(new JsonSchemaTestProvider(schemaFile)); AreaPicoContainer container = Extensions.getArea(project).getPicoContainer(); String key = JsonSchemaService.class.getName(); container.unregisterComponent(key); diff --git a/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestProvider.java b/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestProvider.java index 7880a2a6c6a2..0d6a2678a8de 100644 --- a/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestProvider.java +++ b/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestProvider.java @@ -3,22 +3,16 @@ package com.jetbrains.jsonSchema; import com.intellij.json.JsonLanguage; import com.intellij.openapi.fileTypes.LanguageFileType; -import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.jetbrains.jsonSchema.extension.JsonSchemaFileProvider; import com.jetbrains.jsonSchema.extension.SchemaType; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.io.Reader; -import java.io.StringReader; +public class JsonSchemaTestProvider implements JsonSchemaFileProvider { + private final VirtualFile mySchemaFile; -public class JsonSchemaTestProvider implements JsonSchemaFileProvider { - - private final String mySchemaText; - - public JsonSchemaTestProvider(String text) { - mySchemaText = text; + public JsonSchemaTestProvider(VirtualFile schemaFile) { + mySchemaFile = schemaFile; } @Override @@ -26,21 +20,19 @@ public class JsonSchemaTestProvider implements JsonSchemaFileProvider { return file.getFileType() instanceof LanguageFileType && ((LanguageFileType)file.getFileType()).getLanguage().isKindOf(JsonLanguage.INSTANCE); } - @Nullable - @Override - public Reader getSchemaReader() { - return new StringReader(mySchemaText); - } - @NotNull @Override public String getName() { return "test"; } - @NotNull @Override - public Pair getKey() { - return Pair.create(SchemaType.userSchema, mySchemaText); + public VirtualFile getSchemaFile() { + return mySchemaFile; + } + + @Override + public SchemaType getSchemaType() { + return SchemaType.userSchema; } } diff --git a/json/tests/test/com/jetbrains/jsonSchema/impl/JsonBySchemaCompletionTest.java b/json/tests/test/com/jetbrains/jsonSchema/impl/JsonBySchemaCompletionTest.java index 961fcec2bb44..c9a2be951f0d 100644 --- a/json/tests/test/com/jetbrains/jsonSchema/impl/JsonBySchemaCompletionTest.java +++ b/json/tests/test/com/jetbrains/jsonSchema/impl/JsonBySchemaCompletionTest.java @@ -2,11 +2,9 @@ package com.jetbrains.jsonSchema.impl; import com.intellij.codeInsight.completion.CompletionTestCase; import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.testFramework.EditorTestUtil; -import com.jetbrains.jsonSchema.extension.SchemaType; import org.jetbrains.annotations.NotNull; import org.junit.Assert; @@ -111,7 +109,7 @@ public class JsonBySchemaCompletionTest extends CompletionTestCase { final PsiElement element = file.findElementAt(position); Assert.assertNotNull(element); - final JsonSchemaObject schemaObject = new JsonSchemaReader(Pair.create(SchemaType.userSchema, "tslint.json")).read(new StringReader(schema), null); + final JsonSchemaObject schemaObject = new JsonSchemaReader(null).read(new StringReader(schema), null); Assert.assertNotNull(schemaObject); final List foundVariants = JsonBySchemaObjectCompletionContributor.getCompletionVariants(schemaObject, element); diff --git a/json/tests/test/com/jetbrains/jsonSchema/impl/JsonSchemaReadTest.java b/json/tests/test/com/jetbrains/jsonSchema/impl/JsonSchemaReadTest.java index cc71061ffc60..220077fea6b5 100644 --- a/json/tests/test/com/jetbrains/jsonSchema/impl/JsonSchemaReadTest.java +++ b/json/tests/test/com/jetbrains/jsonSchema/impl/JsonSchemaReadTest.java @@ -1,9 +1,7 @@ package com.jetbrains.jsonSchema.impl; -import com.intellij.openapi.util.Pair; import com.intellij.testFramework.PlatformTestUtil; import com.intellij.util.concurrency.Semaphore; -import com.jetbrains.jsonSchema.extension.SchemaType; import org.junit.Assert; import org.junit.Test; @@ -19,13 +17,11 @@ import java.util.concurrent.atomic.AtomicReference; * @author Irina.Chernushina on 8/29/2015. */ public class JsonSchemaReadTest { - public static final Pair KEY = Pair.create(SchemaType.userSchema, "*"); - @org.junit.Test public void testReadSchemaItself() throws Exception { final File file = new File(PlatformTestUtil.getCommunityPath(), "json/tests/testData/jsonSchema/schema.json"); Assert.assertTrue(file.exists()); - final JsonSchemaReader reader = new JsonSchemaReader(KEY); + final JsonSchemaReader reader = new JsonSchemaReader(null); final JsonSchemaObject read = reader.read(new FileReader(file), null); Assert.assertEquals("http://json-schema.org/draft-04/schema#", read.getId()); @@ -65,7 +61,7 @@ public class JsonSchemaReadTest { public void testReadSchemaWithCustomTags() throws Exception { final File file = new File(PlatformTestUtil.getCommunityPath(), "json/tests/testData/jsonSchema/withNotesCustomTag.json"); Assert.assertTrue(file.exists()); - final JsonSchemaReader reader = new JsonSchemaReader(KEY); + final JsonSchemaReader reader = new JsonSchemaReader(null); final JsonSchemaObject read = reader.read(new FileReader(file), null); Assert.assertTrue(read.getDefinitions().get("common").getProperties().containsKey("id")); } @@ -93,7 +89,7 @@ public class JsonSchemaReadTest { final Thread thread = new Thread(new Runnable() { @Override public void run() { - final JsonSchemaReader reader = new JsonSchemaReader(KEY); + final JsonSchemaReader reader = new JsonSchemaReader(null); try { reader.read(new FileReader(file), null); done.set(true);