今天看了一下nutch的url链接过滤插件加载和工作原理,以及他和配置文件regex-urlfilter.txt之间的关系,下面对得到的一些收获进行介绍。
关系:扩展RegexURLFilter根据配置文件regex-urlfilter.txt生成一些列的规则Rule(就是一些列正则表达式Pattern类),扩展过滤方法filter()被调用时,会根据生成的规则过滤url。
具体扩展加载和生成规则的过程:
(1)首先URLFilters类中负责从仓库类PluginRepository中获得负责解析url的扩展点(扩展点中存有具体的扩展信息),然后实例化该扩展,代码如下
URLFilter filter = (URLFilter) extension.getExtensionInstance();//实例化
对于该扩展点URLFilter,他在系统中只有一个扩展RegexURLFilter负责处理url
(2)getExtensionInstance()实例化扩展时调用的是不带参数的默认的构造函数,他的默认构造函数中没有做任何事情,调用方法解析加载配置文件regex-urlfilter.txt文件的操作,实际是在setConf()中完成的,getExtensionInstance()代码如下:
public Object getExtensionInstance() throws PluginRuntimeException {
// Must synchronize here to make sure creation and initialization
// of a plugin instance and it extension instance are done by
// one and only one thread.
// The same is in PluginRepository.getPluginInstance().
// Suggested by Stefan Groschupf
synchronized (getId()) {
try {
PluginClassLoader loader = fDescriptor.getClassLoader();
Class extensionClazz = loader.loadClass(getClazz());
// lazy loading of Plugin in case there is no instance of the plugin
// already.
this.pluginRepository.getPluginInstance(getDescriptor());
Object object = extensionClazz.newInstance();
if (object instanceof Configurable) {
((Configurable) object).setConf(this.conf);//对实例化的类进行初始化,方法中包含加载配置文件的过程
}
return object;
} catch (ClassNotFoundException e) {
throw new PluginRuntimeException(e);
} catch (InstantiationException e) {
throw new PluginRuntimeException(e);
} catch (IllegalAccessException e) {
throw new PluginRuntimeException(e);
}
}
}
(3)RegexURLFilter的父类RegexURLFilterBase包含setConf()函数,代码如下:
public void setConf(Configuration conf) {
this.conf = conf;
Reader reader = null;
try {
reader = getRulesReader(conf);//读取生成过滤规则的正则表达式文件,该方法在父类中为抽象方法,子类中负责具体实现
} catch (Exception e) {
if (LOG.isErrorEnabled()) { LOG.error(e.getMessage()); }
throw new RuntimeException(e.getMessage(), e);
}
try {
rules = readRules(reader);//该步负责生成具体的正则表达式规则
} catch (IOException e) {
if (LOG.isErrorEnabled()) { LOG.error(e.getMessage()); }
throw new RuntimeException(e.getMessage(), e);
}
}
(4)然后调用filter()方法进行正则表达式过滤,代码如下:
public synchronized String filter(String url) {
for (int i=0; i
可见只要url中包含符合的正则表达式,该url就被选中或删除
(5)regex-urlfilter.txt中的正则表达式解读:
-^(file|ftp|mailto):
-\.(gif|GIF|jpg|JPG|png|PNG|ico|ICO|css|CSS|sit|SIT|eps|EPS|wmf|bmp|BMP|js|JS)$
-[?*!@=]
-.*(/[^/]+)/[^/]+\1/[^/]+\1/
+sdu.edu.cn
配置文件中共有五个正则表达式,“-”表示负责后面的正则表达式就过滤掉,“+”表示符合条件就保留,四个正则表达式这要有一个满足条件filter()方法就返回结果
其中”^"表示句子开始,“$"表示句子的结束。”[]"中的内容为集合。