`
德安德鲁
  • 浏览: 43676 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

OSGI-Eclipse 扩展点,扩展机制

    博客分类:
  • OSGI
阅读更多

Eclipse的组件架构师基于插件的,这就意味着将一组代码组件化为一个单一的组件,然后利用Eclipse框架注册为组件之一,其他组件可以绑定该组件或者调用该组件。

扩展点是插件允许其他插件向公开扩展点的插件提供附加功能的方法。

   

插件(Plug-in):

 

Eclipse功能实现的最小单位,包含了Java代码或者其他文件。插件位于plugins目录下,使用清单文件plugin.xml向系统说明如何继承到平台中。

  

扩展点(Extension point):

 本插件为其他插件提供的接口,插件可以自定义扩展点,也可以实现其他插件的扩展点。

 

 扩展(Extension):

 

对其他插件公开的扩展点进行的实现。

 

 Eclipse扩展机制实践:

 以下代码均在文章:http://489291468.iteye.com/blog/1887290 描述工程的基础实践。

 整个工程目录:


 

 PluginMgrCenter Bundle:

创建ExtensionMgr.java文件:

 

/**
 * 
 */
package extensionservice;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;

import sayhello.ISayHello;

/**
 * @author Administrator
 * 
 */
public class ExtensionMgr
{
	private static final String MY_EXTENSION_POINT_ID = "PluginMgrCenter.sayHello";
	
	private static ExtensionMgr extensionMgr = new ExtensionMgr();
	
	public static final ExtensionMgr getExtensionMgr()
	{
		return extensionMgr;
	}
	
	private boolean flag = false;
	
	public void execute()
	{
		if (!flag)
		{
			try
			{
				Thread.sleep(10000);
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
			
			IExtensionRegistry registry = Platform.getExtensionRegistry();
			evaluate(registry);
			flag = true;
		}
		
	}
	
	private void evaluate(IExtensionRegistry registry)
	{
		
		IConfigurationElement[] config = registry
				.getConfigurationElementsFor(MY_EXTENSION_POINT_ID);
		for (IConfigurationElement e : config)
		{
			try
			{
				System.out.println("bundle : " + e.getNamespaceIdentifier());
				String[] attributes = e.getAttributeNames();
				for (String string : attributes)
				{
					System.out.println("attribute:" + string + ",value is : "
							+ e.getAttribute(string));
				}
				
				final Object o = e.createExecutableExtension("ISay");
				if (o instanceof ISayHello)
				{
					((ISayHello) o).sayHello();
				}
			}
			catch (CoreException ex)
			{
				System.out.println(ex.getMessage());
			}
		}
		
	}
}

 修改PluginMgrCenter Bundle中Activator.java类中的start()方法,注释掉自动发现加载jar包的代码,添加新起线程查询扩展的代码:

 

public void start(BundleContext context) throws Exception
	{
		bundleContext = context;
		try
		{
			System.out
					.println("Start to manage Extensin Point (PluginMgrCenter.sayHello)");
			/*
			 * DirectWatcherTask directWatcherTask = new DirectWatcherTask(
			 * bundleContext, "d:\\plugin\\");
			 * ScheduleTimerPool.getInstance().schedule(directWatcherTask,
			 * 10000, 10000);
			 */
			Thread thread = new Thread(new Runnable()
			{
				@Override
				public void run()
				{
					ExtensionMgr.getExtensionMgr().execute();
				}
			});
			thread.start();
			
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		
	}

 

新建ISayHello.java类,作为扩展点的接口类。

 

package sayhello;

public interface ISayHello
{
	public void sayHello();
	
}

 再新建一个抽象类SayUtil.java

package sayhello;

public abstract class SayUtil
{
	public abstract void selfIntroduce();
	
}

 接下来PluginMgrCenter Bundle创建扩展点,创建结果:

点击“sayHello”扩展点,进入plugin.xml编辑界面,定义扩展点相关元素以及属性。

结果如下:


 sayHello.exsd内如容下:

 

<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="PluginMgrCenter" xmlns="http://www.w3.org/2001/XMLSchema">
<annotation>
      <appinfo>
         <meta.schema plugin="PluginMgrCenter" id="sayHello" name="sayHelloService"/>
      </appinfo>
      <documentation>
         Say hello after self introduce
      </documentation>
   </annotation>

   <element name="extension">
      <annotation>
         <appinfo>
            <meta.element />
         </appinfo>
      </annotation>
      <complexType>
         <choice minOccurs="1" maxOccurs="unbounded">
            <element ref="say"/>
         </choice>
         <attribute name="point" type="string" use="required">
            <annotation>
               <documentation>
                  
               </documentation>
            </annotation>
         </attribute>
         <attribute name="id" type="string">
            <annotation>
               <documentation>
                  
               </documentation>
            </annotation>
         </attribute>
         <attribute name="name" type="string">
            <annotation>
               <documentation>
                  
               </documentation>
               <appinfo>
                  <meta.attribute translatable="true"/>
               </appinfo>
            </annotation>
         </attribute>
      </complexType>
   </element>

   <element name="say">
      <complexType>
         <attribute name="ISay" type="string" use="required">
            <annotation>
               <documentation>
                  
               </documentation>
               <appinfo>
                  <meta.attribute kind="java" basedOn="sayhello.SayUtil:sayhello.ISayHello"/>
               </appinfo>
            </annotation>
         </attribute>
         <attribute name="name" type="string" use="required">
            <annotation>
               <documentation>
                  
               </documentation>
            </annotation>
         </attribute>
         <attribute name="id" type="string">
            <annotation>
               <documentation>
                  
               </documentation>
            </annotation>
         </attribute>
         <attribute name="resource" type="string">
            <annotation>
               <documentation>
                  
               </documentation>
               <appinfo>
                  <meta.attribute kind="resource"/>
               </appinfo>
            </annotation>
         </attribute>
      </complexType>
   </element>

   <annotation>
      <appinfo>
         <meta.section type="since"/>
      </appinfo>
      <documentation>
         [Enter the first release in which this extension point appears.]
      </documentation>
   </annotation>

   <annotation>
      <appinfo>
         <meta.section type="examples"/>
      </appinfo>
      <documentation>
         [Enter extension point usage example here.]
      </documentation>
   </annotation>

   <annotation>
      <appinfo>
         <meta.section type="apiinfo"/>
      </appinfo>
      <documentation>
         [Enter API information here.]
      </documentation>
   </annotation>

   <annotation>
      <appinfo>
         <meta.section type="implementation"/>
      </appinfo>
      <documentation>
         [Enter information about supplied implementation of this extension point.]
      </documentation>
   </annotation>


</schema>

 

plugin.xml如下:

 

<plugin>
   <extension-point id="sayHello" name="sayHelloService" schema="schema/sayHello.exsd"/></plugin>

 

这样公开扩展点的Bundle实现完成。

 

接下来搞两个Bundle 来实现PluginMgrCenter Bundle中定义的扩展点。

 

 

PluginAgent0:

首先看PluginAgent0 Bundle:

 

 


/resouce/NewFile.xml:随便对应一个一个xml文件。用以实现扩展点中的扩展元素“resource”

SayHelloImpl.java:继承ISay接口,泳衣实现扩展点中的扩展元素“ISay”

SayHelloImpl.java代码如下:

 

/**
 * 
 */
package extension0;

import sayhello.ISayHello;
import sayhello.SayUtil;

/**
 * @author Administrator
 * 
 */
public class SayHelloImpl extends SayUtil implements ISayHello
{
	
	@Override
	public void sayHello()
	{
		System.out.println("hi,i am agent0,Hello!");
	}
	
	@Override
	public void selfIntroduce()
	{
		System.out.println("I am Agent1!");
	}
	
}

 

接下来要定义扩展了:
在MANIFEST.MF文件extension标签页中,点击"Add",添加扩展。

 

 

在弹出的扩展点对话框中"Extension point filter"的文本框中输入"*sayHello"查找到PluginMgrCenter中定义的扩展点:PluginMgrCenter.sayHello,选中后,点击"Finish"

而后在"All Extensions"框内右键"PluginMgrCenter.sayHello",选择"New"->"say"

在右侧“Extension Element Details”中填入各个扩展元素的值.

其中:ISay*,表示实现ISay接口的实现类

name*,表示name字符串的值

id*,表示id字符串的值

resource,表示扩展点定义的资源文件。

 

 

 PluginAgent1:



 SayHelloImpl.java 实现ISay接口。用以扩展PluginMgrCenter Bundle中定义的扩展点中的“ISay”元素

/**
 * 
 */
package extension1;

import sayhello.ISayHello;
import sayhello.SayUtil;

/**
 * @author Administrator
 * 
 */
public class SayHelloImpl extends SayUtil implements ISayHello
{
	
	@Override
	public void sayHello()
	{
		System.out.println("hi,i am agent1,hello!");
		
	}
	
	@Override
	public void selfIntroduce()
	{
		// TODO Auto-generated method stub
		
	}
	
}

 MANIFEST.MF中扩展定义如下:

 

验证:

设置PluginAgent1和PluginAgent0 这两个Bundle 默认不启动。
启动工程后,立即执行ss命令,明确PluginAgent0和PluginAgent1这两个Bundle未启动,如下图:

 

待启动后10s,PluginMgrCenter bundle扫描实现本Bundle扩展点的扩展。并打印出扩展Bundle中扩展元素的值,如下图,其中红色框起来的为PluginAgent1和PluginAgent0中实现扩展点扩展元素“ISay”接口的实现类中sayHello()方法的调用。

 

再次执行ss,发现PluginAgent1和PluginAgent0 Bundle已经启动。 

  

 

 

 

 

 

  • 大小: 42.9 KB
  • 大小: 39.8 KB
  • 大小: 25.5 KB
  • 大小: 14.7 KB
  • 大小: 37.8 KB
  • 大小: 25 KB
  • 大小: 19.9 KB
  • 大小: 9.2 KB
  • 大小: 6.5 KB
  • 大小: 16.2 KB
分享到:
评论
2 楼 德安德鲁 2013-07-22  
牛人云小白 写道
楼主大神级别的教程令无数众人顶礼膜拜。楼主能给份工作不?

---
拍马屁,走开
1 楼 牛人云小白 2013-07-20  
楼主大神级别的教程令无数众人顶礼膜拜。楼主能给份工作不?

相关推荐

    Eclipse RCP与Spring OSGi技术详解与最佳实践

    高级篇(第6-12章)系统讲解了Eclipse RCP应用开发的基础知识、Eclipse RCP软件产品各个组成部分的构建方法,以及Eclipse RCP扩展的使用和扩展点的开发,掌握这些技术知识的读者将能构建一个结构完整的Eclipse RCP...

    eclipse插件开发实战

    1.介绍eclipse内核结构、扩展点机制; 2.介绍SWT的原理,控件设计及事件响应机制 3.介绍OSGi 4.介绍RCP(Rich Client Platform)——Eclipse富客户端 5.介绍插件项目文件结构 6.介绍插件开发过程及基本步骤 7.介绍...

    com.packtpub.e4.advanced:“高级 Eclipse 插件开发”一书的代码库 978-1783287796

    第 2 章:使用自定义扩展点扩展 Eclipse 第 3 章:使用 OSGi 服务动态连接应用程序 第 4 章:为 Gogo shell 定义命令 第 5 章:本机代码和片段包 第 6 章:理解服务加载器和类加载器 第 7 章:设计模块化应用程序 ...

    Spring-Boot的Dubboxboot-dubbo.zip

    1、微内核2、配置简单3、模块化4、开箱即用5、完全兼容Spring6、设计理念极其先进,很多思想来自OSGi,但是在现有技术的实现  缺点:  二次改造定制难缺少成熟的SOA或者RPC框架Dubbox:  1、完全兼容...

    Delphi的插件框架WisdomPluginFramework_V1.6

    WisdomPluginFramework是融合OSGI微内核理念 + Eclipse的扩展点概念而精心设计的轻量级插件框架,由Delphi实现,但可以使用于Delphi、BCB、VC++中,提供非常强大灵活的插件调度能力,让你充分享受插件式编程的乐趣。...

    java开源包1

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包10

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包11

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包2

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包3

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包6

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包5

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包4

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包8

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包7

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包9

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包101

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    Java资源包01

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    JAVA上百实例源码以及开源项目源代码

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    JAVA上百实例源码以及开源项目

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

Global site tag (gtag.js) - Google Analytics