/* * Copyright 2000-2009 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.openapi.extensions.impl; import com.intellij.openapi.extensions.AreaInstance; import com.intellij.openapi.extensions.ExtensionPoint; import com.intellij.openapi.extensions.Extensions; import junit.framework.TestCase; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author Alexander Kireyev */ public class ExtensionsComplexTest extends TestCase { private static final String PLUGIN_NAME = "the.test.plugin"; private static final String PLUGIN_NAME_2 = "another.test.plugin"; private static final String TEST_EP_NAME = "the.test.plugin.extensionPoint"; private static final String TEST_DEPENDENT1_NAME = "the.test.plugin.dependentOne"; private static final String TEST_DEPENDENT2_NAME = "the.test.plugin.dependentTwo"; private static final String TEST_DEPENDENT3_NAME = "another.test.plugin.dependentThree"; private static final String TEST_DEPENDENT_CHILD_NAME = "the.test.plugin.dependentChildThree"; private static final String EXTENSION_POINTS_ROOT = "<extensionPoints>\n" + " <extensionPoint name=\"extensionPoint\" beanClass=\"com.intellij.openapi.extensions.impl.XMLTestBean\" />\n" + " <extensionPoint name=\"dependentOne\" beanClass=\"com.intellij.openapi.extensions.impl.DependentObjectOne\" />\n" + "</extensionPoints>"; private static final String EXTENSION_POINTS_4_AREA = "<extensionPoints>\n" + " <extensionPoint name=\"dependentTwo\" beanClass=\"com.intellij.openapi.extensions.impl.DependentObjectTwo\" area=\"area\"/>\n" + " <extensionPoint name=\"extensionPoint4area\" beanClass=\"com.intellij.openapi.extensions.impl.XMLTestBean\" area=\"area\" />\n" + "</extensionPoints>"; private static final String EXTENSION_POINTS_4_CHILD_AREA = "<extensionPoints>\n" + " <extensionPoint name=\"dependentChildThree\" beanClass=\"com.intellij.openapi.extensions.impl.DependentObjectThree\" area=\"child_area\"/>\n" + "</extensionPoints>"; private static final String EXTENSIONS_ROOT = " <extensions xmlns=\"the.test.plugin\">\n" + " <extensionPoint>\n" + " <prop1>321</prop1>\n" + " </extensionPoint>\n" + " <dependentOne/>\n" + " </extensions>"; private static final String EXTENSIONS_ROOT_FAILING = " <extensions>\n" + " <extension point=\"the.test.plugin.extensionPoint\" implementation=\"com.intellij.openapi.extensions.impl.NonCreatableClass\" />\n" + " </extensions>"; private static final String EXTENSIONS_4_CHILD_AREA = " <extensions xmlns=\"the.test.plugin\">\n" + " <dependentChildThree area=\"child_area\"/>\n" + " </extensions>"; private static final String EXTENSION_POINTS_ROOT_2 = " <extensionPoints>\n" + " <extensionPoint name=\"anotherTestEP\" beanClass=\"com.intellij.openapi.extensions.impl.XMLTestBean\" />\n" + " </extensionPoints>"; private static final String EXTENSION_POINTS_4_AREA_2 = " <extensionPoints>\n" + " <extensionPoint area=\"area\" name=\"anotherTestEP4area\" beanClass=\"com.intellij.openapi.extensions.impl.XMLTestBean\" />\n" + " <extensionPoint name=\"dependentThree\" beanClass=\"com.intellij.openapi.extensions.impl.DependentObjectThree\" area=\"area\"/>\n" + " </extensionPoints>"; private static final String EXTENSIONS_4_AREA_2 = " <extensions xmlns=\"the.test.plugin\">\n" + " <extensionPoint4area area=\"area\"/>\n" + " </extensions>"; private static final String EXTENSIONS_4_AREA_2_PLUS = " <extensions xmlns=\"another.test.plugin\">\n" + " <dependentThree area=\"area\"/>\n" + " </extensions>"; private List<MyAreaInstance> myAreasToDispose; @Override protected void setUp() throws Exception { super.setUp(); myAreasToDispose = new ArrayList<MyAreaInstance>(); Extensions.registerAreaClass("area", null); Extensions.registerAreaClass("child_area", "area"); } @Override protected void tearDown() throws Exception { for (MyAreaInstance instance : myAreasToDispose) { Extensions.disposeArea(instance); } myAreasToDispose = null; for (ExtensionPoint extensionPoint : Extensions.getRootArea().getExtensionPoints()) { if (extensionPoint.getName().startsWith(PLUGIN_NAME) || extensionPoint.getName().startsWith(PLUGIN_NAME_2)) { Extensions.getRootArea().unregisterExtensionPoint(extensionPoint.getName()); } } super.tearDown(); } public void testPluginInit() throws Exception { initExtensionPoints( PLUGIN_NAME, "<extensionPoints>\n" + " <extensionPoint name=\"extensionPoint\" beanClass=\"com.intellij.openapi.extensions.impl.XMLTestBean\" />\n" + " <extensionPoint name=\"dependentOne\" beanClass=\"com.intellij.openapi.extensions.impl.DependentObjectOne\" />\n" + "</extensionPoints>", null); initExtensions( " <extensions xmlns=\"the.test.plugin\">\n" + " <extensionPoint>\n" + " <prop1>321</prop1>\n" + " </extensionPoint>\n" + " <dependentOne/>\n" + " </extensions>", null); assertTrue(Extensions.getRootArea().hasExtensionPoint("the.test.plugin.extensionPoint")); assertEquals(1, Extensions.getExtensions("the.test.plugin.extensionPoint").length); assertEquals(321, ((XMLTestBean)Extensions.getRootArea().getExtensionPoint("the.test.plugin.extensionPoint").getExtension()).getProp1()); assertEquals("the.test.plugin", ((XMLTestBean)Extensions.getRootArea().getExtensionPoint("the.test.plugin.extensionPoint").getExtension()).getPluginId().getIdString()); DependentObjectOne dependentObjectOne = (DependentObjectOne)Extensions.getRootArea().getExtensionPoint("the.test.plugin.dependentOne").getExtension(); assertEquals(1, dependentObjectOne.getTestBeans().length); AreaInstance areaInstance = new MyAreaInstance(); Extensions.instantiateArea("area", areaInstance, null); initExtensionPoints( PLUGIN_NAME, "<extensionPoints>\n" + " <extensionPoint name=\"dependentTwo\" beanClass=\"com.intellij.openapi.extensions.impl.DependentObjectTwo\" area=\"area\"/>\n" + " <extensionPoint name=\"extensionPoint4area\" beanClass=\"com.intellij.openapi.extensions.impl.XMLTestBean\" area=\"area\" />\n" + "</extensionPoints>", areaInstance); initExtensions( " <extensions xmlns=\"the.test.plugin\">\n" + " <extensionPoint4area area=\"area\"/>\n" + " <dependentTwo area=\"area\"/>\n" + " </extensions>", areaInstance); ExtensionPoint extensionPoint = Extensions.getArea(areaInstance).getExtensionPoint("the.test.plugin.extensionPoint4area"); assertNotNull(extensionPoint); assertSame(areaInstance, extensionPoint.getArea()); assertNotNull(extensionPoint.getExtension()); DependentObjectTwo dependentObjectTwo = (DependentObjectTwo)Extensions.getArea(areaInstance).getExtensionPoint("the.test.plugin.dependentTwo").getExtension(); assertSame(dependentObjectOne, dependentObjectTwo.getOne()); } public void _testPluginInitInAreas() throws Exception { initExtensionPoints(PLUGIN_NAME, "<extensionPoints>\n" + " <extensionPoint name=\"extensionPoint\" beanClass=\"com.intellij.openapi.extensions.impl.XMLTestBean\" />\n" + " <extensionPoint name=\"dependentOne\" beanClass=\"com.intellij.openapi.extensions.impl.DependentObjectOne\" />\n" + "</extensionPoints>", null); initExtensionPoints(PLUGIN_NAME_2, " <extensionPoints>\n" + " <extensionPoint name=\"anotherTestEP\" beanClass=\"com.intellij.openapi.extensions.impl.XMLTestBean\" />\n" + " </extensionPoints>", null); initExtensions(EXTENSIONS_ROOT, null); AreaInstance areaInstance1 = new MyAreaInstance(); Extensions.instantiateArea("area", areaInstance1, null); initExtensionsInAREA(areaInstance1); AreaInstance areaInstance2 = new MyAreaInstance(); Extensions.instantiateArea("area", areaInstance2, null); initExtensionsInAREA(areaInstance2); AreaInstance areaInstance3 = new MyAreaInstance(); Extensions.instantiateArea("area", areaInstance3, null); initExtensionsInAREA(areaInstance3); checkAreaInitialized(areaInstance1); checkAreaInitialized(areaInstance2); checkAreaInitialized(areaInstance3); MyAreaInstance childAreaInstance1 = new MyAreaInstance(); Extensions.instantiateArea("child_area", childAreaInstance1, areaInstance1); initExtensionsInCHILD_AREA(childAreaInstance1); MyAreaInstance childAreaInstance2 = new MyAreaInstance(); Extensions.instantiateArea("child_area", childAreaInstance2, areaInstance2); initExtensionsInCHILD_AREA(childAreaInstance2); // check initialization through PicoContainer DependentObjectOne dependentObjectOne = (DependentObjectOne)Extensions.getRootArea().getExtensionPoint(TEST_DEPENDENT1_NAME).getExtension(); assertEquals(1, dependentObjectOne.getTestBeans().length); DependentObjectTwo dependentObjectTwo = (DependentObjectTwo)Extensions.getArea(areaInstance1).getExtensionPoint(TEST_DEPENDENT2_NAME).getExtension(); assertSame(dependentObjectOne, dependentObjectTwo.getOne()); DependentObjectThree dependentObjectThree = (DependentObjectThree)Extensions.getArea(areaInstance1).getExtensionPoint(TEST_DEPENDENT3_NAME).getExtension(); assertSame(dependentObjectOne, dependentObjectThree.getOne()); assertSame(dependentObjectTwo, dependentObjectThree.getTwo()); assertTrue(Arrays.asList(dependentObjectThree.getTestBeans()).containsAll(Arrays.asList(dependentObjectOne.getTestBeans()))); // check PicoContainers assertTrue(Extensions.getRootArea().getPicoContainer().getComponentInstances().contains(dependentObjectOne)); assertTrue(Extensions.getArea(areaInstance1).getPicoContainer().getComponentInstances().contains(dependentObjectTwo)); assertTrue(Extensions.getArea(areaInstance1).getPicoContainer().getComponentInstances().contains(dependentObjectThree)); assertFalse(Extensions.getArea(areaInstance2).getPicoContainer().getComponentInstances().contains(dependentObjectThree)); assertTrue(Extensions.getRootArea().getPluginContainer(PLUGIN_NAME).getComponentInstances().contains(dependentObjectOne)); assertFalse(Extensions.getRootArea().getPluginContainer(PLUGIN_NAME_2).getComponentInstances().contains(dependentObjectOne)); assertTrue(Extensions.getArea(areaInstance1).getPluginContainer(PLUGIN_NAME).getComponentInstances().contains(dependentObjectTwo)); assertFalse(Extensions.getArea(areaInstance1).getPluginContainer(PLUGIN_NAME_2).getComponentInstances().contains(dependentObjectTwo)); assertTrue(Extensions.getArea(areaInstance1).getPluginContainer(PLUGIN_NAME_2).getComponentInstances().contains(dependentObjectThree)); // check area inheritance DependentObjectThree dependentChild1 = (DependentObjectThree)Extensions.getArea(childAreaInstance1).getExtensionPoint(TEST_DEPENDENT_CHILD_NAME).getExtension(); DependentObjectThree dependentChild2 = (DependentObjectThree)Extensions.getArea(childAreaInstance2).getExtensionPoint(TEST_DEPENDENT_CHILD_NAME).getExtension(); assertSame(dependentObjectTwo, dependentChild1.getTwo()); assertNotSame(dependentObjectTwo, dependentChild2.getTwo()); // Check extensions assertNotSame(Extensions.getArea(areaInstance1).getExtensionPoint("the.test.plugin.extensionPoint4area").getExtensions()[0], Extensions.getArea(areaInstance2).getExtensionPoint("the.test.plugin.extensionPoint4area").getExtensions()[0]); XMLTestBean ownExtension = new XMLTestBean(); ownExtension.setProp1(54321); Extensions.getArea(areaInstance1).getExtensionPoint("the.test.plugin.extensionPoint4area").registerExtension(ownExtension); ExtensionPoint ep = Extensions.getArea(areaInstance2).getExtensionPoint("the.test.plugin.extensionPoint4area"); ep.unregisterExtension(ep.getExtension()); ep.unregisterExtension(ep.getExtension()); assertEquals(3, Extensions.getArea(areaInstance1).getExtensionPoint("the.test.plugin.extensionPoint4area").getExtensions().length); assertEquals(54321, ((XMLTestBean)Extensions.getArea(areaInstance1).getExtensionPoint("the.test.plugin.extensionPoint4area").getExtensions()[2]).getProp1()); assertEquals(0, Extensions.getArea(areaInstance2).getExtensionPoint("the.test.plugin.extensionPoint4area").getExtensions().length); assertEquals(2, Extensions.getArea(areaInstance3).getExtensionPoint("the.test.plugin.extensionPoint4area").getExtensions().length); } private void initExtensionsInCHILD_AREA(final MyAreaInstance childAreaInstance1) { initExtensionPoints(PLUGIN_NAME, EXTENSION_POINTS_4_CHILD_AREA, childAreaInstance1); initExtensions(EXTENSIONS_4_CHILD_AREA, childAreaInstance1); } private void initExtensionsInAREA(final AreaInstance areaInstance1) { initExtensionPoints(PLUGIN_NAME, EXTENSION_POINTS_4_AREA, areaInstance1); initExtensionPoints(PLUGIN_NAME_2, EXTENSION_POINTS_4_AREA_2, areaInstance1); initExtensions(" <extensions xmlns=\"the.test.plugin\">\n" + " <extensionPoint4area area=\"area\"/>\n" + " <dependentTwo area=\"area\"/>\n" + " </extensions>", areaInstance1); initExtensions(EXTENSIONS_4_AREA_2, areaInstance1); initExtensions(EXTENSIONS_4_AREA_2_PLUS, areaInstance1); } private static void checkAreaInitialized(AreaInstance areaInstance) { assertNotNull(Extensions.getArea(areaInstance).getExtensionPoint("the.test.plugin.extensionPoint4area").getExtension()); assertEquals(2, Extensions.getArea(areaInstance).getExtensionPoint("the.test.plugin.extensionPoint4area").getExtensions().length); assertTrue(Extensions.getArea(areaInstance).hasExtensionPoint("another.test.plugin.anotherTestEP4area")); } private static void initExtensionPoints(@NonNls String pluginName, @NonNls String data, AreaInstance instance) { final Element element = ExtensionComponentAdapterTest.readElement(data); for (final Object o : element.getChildren()) { Element child = (Element)o; Extensions.getArea(instance).registerExtensionPoint(pluginName, child); } } private static void initExtensions(@NonNls String data, AreaInstance instance) { final Element element = ExtensionComponentAdapterTest.readElement(data); for (final Object o : element.getChildren()) { Element child = (Element)o; Extensions.getArea(instance).registerExtension(element.getNamespaceURI(), child); } } private class MyAreaInstance implements AreaInstance { private MyAreaInstance() { myAreasToDispose.add(this); } } }