diff --git a/platform/configuration-store-impl/src/com/intellij/openapi/components/impl/stores/ProjectStateStorageManager.java b/platform/configuration-store-impl/src/com/intellij/openapi/components/impl/stores/ProjectStateStorageManager.java index cf9fb545666d..8f9208612e36 100644 --- a/platform/configuration-store-impl/src/com/intellij/openapi/components/impl/stores/ProjectStateStorageManager.java +++ b/platform/configuration-store-impl/src/com/intellij/openapi/components/impl/stores/ProjectStateStorageManager.java @@ -65,8 +65,8 @@ public class ProjectStateStorageManager extends StateStorageManagerImpl { return fileSpec; } - private static boolean isWorkspace(final Map options) { - return options != null && Boolean.parseBoolean((String)options.get(ProjectStoreImpl.OPTION_WORKSPACE)); + private static boolean isWorkspace(@Nullable Map options) { + return options != null && Boolean.parseBoolean(options.get(ProjectStoreImpl.OPTION_WORKSPACE)); } @NotNull diff --git a/platform/core-api/src/com/intellij/openapi/components/ComponentConfig.java b/platform/core-api/src/com/intellij/openapi/components/ComponentConfig.java index 3ddea986f3d4..e547c1f29144 100644 --- a/platform/core-api/src/com/intellij/openapi/components/ComponentConfig.java +++ b/platform/core-api/src/com/intellij/openapi/components/ComponentConfig.java @@ -22,8 +22,8 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.xmlb.annotations.MapAnnotation; import com.intellij.util.xmlb.annotations.Property; import com.intellij.util.xmlb.annotations.Transient; +import org.jetbrains.annotations.Nullable; -import java.util.HashMap; import java.util.Map; public class ComponentConfig { @@ -39,7 +39,8 @@ public class ComponentConfig { @Property(surroundWithTag = false) @MapAnnotation(surroundWithTag = false, entryTagName = "option", keyAttributeName = "name", valueAttributeName = "value") - public Map options = new HashMap(); + @Nullable + public Map options; @Transient public PluginDescriptor pluginDescriptor; diff --git a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java index 913b3166b1cb..85cadb2baf6b 100644 --- a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java @@ -269,12 +269,12 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements return myComponentsRegistry.getComponentByName(name); } - protected boolean isComponentSuitable(Map options) { + protected boolean isComponentSuitable(@Nullable Map options) { return !isTrue(options, "internal") || ApplicationManager.getApplication().isInternal(); } - private static boolean isTrue(Map options, @NonNls @NotNull String option) { - return options != null && options.containsKey(option) && Boolean.valueOf(options.get(option)).booleanValue(); + private static boolean isTrue(@Nullable Map options, @NonNls @NotNull String option) { + return options != null && Boolean.parseBoolean(options.get(option)); } @Override @@ -389,7 +389,7 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements final Class interfaceClass = Class.forName(config.getInterfaceClass(), true, loader); final Class implementationClass = Comparing.equal(config.getInterfaceClass(), config.getImplementationClass()) ? interfaceClass : StringUtil.isEmpty(config.getImplementationClass()) ? null : Class.forName(config.getImplementationClass(), true, loader); - boolean overrides = Boolean.parseBoolean(config.options.get("overrides")); + boolean overrides = config.options != null && Boolean.parseBoolean(config.options.get("overrides")); MutablePicoContainer picoContainer = getPicoContainer(); if (overrides) { ComponentAdapter oldAdapter = picoContainer.getComponentAdapterOfType(interfaceClass); diff --git a/platform/util/src/com/intellij/util/xmlb/MapBinding.java b/platform/util/src/com/intellij/util/xmlb/MapBinding.java index ece96e40d569..7017bcc2d6b5 100644 --- a/platform/util/src/com/intellij/util/xmlb/MapBinding.java +++ b/platform/util/src/com/intellij/util/xmlb/MapBinding.java @@ -17,6 +17,7 @@ package com.intellij.util.xmlb; import com.intellij.util.ArrayUtil; import com.intellij.util.xmlb.annotations.MapAnnotation; +import gnu.trove.THashMap; import org.jdom.Attribute; import org.jdom.Content; import org.jdom.Element; @@ -124,6 +125,7 @@ class MapBinding extends Binding implements MultiNodeBinding, MainBinding { } @Override + @Nullable public Object deserialize(Object context, @NotNull Element element) { if (myMapAnnotation == null || myMapAnnotation.surroundWithTag()) { return deserialize(context, element.getChildren()); @@ -133,9 +135,12 @@ class MapBinding extends Binding implements MultiNodeBinding, MainBinding { } } - private Map deserialize(Object context, List childNodes) { + @Nullable + private Map deserialize(@Nullable Object context, @NotNull List childNodes) { Map map = (Map)context; - map.clear(); + if (map != null) { + map.clear(); + } for (Element childNode : childNodes) { if (!childNode.getName().equals(getEntryAttributeName())) { @@ -143,6 +148,10 @@ class MapBinding extends Binding implements MultiNodeBinding, MainBinding { continue; } + if (map == null) { + map = new THashMap(); + } + //noinspection unchecked map.put(deserializeKeyOrValue(childNode, getKeyAttributeName(), context, keyBinding, keyClass), deserializeKeyOrValue(childNode, getValueAttributeName(), context, valueBinding, valueClass));