原创]

文章来源: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.includesplugin.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的插件机制相关推荐

  1. Apache Nutch 1.3 学习笔记十(插件机制分析)

    1. 一些对象说明 PluginRepository:这是一个用于存储所有插件描述对象(PluginDescriptor),插件扩展点(ExtensionPoint)和被激活的插件. PluginDe ...

  2. 初探maven插件机制

    初探maven插件机制 第一部分 Plexus 本质上说,Maven是一个plugin的框架,所以需要有一个管理者来管理这些plugin.Maven选择了Plexus作为plugin的管理者.作为初探 ...

  3. mixin机制 vue_读?VuePress(四)插件机制

    前言 从 9 月份开始,vuepress 源码进行了重新设计和拆分.先是开了个 next 分支,后来又合并到 master 分支,为即将发布的 1.x 版本做准备. 最主要的变化是:大部分的全局功能都 ...

  4. webpack插件机制

    webpack插件机制是整个webpack工具的核心,那么webpack插件有什么特点呢? 1.独立的JS模块,暴露相应的函数 2.函数原型上的apply方法会注入compiler对象(之所以要定义a ...

  5. MyBatis 源码分析 - 插件机制

    1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...

  6. 【问链-EOS公开课】第十三课 EOS插件机制深入解析

    插件体系 EOS插件由三层类来实现. 最顶层是抽象类abstract_plugin,定义了插件的基本接口. 中间层是插件模板类plugin,主要用来解决插件之间依赖调用. 最底层是具体插件类,专注单个 ...

  7. Omi框架学习之旅 - 插件机制之omi-finger 及原理说明

    以前那篇我写的alloyfinger源码解读那篇帖子,就说过这是一个很好用的手势库,hammer能做的,他都能做到, 而且源码只有350来行代码,很容易看懂. 那么怎么把这么好的库作为omi库的一个插 ...

  8. 探寻 webpack 插件机制

    webpack 可谓是让人欣喜又让人忧,功能强大但需要一定的学习成本.在探寻 webpack 插件机制前,首先需要了解一件有意思的事情,webpack 插件机制是整个 webpack 工具的骨架,而 ...

  9. iOS之深入解析CocoaPods的插件机制和如何加载插件整合开发工具

    一.CocoaPods 插件机制 ① Ruby 在 Ruby 中,类永远是开放的,总是可以将新的方法加入到已有的类中,除了自己的代码中,还可以用在标准库和内置类中,这个特性被称为 Ruby Open ...

最新文章

  1. while循环中,break,continue,return的差别
  2. input按钮的事件处理大全
  3. LeetCode 217 Contains Duplicate--python,java解法--set--简单
  4. [CF460E]Roland and Rose
  5. 浅谈Java中的Set、List、Map的区别
  6. 基于 Spring Boot 的车牌识别系统(附项目地址)ba
  7. #Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别
  8. Spring Boot中通过Accept-Language头信息设置国际化内容
  9. C语言,期末复习之编写程序返回三个整数中的中间数
  10. python初学者怎么入门-python怎么入门啊?
  11. mv强制覆盖 shell_一个简单的linux命令 mv
  12. 使用源代码编译安装基于LAMP的网站架构
  13. 【优化算法】蛾群优化算法(MSA)【含Matlab源码 1807期】
  14. 通过删除注册表破解plsql
  15. amtemu.v0.9.2-painter.exe百度网盘下载
  16. 深圳大学计算机考研教材,广东-深圳大学计算机考研院校初试科目及参考书汇总...
  17. matlab ukf,UKF(无迹卡尔曼滤波器)函数
  18. 窥探Linux内核进程信息task_struct
  19. 如何在面试中介绍自己的项目经验(面向java改进版)
  20. oracle交换分区转移数据,oracle 分区交换-归档数据

热门文章

  1. 去除杂波的梳状滤波器
  2. MySQL系列-高级-性能分析工具-EXPLAIN
  3. Linux GPIO 驱动 (gpiolib)
  4. 程序员的十年之功(经典文章翻译)
  5. 项目经理如何提高团队的开发效率?
  6. 超级计算机天河二号容量,“天河二号”蝉联最快超级计算机
  7. 庖丁解牛Linux内核分析慕课课程
  8. html+css——q标签
  9. FPGA—HDMI 显示器驱动设计与验证(附代码)
  10. 计算机考研有哪些值得推荐的院校?能否具体讲讲?