blob: 99c4308df7b8493b6a12dc59e82e2f739a02660c [file] [log] [blame]
/*
* 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);
}
}
}