From c9828cf41470fad7f59c4e9cbe7a45f701775c08 Mon Sep 17 00:00:00 2001 From: Mike Aizatsky Date: Thu, 17 Feb 2005 23:09:02 +0300 Subject: [PATCH] Corrected extensions+container integration --- .../extensions/impl/AreaPicoContainer.java | 28 +++++++++++------- .../extensions/impl/ExtensionsAreaTest.java | 29 +++++++++++++++++++ 2 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionsAreaTest.java diff --git a/extensions/source/com/intellij/openapi/extensions/impl/AreaPicoContainer.java b/extensions/source/com/intellij/openapi/extensions/impl/AreaPicoContainer.java index 56ddc69de573..3e3f8360ae73 100644 --- a/extensions/source/com/intellij/openapi/extensions/impl/AreaPicoContainer.java +++ b/extensions/source/com/intellij/openapi/extensions/impl/AreaPicoContainer.java @@ -131,31 +131,37 @@ public class AreaPicoContainer extends AbstractDelegatingMutablePicoContainer im } public Collection getComponentAdapters() { - final List result = new ArrayList(); + final Set result = new HashSet(); if (getParent() != null) { result.addAll(getParent().getComponentAdapters()); } + + result.addAll(super.getComponentAdapters()); + accept(new EmptyPicoVisitor() { - public void visitComponentAdapter(ComponentAdapter componentAdapter) { - result.add(componentAdapter); + public void visitContainer(PicoContainer pico) { + if (pico != getDelegate()) result.addAll(pico.getComponentAdapters()); } }); + return result; } public List getComponentAdaptersOfType(final Class componentType) { - final List result = new ArrayList(); + final Set result = new HashSet(); if (getParent() != null) { result.addAll(getParent().getComponentAdaptersOfType(componentType)); } - accept(new EmptyPicoVisitor() { - public void visitComponentAdapter(ComponentAdapter componentAdapter) { - if (componentType.isAssignableFrom(componentAdapter.getComponentImplementation())) { - result.add(componentAdapter); - } + + final List componentAdapters = new ArrayList(getComponentAdapters()); + for (Iterator iterator = componentAdapters.iterator(); iterator.hasNext();) { + ComponentAdapter componentAdapter = (ComponentAdapter) iterator.next(); + if (componentType.isAssignableFrom(componentAdapter.getComponentImplementation())) { + result.add(componentAdapter); } - }); - return result; + } + + return new ArrayList(result); } public MutablePicoContainer makeChildContainer() { diff --git a/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionsAreaTest.java b/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionsAreaTest.java new file mode 100644 index 000000000000..6bd623c000f8 --- /dev/null +++ b/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionsAreaTest.java @@ -0,0 +1,29 @@ +package com.intellij.openapi.extensions.impl; + +import junit.framework.TestCase; +import org.picocontainer.defaults.DefaultPicoContainer; +import org.picocontainer.MutablePicoContainer; + +import java.util.List; + +/** + * @author mike + */ +public class ExtensionsAreaTest extends TestCase { + private ExtensionsAreaImpl myExtensionsArea; + private MutablePicoContainer myPicoContainer; + + protected void setUp() throws Exception { + super.setUp(); + + myExtensionsArea = new ExtensionsAreaImpl("foo", null, new DefaultPicoContainer(), null); + myPicoContainer = myExtensionsArea.getPicoContainer(); + } + + public void testGetComponentAdapterDoesntDuplicateAdapters() throws Exception { + myPicoContainer.registerComponentImplementation("runnable", ExtensionsAreaTest.class); + + final List adapters = myPicoContainer.getComponentAdaptersOfType(ExtensionsAreaTest.class); + assertEquals(1, adapters.size()); + } +}