From 4740a88b5821ac356e7bcc9fb9e9f46b49146ea1 Mon Sep 17 00:00:00 2001 From: irengrig Date: Wed, 17 Feb 2016 13:37:30 +0100 Subject: [PATCH] WEB-20365 JSON Schema: do not remove schema silently on file move/delete --- ...sonSchemaMappingsProjectConfiguration.java | 53 +++++++++++++++ ...JsonSchemaRefactoringListenerProvider.java | 66 +++++++++++++++++++ .../JsonSchemaSelfProviderFactory.java | 14 +--- .../src/META-INF/JsonPlugin.xml | 1 + 4 files changed, 121 insertions(+), 13 deletions(-) create mode 100644 json/src/com/jetbrains/jsonSchema/JsonSchemaRefactoringListenerProvider.java diff --git a/json/src/com/jetbrains/jsonSchema/JsonSchemaMappingsProjectConfiguration.java b/json/src/com/jetbrains/jsonSchema/JsonSchemaMappingsProjectConfiguration.java index d132be205846..d9f82ea77ca0 100644 --- a/json/src/com/jetbrains/jsonSchema/JsonSchemaMappingsProjectConfiguration.java +++ b/json/src/com/jetbrains/jsonSchema/JsonSchemaMappingsProjectConfiguration.java @@ -2,9 +2,16 @@ package com.jetbrains.jsonSchema; import com.intellij.openapi.components.*; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.xmlb.annotations.Transient; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; +import java.util.HashMap; +import java.util.Map; /** * @author Irina.Chernushina on 2/2/2016. @@ -17,6 +24,8 @@ import java.io.File; ) public class JsonSchemaMappingsProjectConfiguration extends JsonSchemaMappingsConfigurationBase { private Project myProject; + @Transient + private final Map mySchemaFiles = new HashMap<>(); public static JsonSchemaMappingsProjectConfiguration getInstance(@NotNull final Project project) { return ServiceManager.getService(project, JsonSchemaMappingsProjectConfiguration.class); @@ -33,4 +42,48 @@ public class JsonSchemaMappingsProjectConfiguration extends JsonSchemaMappingsCo public File convertToAbsoluteFile(@NotNull String path) { return myProject.getBasePath() == null ? new File(path) : new File(myProject.getBasePath(), path); } + + public boolean isRegisteredSchemaFile(@NotNull VirtualFile file) { + return mySchemaFiles.containsKey(file); + } + + @Override + public void setState(@NotNull Map state) { + super.setState(state); + recalculateSchemaFiles(); + } + + @Override + public void addSchema(@NotNull SchemaInfo info) { + super.addSchema(info); + recalculateSchemaFiles(); + } + + @Override + public void removeSchema(@NotNull SchemaInfo info) { + super.removeSchema(info); + recalculateSchemaFiles(); + } + + @Override + public void loadState(JsonSchemaMappingsConfigurationBase state) { + super.loadState(state); + recalculateSchemaFiles(); + } + + private void recalculateSchemaFiles() { + mySchemaFiles.clear(); + if (myProject == null || myProject.getBaseDir() == null) return; + + for (JsonSchemaMappingsConfigurationBase.SchemaInfo info : myState.values()) { + final String pathToSchema = FileUtil.toSystemIndependentName(info.getRelativePathToSchema()); + final VirtualFile schemaFile = VfsUtil.findRelativeFile(myProject.getBaseDir(), pathToSchema); + if (schemaFile != null) mySchemaFiles.put(schemaFile, info); + } + } + + @Nullable + public SchemaInfo getSchemaBySchemaFile(@NotNull final VirtualFile file) { + return mySchemaFiles.get(file); + } } diff --git a/json/src/com/jetbrains/jsonSchema/JsonSchemaRefactoringListenerProvider.java b/json/src/com/jetbrains/jsonSchema/JsonSchemaRefactoringListenerProvider.java new file mode 100644 index 000000000000..8263e5f28717 --- /dev/null +++ b/json/src/com/jetbrains/jsonSchema/JsonSchemaRefactoringListenerProvider.java @@ -0,0 +1,66 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jetbrains.jsonSchema; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiUtilBase; +import com.intellij.refactoring.listeners.RefactoringElementListener; +import com.intellij.refactoring.listeners.RefactoringElementListenerProvider; +import com.intellij.refactoring.listeners.UndoRefactoringElementAdapter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Irina.Chernushina on 2/17/2016. + */ +public class JsonSchemaRefactoringListenerProvider implements RefactoringElementListenerProvider { + @Nullable + @Override + public RefactoringElementListener getListener(PsiElement element) { + if (element == null) { + return null; + } + VirtualFile fileAtElement = PsiUtilBase.asVirtualFile(element); + if (fileAtElement == null) { + return null; + } + Project project = element.getProject(); + final JsonSchemaMappingsProjectConfiguration configuration = JsonSchemaMappingsProjectConfiguration.getInstance(project); + final JsonSchemaMappingsConfigurationBase.SchemaInfo schemaInfo = configuration.getSchemaBySchemaFile(fileAtElement); + if (schemaInfo != null && project.getBaseDir() != null) { + return new UndoRefactoringElementAdapter() { + @Override + protected void refactored(@NotNull PsiElement element, @Nullable String oldQualifiedName) { + VirtualFile newFile = PsiUtilBase.asVirtualFile(element); + if (newFile != null) { + final String relativePath = VfsUtil.getRelativePath(newFile, project.getBaseDir()); + if (relativePath != null) { + configuration.removeSchema(schemaInfo); + final JsonSchemaMappingsConfigurationBase.SchemaInfo newSchema = + new JsonSchemaMappingsConfigurationBase.SchemaInfo(schemaInfo.getName(), relativePath, schemaInfo.isApplicationLevel(), + schemaInfo.getPatterns()); + configuration.addSchema(newSchema); + } + } + } + }; + } + return null; + } +} diff --git a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaSelfProviderFactory.java b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaSelfProviderFactory.java index c204eccd3e3f..c33ca8030d0a 100644 --- a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaSelfProviderFactory.java +++ b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaSelfProviderFactory.java @@ -18,11 +18,8 @@ package com.jetbrains.jsonSchema.extension; import com.intellij.json.JsonFileType; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ResourceUtil; -import com.jetbrains.jsonSchema.JsonSchemaMappingsConfigurationBase; import com.jetbrains.jsonSchema.JsonSchemaMappingsProjectConfiguration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -31,7 +28,6 @@ import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.net.URL; -import java.util.Map; /** * @author Irina.Chernushina on 2/16/2016. @@ -46,15 +42,7 @@ public class JsonSchemaSelfProviderFactory implements JsonSchemaProviderFactory @Override public boolean isAvailable(@NotNull VirtualFile file) { if (project == null || !JsonFileType.INSTANCE.equals(file.getFileType())) return false; - final JsonSchemaMappingsProjectConfiguration configuration = JsonSchemaMappingsProjectConfiguration.getInstance(project); - final Map map = configuration.getStateMap(); - for (JsonSchemaMappingsConfigurationBase.SchemaInfo info : map.values()) { - final String pathToSchema = FileUtil.toSystemIndependentName(info.getRelativePathToSchema()); - if (! file.getPath().endsWith(pathToSchema)) continue; - final VirtualFile schemaFile = VfsUtil.findRelativeFile(project.getBaseDir(), pathToSchema); - if (file.equals(schemaFile)) return true; - } - return false; + return JsonSchemaMappingsProjectConfiguration.getInstance(project).isRegisteredSchemaFile(file); } @Nullable diff --git a/platform/platform-resources/src/META-INF/JsonPlugin.xml b/platform/platform-resources/src/META-INF/JsonPlugin.xml index 1ece0fb40d13..e766c91dc76e 100644 --- a/platform/platform-resources/src/META-INF/JsonPlugin.xml +++ b/platform/platform-resources/src/META-INF/JsonPlugin.xml @@ -70,6 +70,7 @@ +