From c74f63c1db04a9aa4887510d7ff91be3ef417e66 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 17 Jun 2014 14:43:39 +0400 Subject: [PATCH] remove all adapters when 'unregisterComponent' is called (fixed problem with duplicated ChangeListManager instances in BookmarkManagerTest, registered by ReformatOnlyVcsChangedTextTest) --- .../util/pico/DefaultPicoContainer.java | 15 ++++++- .../util/pico/IdeaPicoContainerTest.java | 42 +++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 platform/util/testSrc/com/intellij/util/pico/IdeaPicoContainerTest.java diff --git a/platform/util/src/com/intellij/util/pico/DefaultPicoContainer.java b/platform/util/src/com/intellij/util/pico/DefaultPicoContainer.java index 0b92057074ac..c51b950b67a7 100644 --- a/platform/util/src/com/intellij/util/pico/DefaultPicoContainer.java +++ b/platform/util/src/com/intellij/util/pico/DefaultPicoContainer.java @@ -165,9 +165,20 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable @Override public ComponentAdapter unregisterComponent(Object componentKey) { ComponentAdapter adapter = componentKeyToAdapterCache.remove(componentKey); - componentAdapters.remove(adapter); - + if (adapter instanceof AssignableToComponentAdapter) { + classNameToAdapter.remove(((AssignableToComponentAdapter)adapter).getAssignableToClassName()); + } + else { + do { + FList oldList = nonAssignableComponentAdapters.get(); + FList newList = oldList.without(adapter); + if (nonAssignableComponentAdapters.compareAndSet(oldList, newList)) { + break; + } + } + while (true); + } return adapter; } diff --git a/platform/util/testSrc/com/intellij/util/pico/IdeaPicoContainerTest.java b/platform/util/testSrc/com/intellij/util/pico/IdeaPicoContainerTest.java new file mode 100644 index 000000000000..55dd486b9045 --- /dev/null +++ b/platform/util/testSrc/com/intellij/util/pico/IdeaPicoContainerTest.java @@ -0,0 +1,42 @@ +/* + * Copyright 2000-2014 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.intellij.util.pico; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.picocontainer.MutablePicoContainer; + +public class IdeaPicoContainerTest { + private MutablePicoContainer myContainer; + + @Before + public void setUp() throws Exception { + myContainer = new IdeaPicoContainer(); + } + + @Test + public void testUnregister() throws Exception { + String key = "myObject"; + MyComponentClass instance = new MyComponentClass(); + myContainer.registerComponentInstance(key, instance); + Assert.assertEquals(1, myContainer.getComponentAdaptersOfType(MyComponentClass.class).size()); + myContainer.unregisterComponent(key); + Assert.assertTrue(myContainer.getComponentAdaptersOfType(MyComponentClass.class).isEmpty()); + } + + private static class MyComponentClass {} +} \ No newline at end of file