刚出炉的#######jive中filters的应用######

03-06-05 icmas

网路上关于jive(一种基于jsp技术的论坛)设计模式,缓冲机制,中文问题解决,Crack等方面的文章很颇多,但讨论filter相关的屡屡可数,为了使感兴趣的网友不在繁多的代码中花费过多的时间,特完成拙文一篇.先来看一张养眼的picture,

对jive有一定了解的朋友一看便知上图为jive论坛的设计构架.users不用说是指浏览论坛的用户,skin是皮肤的意思,filters即为本文将详细讨论的过滤器,经过一系列(interfaces)接口,最终的将是我们的后台数据库.

Flters在jive中的主要作用就是动态的从新格式化messages(帖子)的内容,以此提供额外的功能.例如:the URL filter可以转换用户在message中写入的任意URL为可以点击的链接.还有一种过滤器高亮度标识java源代码语法.在jive中任意数目自定义的过滤器可以被创建和安装.

我们基于jive2.1.2版本来看一下.所有的filters都集中在com.jivesoftware.forum.filter包中安装字母的先后顺序依次是JavaCodeHightlighter.java,DummyFilter.java,Emoticon.java,HtmlFilter.java,Newline.java,Profanity.java,QuoteFilter.java,TextStyle.java,WordBreak.java每个过滤器都继承抽象类ForumMessageFilter,主要重载以下方法 public ForumMessageFilter clone(ForumMessage message) public boolean isCacheable() 两个方法以及过滤器本身的构建器方法.同时要提到的是每个filter相关的*BeanInfo.java类,他们继承了J2SE中javabean的BeanInfo类,封装了相关的bean信息,如beanName,属性名数组,bean类本身.接着看一下管理N多filter的类FilterManager.java(在com.jivesoftware.forum包中),我们知道jive论坛filter设置是由管理页面来动态配置完成的,通过Globals设置和特定forum的配置两部分完成.看一下源码,

public interface FilterManager {

public ForumMessageFilter getFilter(int index) throws UnauthorizedException;

public int getFilterCount() throws UnauthorizedException;

public void addFilter(ForumMessageFilter filter) throws UnauthorizedException;

public void addFilter(ForumMessageFilter filter, int index) throws UnauthorizedException;

public void removeFilter(int index) throws UnauthorizedException;

public void saveFilters() throws UnauthorizedException;

public ForumMessage applyFilters(ForumMessage message);

public ForumMessage applyCacheableFilters(ForumMessage message);

public ForumMessage applyUncacheableFilters(ForumMessage message);

public boolean hasUncacheableFilters();

}

不难发现添加,删除,保存,获取,利用filter(包括采用filters,采用可cacheable的filter,采用不能cacheable的filter三种方法)动作都是在FilterManager.java接口中完成的,具体实现又采用设计模式中的Proxy模式FilterManagerProxy.java,这也是jive论坛的一大设计特色,细心的读者一定注意到com.jivesoftware.forum.database目录下有一个DbFilterManager.java同样实现了FilterManager接口,而且在DbForumFactory.java中被调用.,

我们从filters的管理设置和forum具体应用到message两条线来看filters在jive中的实际流程.

filters管理的前台页面是通过admin目录下的filter.jsp来实现.这个文件包括了全局filter的设置和每个forum的特殊需求设置.二者的实现区别是通过url传参(filters.jsp?forum=1)来完成. 完整的实现过程是这样的,

if (forum != null) { filterManager = forum.getFilterManager(); } else { filterManager = forumFactory.getFilterManager();也许你会对forumFactory的引用感到莫名其妙,它来自哪里?其实它是在global.jsp生成的.而且还是DbForumFactory的实现.而forumFactory调用getFilterManager()方法,其实是ForumFactoryProxy中的方法. public FilterManager getFilterManager() { return new FilterManagerProxy(factory.getFilterManager(), authorization,

permissions);

}

其中的factory.getFilterManager()又是DbForumFactory中的getFilterManager();

public FilterManager getFilterManager() {

return filterManager;

}

追根求源,filterManager又实现于DbFilterManager.java,在前面我们已经讨论过该类. FilterManager.java,FilterManagerProxy.java,DbFilterManager.java.以及不在我们讨论范围的ForumFactory.java,ForumFactoryProxy.java,DbForumFactory.java的层层调用关系.

讨论完filters的管理,我们再来看一下filters对Messages的影响.当我们post一个message的时候filters不会care,就是你post什么样子的message,数据库就原封不动的照写不误...,而真正发挥作用的时间是在getMessage即是我们查看,张贴后预览动作发出后.我们仅讨论post一个message后preview的情形,实际操作中查看,回复一篇帖子是一样的实现方法.来看一下preview.jsp.95行的样子. FilterManager filterManager = myEnv.getForumFactory().getFilterManager(); newMessage = filterManager.applyFilters(newMessage); //不难看出这行代码是采用全局filters完成对message的过滤功能 filterManager = forum.getFilterManager(); //message所属forum的filters.结合前面的讨论读者应该了解jive过滤器的基本功能.到次关于jive,filters的讨论已经结束,最后让我们小结一把.

小结:通过本文粗略的概括,大部分读者应该了解jive filters基本工作流程.filter应用在jive中相当灵活,可以动态的添加,删除,而且可以通过设置不同过滤范围,global(全局) filters 和 forum filters来满足不同的需要.同时还应知道过滤的功能是在发生在浏览查看message的动作.在post message时,jive filters不会care.对filter感兴趣可查看java blueprints关于J2EE构架的petstore源代码,其中的filter应用也相当精妙.

参考:

Jive诸多应用程序和源码下载来自于http://www.jivesoftware.com

Jive问题的讨论,相当多的精彩文章 http://www.jdon.com

联系mail:icmas@tom.com

shyguy
2003-06-05 11:34

不错的文章~~~~

但是Jive的Filter其实还是相对麻烦了一点点,它的Filter是从Message接口出来的,需要implemnt相当多的Message接口中的方法。

在我的新系统中,新增加Filter就是一个接口,其中只有

apply(String):String;这么一个方法.所有需要上filter的对象都implements Filterable接口,然后通过visitor模式来一一实现content的转换。

为了解决内容Cache的问题,我用了Observer,当message的onLoad/onEdit等事件发生的时候,通知FilterManager,重新apply filter。

通过模仿Jive,我认为Jive的设计上还是相当多的问题....