摘要
1.简介
通过标准化的单元模块来构建一个复杂的系统已经成为工程技术领域一个众所周知的原则。这个原则在软件系统开发中同样具有更为重要的意义。
Ont-O-Mat使用了一个软性可扩展的插件框架,它是由基于本体的知识表现研究领域开发出来的,目前有两个主要的应用:1)用作网页的注释工具2)构成了OntoEdit(一种知识工程环境)的柔性基础。
该框架通过扩展来实现其各项功能,这种扩展通常被称作咬接程序(snap-ins),程序扩展加载项(add-ons)或插件(plug-ins)。术语插件在框架中是指那些实现了一定Java接口的软件构件。这个框架由一个管理插件的内核和一个用于实现其内核功能的普通插件组成。所有的其他功能都被封装在其他的插件中。
2.优势
Ont-O-Mat的底层架构思想是设计一个开放的、柔性的、易扩展的构件框架,这种架构提供了一种插件和服务机制。构件可以被动态地加载到Ont-O-Mat的内核。通过插件机制已经安装的构件可以得到那些新注册构件的相关信息,通过服务机制每一个构件都能发现和使另一个构件提供的服务。服务通过实现特定接口的构件来实现,这样服务的定义和服务的执行得以解耦,从而可以选择执行不同功能的插件。
这种架构思想的优点:
(1)模块化:插件通过服务机制访问其他插件或Ont-O-Mat内核,服务的接口展示了服务内部尽可能少的工作细节,这使得服务的客户不必过多地关心服务的设计。这种信息隐藏也是系统模块化的基本原则之一。
(2)可扩展性:系统可以通过各种不同插件扩展其功能,通过服务机制实现插件间的互操作能力。
(3)柔性:由于无用的插件可以被移除,必须的插件都将加载到运行时环境中,因此系统可以通过这种配置仅加载需要的功能。
(4)去耦合:服务机制中服务和服务的执行是松散耦合的,因此我们可以选择执行所需的服务。
3.功能性
该框架由Ont-O-Mat内核和各种不同的插件组成。Ont-O-Mat核心负责功能管理和聚集不同的插件服务.插件通过实现特定的Java接口来嵌入到框架中并提供服务.
3.1 Ont-O-Mat
Ont-O-Mat实现了带有标准菜单入口的多文档界面(MDI)。从插件管理的角度看,Ont-O-Mat实现了以下功能:
插件管理控制台:插件通过Ont-O-Mat的插件管理控制台进行注册,用户应该注明插件所使用类的完整名称,这样控制台就能方便地装载和卸载已经注册的插件了。此外,插件的版权信息和可能的错误信息也应该给予说明。
选项管理器:它显示了系统已经安装的插件列表,如果一个插件被选中,那么与其关联的面板就应该显示出来。每一个具有可选选项的插件都提供了一个类似的面板。
每一个插件在注册时都会被检查,以便发现它提供或使用那些服务。
除了使用服务机制,Ont-O-Mat还使用其它的方法来实现内部通信。Ont-O-Mat内部会产生一些独立的标准事件(例如剪切板事件、文件事件等),每个插件都可以使用它们。
3.2插件
每一个插件都在菜单栏和工具栏上提供了入口。入口和插件的活动相联系,如果该插件已经注册,它同时能够响应Ont-O-Mat的标准事件和菜单事件。此外,它还能利用框架的服务机制和其他插件共享事件模型。
插件根据它实现的Java接口的不同可分为服务提供者和服务消费者两种角色。一个实现服务消费者接口的插件会在框架中注册并被告知系统它所需的服务。而一个实现服务提供者接口的插件会在框架中注册一个新的服务。框架会通知系统中的当前已经注册的所有服务用户有新的服务可用。当服务用户被告知有新的服务可用后,侦听框架将会向框架发送一个获取服务实例的请求,框架负责通知服务提供者传递服务给请求的那个插件。
每一个插件在Ont-O-Mat的多文档界面都有一个入口点。多文档界面上可以独立地放置窗口,并且这些窗口可以通过托放的方式实现插件间的彼此间的数据交换。
4.接口
要想构建一个插件,OntoPlugin接口及继承自它的OntoPluginServiceConsumer和OntoPluginServiceProvider都要被实现。
为了简化插件的实现,需要一些已经实现了这些接口的类。例如:我们称之为“器具标签(tab-wideget)”的一种用户界面标签,它位于Ont-O-Mat的主窗体系统标签(如类标签)的旁边。器具标签仅仅是用来写,它的功能不是那么强大。
4.1 OntoPlugin
实现OntoPlugin接口的插件要实现以下方法:
Init():该方法在插件初始化后被调用。插件在该方法中完成所有的初始化工作。插件通过框架加载优先项。
canExit():如果任何一个插件返回false,框架的退出进程都会被终止。
exit():该方法中,框架执行清除操作。首先,由框架调用插件的canExit()方法,如果返回true,它的exit()方法就会被调用。随后插件在内存中被移除,插件的按钮及菜单也同时在图形用户界面上被移除。
getPluginInfo():返回一条与插件相关的一些信息。例如:版权信息、作者及目的等。
getPluginMenuName():返回显示在菜单栏上的插件名。如果没有与插件对应的菜单项则返回null。
getPluginName():以用户友好的方式返回插件名。
getToolbarActions():返回插件与工具栏按钮相关的活动。按钮将出现在它们各自的区域。
getErrorMsg():返回描述插件的错误状态信息,如果没有发生错误则返回null。
getMenuActions():返回插件与菜单相关的活动.菜单项将出现在"工具"-"选项..."菜单项上。
getOptionsPane():返回JComponent的一个子类,这个子类为插件实现了选项卡功能。当用户选择"视图"-"选项..."菜单项时将会由框架显示可选页。可选页的大小应该在350mm*350mm左右,如果需要更大的空间请在你的选项面板上使用JScrollPane或更好的JTabbedPane。要显示选项容器,将会调用它的setVisible(true)方法,反之调用setVisible(false)方法,任何对选项的读写操作都在该方法中发生。
4.2 OntoPluginServiceProvider
OntoPluginServicePovider是一个为服务类插件提供的Java接口。实现了该接口的插件称为服务提供者,实现了OntoPluginServiceConsumer接口的插件成为服务消费者。
服务提供者提供给服务消费者所需要服务的一个实例。服务类可以是插件本身,也可以是与插件相关的其他类。服务提供者总是返回同一个实例或是为每一个请求创建一个实例。服务类实现了服务消费者和服务提供者之间的行为约定(接口)。
插件框架有聚集服务提供者和服务消费者的功能,服务消费者可以请求框架提供一个继承自Java的Object类的“服务类”的一个实例来满足需要的服务。
如果这样的服务在框架中已经注册,服务提供者将会被要求提供一个服务的实例。
getCurrentServices():该方法不是被框架调用。将来这个方法会为特定的服务返回一个服务选择器。服务选择器是一个指定参数的服务,典型的服务选择器包括:一个用于服务类执行其构造函数的参数,一个用于特定服务的属性值或一个插入执行程序的键值。
getService():由框架调用,返回服务的一个实例。
getServiceClass():由框架调用,返回服务类。
releaseService():由框架调用,该方法用于释放对特定服务的引用。
4.3 OntoPluginServieConsumer
实现OntoPluginServiceConsumer接口的插件通过在内核注册来获取它需要的服务。
serviceAvailable():由框架调用,服务消费者被告知有新的服务可用,可以发送获取服务请求。
serviceRevoked():由框架调用,通知服务消费者取消服务。
5. Ont-O-Mat中的插件
以下是一些Ont-O-Mat中已经实现的插件:
General plug-in:它实现了OntoPlugin接口,在运行时被加载,不能通过管理控制台将其移除。它表现为宿主框架,其选项菜单实现Ont-O-Mat的设置功能。
OntologyServer:该插件是一个服务提供者,它通过实现IOntologyServer接口来提供服务,包含本体的数据模型和数据持久存储。它给服务消费者提供了访问本体概念、关系和实例的方法。为了达到服务类的数据隐藏和支持模块化的目的,复杂数据类型不要作为方法的参数来传递。
OntologyEditor:它是一个服务消费者。它使用的是IOntologyServer接口定义的服务。它支持本体的构建和修改,显示了本体的元素(如概念、关系、实例)。
6. 技术展望
插件框架将会不断的改进,未来它会提供如下功能:
(1)版本控制:每一项服务都有其版本号,服务消费者可以请求指定版本服务的实例。
(2)插件文件夹:以用户友好的方式安装插件,框架会从该文件夹下自动识别并加载经过打包的插件。
(3)基于互联网的升级:框架自动检查主页与插件相关的信息,如果发现存在某个插件新的版本,它会自动下载以对其进行升级。
(4)嵌套的插件架构:一个插件可以由多个插件组成,因此插件也可以像框架一样作为插件的容器。
Siegfried Handschuh
Institute AIFB, University of Karlsruhe, 76128 Karlsruhe, Germany
[email protected]
http://www.aifb.uni-karlsruhe.de/WBS