From 3592c743fbe606418e2c307e1daed2de2ca4e435 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 18 May 2017 16:22:25 +0200 Subject: [PATCH] SSR: prevent NPE (EA-101430) --- .../plugin/ui/ConfigurationManager.java | 133 ++++++++---------- .../plugin/ui/ExistingTemplatesComponent.java | 6 +- 2 files changed, 58 insertions(+), 81 deletions(-) diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ConfigurationManager.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ConfigurationManager.java index 19e39e8ade6a..2f0d4955c75e 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ConfigurationManager.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ConfigurationManager.java @@ -23,12 +23,12 @@ import com.intellij.openapi.ui.NonEmptyInputValidator; import com.intellij.structuralsearch.SSRBundle; import com.intellij.structuralsearch.StructuralSearchUtil; import com.intellij.structuralsearch.plugin.replace.ui.ReplaceConfiguration; +import com.intellij.util.SmartList; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -39,122 +39,104 @@ public class ConfigurationManager implements PersistentStateComponent { @NonNls static final String REPLACE_TAG_NAME = "replaceConfiguration"; @NonNls private static final String SAVE_HISTORY_ATTR_NAME = "history"; - private List configurations; - private List historyConfigurations; + private final List configurations = new SmartList<>(); + private final List historyConfigurations = new SmartList<>(); public static ConfigurationManager getInstance(@NotNull Project project) { return ServiceManager.getService(project, ConfigurationManager.class); } - @Nullable @Override public Element getState() { final Element state = new Element("state"); - saveConfigurations(state); + writeConfigurations(state, configurations, historyConfigurations); return state; } @Override public void loadState(Element state) { - loadConfigurations(state); + configurations.clear(); + historyConfigurations.clear(); + readConfigurations(state, configurations, historyConfigurations); } public void addHistoryConfigurationToFront(Configuration configuration) { - if (historyConfigurations == null) historyConfigurations = new ArrayList<>(); - historyConfigurations.remove(configuration); historyConfigurations.add(0, configuration); configuration.setCreated(System.currentTimeMillis()); } public void removeHistoryConfiguration(Configuration configuration) { - if (historyConfigurations != null) { - historyConfigurations.remove(configuration); - } + historyConfigurations.remove(configuration); } public void addConfiguration(Configuration configuration) { - if (configurations == null) configurations = new ArrayList<>(); - - if (configurations.indexOf(configuration) == -1) { - configurations.add(configuration); - } + configurations.remove(configuration); + configurations.add(configuration); } public void removeConfiguration(Configuration configuration) { - if (configurations != null) { - configurations.remove(configuration); + configurations.remove(configuration); + } + + public static void writeConfigurations(@NotNull Element element, + @NotNull Collection configurations, + @NotNull Collection historyConfigurations) { + for (final Configuration configuration : configurations) { + saveConfiguration(element, configuration); + } + + for (final Configuration historyConfiguration : historyConfigurations) { + final Element infoElement = saveConfiguration(element, historyConfiguration); + infoElement.setAttribute(SAVE_HISTORY_ATTR_NAME, "1"); } } - public void saveConfigurations(Element element) { - writeConfigurations(element, configurations, historyConfigurations); - } - - public static void writeConfigurations(final Element element, - final Collection configurations, - final Collection historyConfigurations) { - if (configurations != null) { - for (final Configuration configuration : configurations) { - saveConfiguration(element, configuration); - } - } - - if (historyConfigurations != null) { - for (final Configuration historyConfiguration : historyConfigurations) { - final Element infoElement = saveConfiguration(element, historyConfiguration); - infoElement.setAttribute(SAVE_HISTORY_ATTR_NAME, "1"); - } - } - } - - public static Element saveConfiguration(Element element, final Configuration config) { - Element infoElement = new Element(config instanceof SearchConfiguration ? SEARCH_TAG_NAME : REPLACE_TAG_NAME); + private static Element saveConfiguration(@NotNull Element element, @NotNull Configuration config) { + final Element infoElement = new Element(config instanceof SearchConfiguration ? SEARCH_TAG_NAME : REPLACE_TAG_NAME); element.addContent(infoElement); config.writeExternal(infoElement); - return infoElement; } - public void loadConfigurations(Element element) { - if (configurations != null) return; - ArrayList configurations = new ArrayList<>(); - ArrayList historyConfigurations = new ArrayList<>(); - readConfigurations(element, configurations, historyConfigurations); - this.configurations = configurations; - this.historyConfigurations = historyConfigurations; - } + public static void readConfigurations(@NotNull Element element, + @NotNull Collection configurations, + @NotNull Collection historyConfigurations) { + for (final Element pattern : element.getChildren()) { + final Configuration config = readConfiguration(pattern); + if (config == null) continue; - public static void readConfigurations(final Element element, @NotNull Collection configurations, @NotNull Collection historyConfigurations) { - final List patterns = element.getChildren(); - - if (patterns != null && patterns.size() > 0) { - for (final Element pattern : patterns) { - final Configuration config = readConfiguration(pattern); - if (config == null) continue; - - if (pattern.getAttribute(SAVE_HISTORY_ATTR_NAME) != null) { - historyConfigurations.add(config); - } - else { - configurations.add(config); - } + if (pattern.getAttribute(SAVE_HISTORY_ATTR_NAME) != null) { + historyConfigurations.add(config); + } + else { + configurations.add(config); } } } - public static Configuration readConfiguration(final Element childElement) { - String s = childElement.getName(); - final Configuration config = - s.equals(SEARCH_TAG_NAME) ? new SearchConfiguration() : s.equals(REPLACE_TAG_NAME) ? new ReplaceConfiguration():null; - if (config != null) config.readExternal(childElement); + private static Configuration readConfiguration(@NotNull Element childElement) { + final String name = childElement.getName(); + final Configuration config; + if (name.equals(SEARCH_TAG_NAME)) { + config = new SearchConfiguration(); + } + else if (name.equals(REPLACE_TAG_NAME)) { + config = new ReplaceConfiguration(); + } + else { + return null; + } + config.readExternal(childElement); return config; } + @NotNull public Collection getConfigurations() { - return configurations; + return Collections.unmodifiableList(configurations); } + @Nullable public Configuration findConfigurationByName(String name) { final Configuration configuration = findConfigurationByName(configurations, name); if (configuration != null) { @@ -163,20 +145,17 @@ public class ConfigurationManager implements PersistentStateComponent { return findConfigurationByName(StructuralSearchUtil.getPredefinedTemplates(), name); } - public static Configuration findConfigurationByName(final Collection configurations, final String name) { - for(Configuration config:configurations) { + @Nullable + private static Configuration findConfigurationByName(final Collection configurations, final String name) { + for(Configuration config : configurations) { if (config.getName().equals(name)) return config; } - return null; } @NotNull public Collection getHistoryConfigurations() { - if (historyConfigurations == null) { - return Collections.emptyList(); - } - return historyConfigurations; + return Collections.unmodifiableList(historyConfigurations); } public static @Nullable String findAppropriateName(@NotNull final Collection configurations, @NotNull String _name, diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ExistingTemplatesComponent.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ExistingTemplatesComponent.java index eaa75e812beb..a444ba9bc837 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ExistingTemplatesComponent.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ExistingTemplatesComponent.java @@ -173,10 +173,8 @@ public class ExistingTemplatesComponent { public void setUserTemplates(ConfigurationManager configurationManager) { userTemplatesNode.removeAllChildren(); - if (configurationManager.getConfigurations() != null) { - for (final Configuration config : configurationManager.getConfigurations()) { - userTemplatesNode.add(new DefaultMutableTreeNode(config)); - } + for (final Configuration config : configurationManager.getConfigurations()) { + userTemplatesNode.add(new DefaultMutableTreeNode(config)); } patternTreeModel.reload(userTemplatesNode);