Nutch的插件机制
文章来源:http://hi.baidu.com/sunky/blog/item/316faeafb372cbcd7dd92a6e.html
Nutch的插件机制,具有很好的扩展性,这里讨论一下其实现机制。
从URLFilters入手吧。
类URLFilters中,有个静态方法:
static {
。。。。
try {
ExtensionPoint point =
PluginRepository.getInstance().getExtensionPoint(URLFilter.X_POINT_ID);
。。。
}
跟踪到PluginRepository.getInstance(). 在PluginRepository.PluginRepository() 构造函数中,
(1) fRegisteredPlugins = getDependencyCheckedPlugins(PluginManifestParser
.parsePluginFolder());
(2) installExtensions(fRegisteredPlugins);
待会再说installExtensions(fRegisteredPlugins); 先看 fRegisteredPlugins =getDependencyCheckedPlugins(PluginManifestParser
.parsePluginFolder());
PluginManifestParser.parsePluginFolder()是什么意思呢?继续往下看。
把PluginManifestParser这个类通读一遍,知道葫芦里卖什么药了。
原来是,首先读取nutch-default.xml文件中的plugin.folders,知道插件文件夹的存放位置。然后遍历这个文件夹下面的每个插件(一个插件对应一个文件夹,每个文件件下还有一个plugin.xml。于是N个插件对应N个plugin.xml。每个plugin.xml用一个PluginDescriptor的类来保留其信息。
必须要注意的是:nutch-default.xml中plugin.includes和plugin.excludes在这个过程当中使用到了,对于每个插件、根据其文件夹名来确定是否过滤该插件。
PluginManifestParser.parsePluginFolder()返回一个list,list中的每个item就是一个PluginDescriptor类的实例。
这里要提到的一点是:PluginDescriptor是一个通用的插件描述类。以Nutch0.7为例,就有两种不同的plugin.xml。比如nutch-extensionpoints下的plugin.xml和urlfilter-regex下的plugin.xml就不同。
第一种就是带有
<extension id="org.apache.nutch.net.urlfiler"
name="Nutch Regex URL Filter"
point="org.apache.nutch.net.URLFilter">
<implementation id="RegexURLFilter"
class="org.apache.nutch.net.RegexURLFilter"/>
<!-- by default, attribute "file" is undefined, to keep classic behavior.
<implementation id="RegexURLFilter"
class="org.apache.nutch.net.RegexURLFilter"
file="urlfilter-regex.txt"/>
-->
</extension>
第二种带有:
<extension-point
id="org.apache.nutch.clustering.OnlineClusterer"
name="Nutch Online Search Results Clustering Plugin"/>
<extension-point
id="org.apache.nutch.indexer.IndexingFilter"
name="Nutch Indexing Filter"/>
<extension-point
id="org.apache.nutch.ontology.Ontology"
name="Ontology Model Loader"/>
PluginManifestParser.parsePluginFolder()返回的list中,这两种都有可能。
现在回头来看
(1) fRegisteredPlugins = getDependencyCheckedPlugins(PluginManifestParser
.parsePluginFolder());
关于 descriptor.getDependencies() 方面的code,暂时没有执行到,不用管它。每个插件取出后,加入返回的list当中,如果plugin.xml是第二种情况的话,把它加入fExtensionPoints map中。
fExtensionPoints.put(xpId, point);
xpId 比如:org.apache.nutch.clustering.OnlineClusterer;
point 是描述这样的一个XML element:
<extension-point id="org.apache.nutch.indexer.IndexingFilter" name="Nutch Indexing Filter"/>
(2) installExtensions(fRegisteredPlugins); 这个是关键的!
依次取出PluginDescriptor descriptor,如果有extension,那些PluginDescriptor 才有extension描述符,第一种plugin.xml。对于这种描述符,比如:
<extension id="org.apache.nutch.net.urlfiler"
name="Nutch Regex URL Filter"
point="org.apache.nutch.net.URLFilter">
<implementation id="RegexURLFilter"
class="org.apache.nutch.net.RegexURLFilter"/>
<!-- by default, attribute "file" is undefined, to keep classic behavior.
<implementation id="RegexURLFilter"
class="org.apache.nutch.net.RegexURLFilter"
file="urlfilter-regex.txt"/>
-->
</extension>
根据其point值,到fExtensionPoints中取其对应的ExtensionPoint,然后extension加入到ExtensionPoint。
这样实现了这样的Mapping:
point值(实际上就是类的完整名字),找到对应的类实现(可以多个),然后就可以new instance了。
Nutch的插件机制相关推荐
- Apache Nutch 1.3 学习笔记十(插件机制分析)
1. 一些对象说明 PluginRepository:这是一个用于存储所有插件描述对象(PluginDescriptor),插件扩展点(ExtensionPoint)和被激活的插件. PluginDe ...
- 初探maven插件机制
初探maven插件机制 第一部分 Plexus 本质上说,Maven是一个plugin的框架,所以需要有一个管理者来管理这些plugin.Maven选择了Plexus作为plugin的管理者.作为初探 ...
- mixin机制 vue_读?VuePress(四)插件机制
前言 从 9 月份开始,vuepress 源码进行了重新设计和拆分.先是开了个 next 分支,后来又合并到 master 分支,为即将发布的 1.x 版本做准备. 最主要的变化是:大部分的全局功能都 ...
- webpack插件机制
webpack插件机制是整个webpack工具的核心,那么webpack插件有什么特点呢? 1.独立的JS模块,暴露相应的函数 2.函数原型上的apply方法会注入compiler对象(之所以要定义a ...
- MyBatis 源码分析 - 插件机制
1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...
- 【问链-EOS公开课】第十三课 EOS插件机制深入解析
插件体系 EOS插件由三层类来实现. 最顶层是抽象类abstract_plugin,定义了插件的基本接口. 中间层是插件模板类plugin,主要用来解决插件之间依赖调用. 最底层是具体插件类,专注单个 ...
- Omi框架学习之旅 - 插件机制之omi-finger 及原理说明
以前那篇我写的alloyfinger源码解读那篇帖子,就说过这是一个很好用的手势库,hammer能做的,他都能做到, 而且源码只有350来行代码,很容易看懂. 那么怎么把这么好的库作为omi库的一个插 ...
- 探寻 webpack 插件机制
webpack 可谓是让人欣喜又让人忧,功能强大但需要一定的学习成本.在探寻 webpack 插件机制前,首先需要了解一件有意思的事情,webpack 插件机制是整个 webpack 工具的骨架,而 ...
- iOS之深入解析CocoaPods的插件机制和如何加载插件整合开发工具
一.CocoaPods 插件机制 ① Ruby 在 Ruby 中,类永远是开放的,总是可以将新的方法加入到已有的类中,除了自己的代码中,还可以用在标准库和内置类中,这个特性被称为 Ruby Open ...
最新文章
- while循环中,break,continue,return的差别
- input按钮的事件处理大全
- LeetCode 217 Contains Duplicate--python,java解法--set--简单
- [CF460E]Roland and Rose
- 浅谈Java中的Set、List、Map的区别
- 基于 Spring Boot 的车牌识别系统(附项目地址)ba
- #Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别
- Spring Boot中通过Accept-Language头信息设置国际化内容
- C语言,期末复习之编写程序返回三个整数中的中间数
- python初学者怎么入门-python怎么入门啊?
- mv强制覆盖 shell_一个简单的linux命令 mv
- 使用源代码编译安装基于LAMP的网站架构
- 【优化算法】蛾群优化算法(MSA)【含Matlab源码 1807期】
- 通过删除注册表破解plsql
- amtemu.v0.9.2-painter.exe百度网盘下载
- 深圳大学计算机考研教材,广东-深圳大学计算机考研院校初试科目及参考书汇总...
- matlab ukf,UKF(无迹卡尔曼滤波器)函数
- 窥探Linux内核进程信息task_struct
- 如何在面试中介绍自己的项目经验(面向java改进版)
- oracle交换分区转移数据,oracle 分区交换-归档数据