这只是一个很简单的例子,涉及到两个plugins(bundles),其中一个叫provider,提供了一个扩展点,另外一个叫customer,扩展了provider提供的扩展点,以下步骤在Eclipse中进行
1、在provider中创建一个ICalculator接口如下:
public interface ICalculator {
long add(int a,int b);
long multiple(int a,int b);
}
2、打开provider的plugin.xml文件,在Extension points tab页中添加一个扩展点,定义如下:
ID:Calculator
Name:Calculator
Schema:schema/Calculator.exsd
在provider的plugin.xml中会生成下面的片断:
编辑schema/Calculator.exsd,使其等同于下面的dtd:
point CDATA #REQUIRED
id CDATA #IMPLIED
name CDATA #IMPLIED>
id CDATA #REQUIRED
class CDATA #REQUIRED
type (normal|abnormal) >
3、用下面这段代码处理其他plugin对这个扩展点做的扩展:
IExtensionRegistry iextensionregistry = Platform.getExtensionRegistry();
IExtensionPoint iextensionpoint = iextensionregistry.getExtensionPoint("provider", "Calculator");
IExtension extensions[] = iextensionpoint.getExtensions();
if (extensions != null) {
System.out.println("There are " + extensions.length + " implementors of ICalculator");
for (int i = 0; i < extensions.length; i++) {
IConfigurationElement aiconfigurationelement[] = iextensionpoint
.getConfigurationElements();
if (aiconfigurationelement != null) {
for (int j = 0; j < aiconfigurationelement.length; j++)
if (aiconfigurationelement[j].getName().equals( "Calculator")) {
String id = aiconfigurationelement[j].getAttribute("id");
String clazz = aiconfigurationelement[j].getAttribute("class");
String type = aiconfigurationelement[j].getAttribute("type");
System.out.println("ID:" + id + ", class:" + clazz + ", type:" + type);
try {
Object obj = aiconfigurationelement[j].createExecutableExtension("class");
if (obj instanceof ICalculator) {
ICalculator cal = (ICalculator) obj;
System.out.println("6+7=" + cal.add(6, 7));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
注意加绿的代码
IExtensionRegistry对象的getExtensionPoint方法有两个参数,第一个是exsd的targetNameSpace,默认为provider的Plugin ID,第二个参数是扩展点的id。IConfigurationElement对象的createExecutableExtension("class")方法意思是在"Calculator"元素中(见最后的extension代码片断)寻找一个叫class的attribute(其值应该是实现了ICalculator的一个类的full qualified name),将其值对应的Object构建出来
4、在Customer plugin中新建一个类实现Provider plugin中的ICaculator接口,代码如下:
public class DefaultCalculator implements ICalculator {
public long add(int a, int b) {
return a + b;
}
public long multiple(int a, int b) {
return a * b;
}
}
5、打开Customer的plugin.xml,在Extensions Tab页中新建一个扩展,扩展provider提供的扩展点,代码片断如下:
point="provider.Calculator">
class="customer.DefaultCalculator"
id="defaultCalculator"
type="normal"/>
参考资料:使用 XML: 定义和加载扩展点