<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
摘要:简要介绍为jive2.x写插件的方法,并具体实现一个图像过滤器ImageFilter。
jive2.x所有的filter都放在com.jivesoftware.forum.filter包下面,这一点与jive3.x不同。
利用正则表达式来写这个filter非常简单。
1. 继承抽象类ForumMessageFilter
在jive2.x里面,要实现的所有filter都应该继承它,ForumMessageFilter实现了ForumMessage接口。因此,
(1) 我们所要实现的filter应该提供getBody(),getSubject()方法,如果需要的话,还有getProperty(String)方法。
(2) 注意:每个filter都应该指明自己是否是可以缓存的,这通过isCacheable()方法来实现。
(3) 另外,你也许要对filter进行一些属性上的设置,也要在这里完成相应的处理。
2. 继承JiveBeanInfo类
建议你通过继承JiveBeanInfo类来为BeanInfo接口提供必要的信息,比如filter的名称,简短的描述,版本信息,作者等等。这样我们可以在管理台对filter的属性进行设置。比如,我们马上要写一个ImageFilter,
(1) 那么我们就还需要再写一个名为ImageFilterBeanInfo辅助类。注意,这种命名模式是固定的,即“filterName+BeanInfo”。
(2) 然后,我们再写一个bean_ImageFilter.properties的属性描述文件,一般要包含这些信息:
# Name of the filter
# Version of the filter
# Description of filter
# Author of filter
# Properties - display name and description
以上这些内容会出现在管理台,主要是对你可以进行设置的属性作简短的描述。
基本上写filter就是这样了,下面附上我写的Jive2ImageFilter源代码。
标签设计为:[ img ]url[ /img ](为了不被转义,多加了空格)
regex的匹配格式为:/[img/]([^/[] )/[/img/],把它保存为Jive2ImageFilterRegex文件。
1. Jive2ImageFilter.java
package com.jivesoftware.forum.filter;import com.jivesoftware.forum.*;import java.util.regex.*;import java.io.*;public class Jive2ImageFilter extends ForumMessageFilter { public Jive2ImageFilter() { filteringSubject = false; filteringBody = true; imageRoot = "/"; } public ForumMessageFilter clone(ForumMessage message) { Jive2ImageFilter filter = new Jive2ImageFilter(); filter.filteringSubject = filteringSubject; filter.filteringBody = filteringBody; filter.message = message; filter.imageRoot = imageRoot; return filter; } public boolean isCacheable() { return true; } public boolean isFilteringSubject() { return filteringSubject; } public void setFilteringSubject(boolean filteringSubject) { this.filteringSubject = filteringSubject; } public boolean isFilteringBody() { return filteringBody; } public void setFilteringBody(boolean filteringBody) { this.filteringBody = filteringBody; } public String getSubject() { if (filteringSubject) { return showImage(message.getSubject()); } return message.getSubject(); } public String getBody() { if (filteringBody) { return showImage(message.getBody()); } return message.getBody(); } public String getImageRoot() { return imageRoot; } public void setImageRoot(String root) { imageRoot = (root == null) ? "/" : root.endsWith("/") ? root : root '/'; } private String showImage(String input){ if (input == null || input.length() == 0) { return input; } InputStream is = this.getClass().getResourceAsStream("Jive2ImageFilterRegex"); BufferedReader br = new BufferedReader(new InputStreamReader(is)); try { REGEX = br.readLine(); } catch (IOException ioe) {} Pattern pattern = Pattern.compile(REGEX); Matcher matcher = pattern.matcher(input); StringBuffer filtered = new StringBuffer(); while (matcher.find()) { if (matcher.group(1).startsWith("http://") || matcher.group(1).startsWith("HTTP://") || matcher.group(1).startsWith("ftp://") || matcher.group(1).startsWith("FTP://")) { matcher.appendReplacement(filtered, "
"); } else { matcher.appendReplacement(filtered, "
"); } } matcher.appendTail(filtered); return filtered.toString(); } private boolean filteringSubject; private boolean filteringBody; private String REGEX; private String imageRoot;}
2. Jive2ImageFilterBeanInfo.java
package com.jivesoftware.forum.filter;import java.beans.*;import com.jivesoftware.forum.util.JiveBeanInfo;public class Jive2ImageFilterBeanInfo extends JiveBeanInfo { public static final String [] PROPERTY_NAMES = { "filteringSubject", "filteringBody", "imageRoot", }; public Jive2ImageFilterBeanInfo() { super(); } public Class getBeanClass() { return com.jivesoftware.forum.filter.Jive2ImageFilter.class; } public String [] getPropertyNames() { return PROPERTY_NAMES; } public String getName() { return "Jive2ImageFilter"; }}
3. bean_Jive2ImageFilter.properties
# Jive2ImageFilter.properties # Default resource bundle for Jive2ImageFilter# Name of the filterdisplayName=Jive2 Image Filter# Version of the filterversion=1.0# Description of filtershortDescription=Convert [img]path[/img] tags into html image tags. It should comes before URL Converter filter.# Author of filterauthor=ant21# Properties - display name and descriptionfilteringSubject.displayName=Filter Message SubjectfilteringSubject.shortDescription=Toggles whether the subject will be filtered.filteringBody.displayName=Filter Message BodyfilteringBody.shortDescription=Toggles whether the body will be filtered.imageRoot.displayName=Root directory of the images to use.imageRoot.shortDescription=Images in the generated tags are loaded from this directory.
需要注意的是,如果你同时使用了jive自带的URL Converter filter,那么Jive2 Image Filter一定要在URL Converter filter的前面,这样才能正确过滤,否则URL Converter filter会把[ img ]url[ /img ]中的url提前过滤掉。