mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
json schema, refactor code to use schema file as key in service manager; remove method returning reader for schema provider - return file instead
This commit is contained in:
@@ -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<JsonSchemaMappings
|
||||
if (StringUtil.isEmptyOrSpaces(myView.getSchemaSubPath())) throw new ConfigurationException("Schema path is empty");
|
||||
final CollectConsumer<String> 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(), "; ");
|
||||
|
||||
@@ -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<String> 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(), "; ");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<T> {
|
||||
public interface JsonSchemaFileProvider {
|
||||
boolean isAvailable(@NotNull VirtualFile file);
|
||||
|
||||
@Nullable
|
||||
Reader getSchemaReader();
|
||||
|
||||
@NotNull
|
||||
String getName();
|
||||
|
||||
@NotNull
|
||||
Pair<SchemaType, T> getKey();
|
||||
VirtualFile getSchemaFile();
|
||||
|
||||
SchemaType getSchemaType();
|
||||
}
|
||||
|
||||
+20
-26
@@ -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<File> {
|
||||
public class JsonSchemaImportedProviderFactory implements JsonSchemaProviderFactory {
|
||||
private static final Logger LOG = Logger.getInstance("#com.jetbrains.jsonSchema.extension.JsonSchemaImportedProviderFactory");
|
||||
|
||||
@Override
|
||||
public List<JsonSchemaFileProvider<File>> getProviders(@Nullable Project project) {
|
||||
final List<JsonSchemaFileProvider<File>> list = new ArrayList<>();
|
||||
public List<JsonSchemaFileProvider> getProviders(@Nullable Project project) {
|
||||
final List<JsonSchemaFileProvider> 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<JsonSchemaFileProvider<File>> list) {
|
||||
@NotNull final List<JsonSchemaFileProvider> list) {
|
||||
final Map<String, JsonSchemaMappingsConfigurationBase.SchemaInfo> 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<File>, 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<Processor<VirtualFile>> myPatterns;
|
||||
|
||||
public MyProvider(@Nullable final Project project,
|
||||
@@ -115,10 +112,20 @@ public class JsonSchemaImportedProviderFactory implements JsonSchemaProviderFact
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Pair<SchemaType, File> 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;
|
||||
|
||||
+8
-33
@@ -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<JsonSchemaFileProvider<Object>> myProviders;
|
||||
private final List<JsonSchemaFileProvider> 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<JsonSchemaFileProvider<Object>> getProviders() {
|
||||
public List<JsonSchemaFileProvider> getProviders() {
|
||||
return myProviders;
|
||||
}
|
||||
|
||||
private static class MyJsonSchemaFileProvider implements JsonSchemaFileProvider<Object> {
|
||||
private static class MyJsonSchemaFileProvider implements JsonSchemaFileProvider {
|
||||
public static final Pair<SchemaType, Object> 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<SchemaType, Object> 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
|
||||
|
||||
@@ -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<T> {
|
||||
public interface JsonSchemaProviderFactory {
|
||||
ExtensionPointName<JsonSchemaProviderFactory> EP_NAME = ExtensionPointName.create("JavaScript.JsonSchema.ProviderFactory");
|
||||
|
||||
List<JsonSchemaFileProvider<T>> getProviders(@Nullable Project project);
|
||||
List<JsonSchemaFileProvider> 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,9 +23,9 @@ import java.util.List;
|
||||
/**
|
||||
* @author Irina.Chernushina on 2/16/2016.
|
||||
*/
|
||||
public class JsonSchemaSelfProviderFactory implements JsonSchemaProviderFactory<Object> {
|
||||
public class JsonSchemaSelfProviderFactory implements JsonSchemaProviderFactory {
|
||||
@Override
|
||||
public List<JsonSchemaFileProvider<Object>> getProviders(@Nullable Project project) {
|
||||
public List<JsonSchemaFileProvider> getProviders(@Nullable Project project) {
|
||||
return JsonSchemaProjectSelfProviderFactory.getInstance(project).getProviders();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<String> errorConsumer);
|
||||
boolean isSchemaFile(@NotNull VirtualFile file, @NotNull Consumer<String> errorConsumer);
|
||||
|
||||
@Nullable
|
||||
DocumentationProvider getDocumentationProvider(@Nullable VirtualFile file);
|
||||
|
||||
@@ -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<String, Pair<SchemaType, ?>> myId2Key;
|
||||
private final MultiMap<Pair<SchemaType, ?>, Pair<SchemaType, ?>> myCrossDependencies;
|
||||
private final BidirectionalMap<String, VirtualFile> myId2Key;
|
||||
private final MultiMap<VirtualFile, VirtualFile> myCrossDependencies;
|
||||
private final Map<String, Map<String, JsonSchemaObject>> myMap;
|
||||
@NotNull private final Consumer<PairConsumer<Pair<SchemaType, ?>, Consumer<Consumer<JsonSchemaObject>>>> mySchemasIterator;
|
||||
@NotNull private final Consumer<PairConsumer<VirtualFile, Consumer<Consumer<JsonSchemaObject>>>> mySchemasIterator;
|
||||
|
||||
public JsonSchemaExportedDefinitions(@NotNull Consumer<PairConsumer<Pair<SchemaType, ?>, Consumer<Consumer<JsonSchemaObject>>>> schemasIterator) {
|
||||
public JsonSchemaExportedDefinitions(@NotNull Consumer<PairConsumer<VirtualFile, Consumer<Consumer<JsonSchemaObject>>>> schemasIterator) {
|
||||
mySchemasIterator = schemasIterator;
|
||||
myLock = new Object();
|
||||
myMap = new HashMap<>();
|
||||
@@ -50,7 +46,7 @@ public class JsonSchemaExportedDefinitions {
|
||||
myCrossDependencies = new MultiMap<>();
|
||||
}
|
||||
|
||||
public void register(@NotNull Pair<SchemaType, ?> key, @NotNull final String url, @NotNull final Map<String, JsonSchemaObject> map) {
|
||||
public void register(@NotNull VirtualFile key, @NotNull final String url, @NotNull final Map<String, JsonSchemaObject> map) {
|
||||
synchronized (myLock) {
|
||||
myMap.put(url, map);
|
||||
myId2Key.put(url, key);
|
||||
@@ -60,16 +56,16 @@ public class JsonSchemaExportedDefinitions {
|
||||
}
|
||||
}
|
||||
|
||||
public JsonSchemaObject findDefinition(@NotNull Pair<SchemaType, ?> 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<SchemaType, ?> 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<String, JsonSchemaObject> 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<Pair<SchemaType, ?>, Consumer<Consumer<JsonSchemaObject>>>() {
|
||||
mySchemasIterator.consume(new PairConsumer<VirtualFile, Consumer<Consumer<JsonSchemaObject>>>() {
|
||||
@Override
|
||||
public void consume(Pair<SchemaType, ?> key, Consumer<Consumer<JsonSchemaObject>> consumer) {
|
||||
public void consume(VirtualFile key, Consumer<Consumer<JsonSchemaObject>> consumer) {
|
||||
if (!myInitialized || !myId2Key.containsValue(key)) {
|
||||
consumer.consume(new Consumer<JsonSchemaObject>() {
|
||||
@Override
|
||||
@@ -106,21 +102,21 @@ public class JsonSchemaExportedDefinitions {
|
||||
}
|
||||
}
|
||||
|
||||
public Set<Pair<SchemaType, ?>> dropKey(@NotNull Pair<SchemaType, ?> key) {
|
||||
final Set<Pair<SchemaType, ?>> dirtyKeys = new HashSet<>();
|
||||
public Set<VirtualFile> dropKey(@NotNull VirtualFile key) {
|
||||
final Set<VirtualFile> dirtyKeys = new HashSet<>();
|
||||
synchronized (myLock) {
|
||||
myDirty = true;
|
||||
final ArrayDeque<Pair<SchemaType, ?>> queue = new ArrayDeque<>();
|
||||
final ArrayDeque<VirtualFile> queue = new ArrayDeque<>();
|
||||
queue.add(key);
|
||||
while (!queue.isEmpty()) {
|
||||
final Pair<SchemaType, ?> current = queue.remove();
|
||||
final VirtualFile current = queue.remove();
|
||||
dirtyKeys.add(current);
|
||||
final List<String> keys = myId2Key.getKeysByValue(current);
|
||||
myId2Key.removeValue(current);
|
||||
if (keys != null && !keys.isEmpty()) {
|
||||
assert keys.size() == 1;
|
||||
myMap.remove(keys.get(0));
|
||||
final Collection<Pair<SchemaType, ?>> dependencies = myCrossDependencies.remove(current);
|
||||
final Collection<VirtualFile> 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<SchemaType, ?> 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<SchemaType, ?> myKey;
|
||||
@Nullable private final VirtualFile myKey;
|
||||
|
||||
public JsonSchemaReader(@NotNull final Pair<SchemaType, ?> 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<SchemaType, ?> key,
|
||||
@NotNull VirtualFile key,
|
||||
@NotNull final String string,
|
||||
Consumer<String> errorConsumer) throws IOException {
|
||||
final JsonSchemaReader reader = new JsonSchemaReader(key);
|
||||
@@ -76,7 +75,7 @@ public class JsonSchemaReader {
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void registerObjectsExportedDefinitions(@NotNull Pair<SchemaType, ?> 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<SchemaType, ?> key,
|
||||
public static JsonSchemaObject findDefinition(@Nullable VirtualFile key,
|
||||
@NotNull String ref,
|
||||
@NotNull final JsonSchemaObject root,
|
||||
@NotNull final Map<String, JsonSchemaObject> 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);
|
||||
|
||||
@@ -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<Pair<SchemaType, ?>, JsonSchemaObjectCodeInsightWrapper> myWrappers = new HashMap<>();
|
||||
private final Map<VirtualFile, JsonSchemaObjectCodeInsightWrapper> myWrappers = new HashMap<>();
|
||||
private final JsonSchemaExportedDefinitions myDefinitions;
|
||||
|
||||
public JsonSchemaServiceImpl(@Nullable Project project) {
|
||||
myLock = new Object();
|
||||
myProject = project;
|
||||
myDefinitions = new JsonSchemaExportedDefinitions(
|
||||
new Consumer<PairConsumer<Pair<SchemaType, ?>, Consumer<Consumer<JsonSchemaObject>>>>() {
|
||||
new Consumer<PairConsumer<VirtualFile, Consumer<Consumer<JsonSchemaObject>>>>() {
|
||||
@Override
|
||||
public void consume(PairConsumer<Pair<SchemaType, ?>, Consumer<Consumer<JsonSchemaObject>>> consumer) {
|
||||
public void consume(PairConsumer<VirtualFile, Consumer<Consumer<JsonSchemaObject>>> 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<String> errorConsumer) {
|
||||
public boolean isSchemaFile(@NotNull VirtualFile file, @NotNull final Consumer<String> 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<Pair<SchemaType, ?>, Consumer<Consumer<JsonSchemaObject>>> 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<VirtualFile, Consumer<Consumer<JsonSchemaObject>>> consumer) {
|
||||
final JsonSchemaProviderFactory[] factories = getProviderFactories();
|
||||
for (JsonSchemaProviderFactory factory : factories) {
|
||||
for (JsonSchemaFileProvider provider : factory.getProviders(myProject)) {
|
||||
consumer.consume(provider.getSchemaFile(),
|
||||
new Consumer<Consumer<JsonSchemaObject>>() {
|
||||
@Override
|
||||
public void consume(Consumer<JsonSchemaObject> 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<SchemaType, File> key) {
|
||||
public void dropProviderFromCache(@NotNull final VirtualFile key) {
|
||||
synchronized (myLock) {
|
||||
final Set<Pair<SchemaType, ?>> dirtySet = myDefinitions.dropKey(key);
|
||||
final Iterator<Pair<SchemaType, ?>> iterator = myWrappers.keySet().iterator();
|
||||
final Set<VirtualFile> dirtySet = myDefinitions.dropKey(key);
|
||||
final Iterator<VirtualFile> iterator = myWrappers.keySet().iterator();
|
||||
while (iterator.hasNext()) {
|
||||
final Pair<SchemaType, ?> 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<JsonSchemaObjectCodeInsightWrapper> getWrappers(@Nullable VirtualFile file) {
|
||||
if (file == null) return null;
|
||||
final List<JsonSchemaObjectCodeInsightWrapper> 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<SchemaType, ?> key = provider.getKey();
|
||||
final VirtualFile key = provider.getSchemaFile();
|
||||
synchronized (myLock) {
|
||||
JsonSchemaObjectCodeInsightWrapper wrapper = myWrappers.get(key);
|
||||
if (wrapper == null) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<String> {
|
||||
|
||||
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<String> {
|
||||
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<SchemaType, String> getKey() {
|
||||
return Pair.create(SchemaType.userSchema, mySchemaText);
|
||||
public VirtualFile getSchemaFile() {
|
||||
return mySchemaFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SchemaType getSchemaType() {
|
||||
return SchemaType.userSchema;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<LookupElement> foundVariants = JsonBySchemaObjectCompletionContributor.getCompletionVariants(schemaObject, element);
|
||||
|
||||
@@ -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<SchemaType, ?> 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);
|
||||
|
||||
Reference in New Issue
Block a user