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:
irengrig
2016-04-14 18:20:57 +02:00
parent 2a960a65fd
commit 47e6a5a615
16 changed files with 156 additions and 198 deletions
@@ -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();
}
@@ -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;
@@ -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);