Roller中一些概念和定义
最近在研究Roller源代码.发现Roller文档和源代码中有一些容易让人混淆和模糊的概念(至少对我来说),在这里记下来.


Roller: 博客服务器, 能够同时支持多个用户(博客)的服务器软件,同时可以支持组网志(Group Weblog,意思是多个用户共同编辑的网志)

Weblog 网志. 一个用户可以拥有多个网志,(包括组网志),在文档中就是Weblogs,在源代码中就是website. 注意: 源代码中的website指的是一个用户下面的weblog, 而不是Roller服务器的website.
Front page 主页面: 每个Roller服务器都有一个主页面, 就是进站页面. 注意和每个用户的主页面(通常叫做主菜单 Main Menu)区分.
管理员: Roller安装的时候默认将管理员权限授予第一个注册用户,由他来管理或者继续授权给别人.
Main Menu 主菜单: 一个用户的主页面, 包含对网志的管理等功能面板
Handle 句柄: 这里Handle指的是网志的代码,例如有一个网志adminblog, 代码就是"adminblog", Roller服务器程序通过这个代码来标志这个网志,进行定位.
Editor interface 编辑接口: Roller文档中使用编辑接口这个名词, 这个概念很模糊, 基本上,如果你进入了编辑接口模式,那么一个状态栏就会出现, 一般来说, 左边是你登陆的名字和正在编辑的网志, 右边是主页面,主菜单,退出登录等连接. 只要有状态栏出现, 你就位于编辑接口中.
weblog navbar 导航栏: 当你在一个网志中需要回到编辑接口中时,可以通过导航栏, 每个网志的主题(theme)都会包含导航栏.
editor page 编辑页面: Roller中编辑页面指的是网志中创建新条目的页面. 用户可以输入新条目的标题,标签,内容等等.
permalink 永久连接: Roller中指向该条目的只读的永久性连接. 这个连接在用户第一次保存条目的时候,根据当时的标题设定,并且以后不能更改.
Category 目录/分类: 在Roller中一个条目只能隶属一个目录/分类. (在Atom 协议中, 一个条目可以有多个目录/分类, Roller只保留一个)
Tag 标签: Web2.0 标签, 在Roller中, 标签用来标记条目所描述的内容和分类, 多个标签用空格分开, 当用户输入时, Roller会使用已有的标签来提示.

 

Roller分析(1)
Webblogger Roller最著名的开放源代码的Java Blog. 准备研究一下. 目前版本3.0.但是下载中不提供javadoc API,只能从源代码中编译.使用Subversion下载后编译文档,却总是报错,不能生成完整的javadoc. 不管怎样,先看看源代码吧.

基本上Roller代码围绕着七个方面:


business 商业逻辑(这个名词比较生硬,不过程序员都该明白我的意思),实际上是Roller的底层设计逻辑.
config 配置, 用于Roller的读取和写入配置信息
planet, 用于聚合内容
pojos, 用于持久化商业逻辑层的Java对象
ui, 用于Roller的视图
util, 用于Roller的工具类
webservice, 用于Roller的Web服务

 


Roller分析(2): 商业逻辑
Roller关于商业逻辑的包有七个:

org.apache.roller.business
org.apache.roller.business.hibernate
org.apache.roller.business.pings
org.apache.roller.business.referrers
org.apache.roller.business.runnable
org.apache.roller.business.search
org.apache.roller.business.search.operations
org.apache.roller.business.util
org.apache.roller.business
包含一些接口和实现类以及例外: 书签管理器,配置管理器,文件管理器,插件管理器,属性管理器,主题管理器,用户管理器,Weblog管理器,Weblog条目插件. 文件IO异常,文件路径异常,文件无法找到异常,主题无法找到异常等等
这个包中还有一个Roller接口和实现类,用来定义Roller商业逻辑中的主要条目点(Entry Point)

org.apache.roller.business.hibernate
包含使用Hibernate来实现上述包的具体实现类

org.apache.roller.business.pings
包含关于ping的接口和实现类,包括自动ping管理器,ping队列管理器,ping目标管理器.
不明白ping是什么?请看:
--------------------------------------
Traceback Ping在blog系统中广泛使用,简单说来,Trackback是网站与网站之间互相通告的一种方法。例如,当你读了一篇日志,想 对此写下自己的感想,您可以把新的日志内容写到自己的博客上。然后向原来的那篇日志发送一个引用通告。通过这种办法,在原始文章的下面就留下了你自己博客 中的日志的链接,这样对于同一个话题的讨论,可以不局限在一个博客中了。

Traceback在中国大部分被翻译做“引用通告”,因此 带来一个很大的误解,不少人将TrackBack理解为引用地址,我经常收到一些莫名其妙的Traceback,点过去一看,原来只是转载我的文章而已, 这显然是错误地理解和使用了TrackBack,将其误以为是“引用”的含义了,事实上TrackBack不是这么使用的。

举个例子 来说明一下。比如你在我的月光博客中看了一篇感兴趣的文章,对这篇文章你自己有一些看法,但是如果你写的文字较多的话,通常会超过评论字数的限制,这时候 你可以在自己的Blog中写下看法,这样带来的好处是字数不受限制,而且还利于以后维护,但是你怎么告诉我你写了这个评论呢?如果没有Traceback 的话,你只能将你的链接URL地址回复在评论上,但有了Trackback Ping,就不再需要这样做了,你只要通过Trackback将你的文章信息 Ping过来,我的Blog系统会自动接收来自其他Blog网站Trackback Ping,并将其发布到文章中,这才是Trackback的正确用 法,可惜国内大多数Blogger还没有形成正确使用Trackback的习惯。
--------------------------------------------------------

org.apache.roller.business.referrers

org.apache.roller.business.runnable
这个包主要包括后台线程的一些管理.例如包括Job接口(一项任务)和线程管理器接口.

org.apache.roller.business.search
这个包包括Roller的搜索功能, 例如索引管理器等.

org.apache.roller.business.search.operations
这个包包括了一些搜索的操作,例如增加条目,搜索,重建索引等等

org.apache.roller.business.util
这个包包括了一些工具类,例如一致性检查,密码管理,数据库升级等等

 


Roller分析(3):数据模型
Roller3.0 的数据模型包(2.3)被去掉了,现在在org.apache.roller.pojos包中,pojos对象.
这个包包括两个接口,30多个类,我们分别看一下:


Template接口:Template接口代表抽象的一个单一的模版单元概念或者一个非绘制内容.基本上,在Roller中,模版指的是Velocity模版,Velocity模版将会被Velocity绘制引擎绘制出来
Weblog资源接口:代表静态的上传给Weblog的文件,提供了一个管理上传文件的抽象层.
AutoPingData: 自动ping配置, 将一个网站和ping目标联系的实例,当对应的网站变化时,相应的ping目标将会被ping.能够通过PingCategoryRestrictionData来限定只有该目录变化才ping.
BookmarkData: Roller中每个用户有一个最喜欢书签集合,这个代表其中的一个URL书签,通过书签管理器来创建这个对象.
CommentData: 代表一个Weblog条目的评论
FolderData:文件夹. Roller网站拥有多个文件夹(没有根文件夹),每个文件夹可以拥有其他文件夹或者书签,使用书签管理器来创建文件夹.
HitCountData: 代表一个Weblog条目的点击数.
PermissionData: 代表一个用户的权限数据.
PingTargetData: 代表可能的ping目标,可以是通用的(由管理员设置),也可以是定制的(由用户自己设置)
RoleData: 代表角色
RollerConfigData: 代表Roller的配置数据,从roller-config.xml文件中读取或者写入.
RollerPropertyData: 代表Roller系统的一个属性.
Theme: 主题, 封装了一个单一Weblog的所有元素.它包含了一个主题的大部分模版
UserData: 代表一个用户
WeblogCategoryData: 代表一个Weblog的类别(目录)
WeblogEntryData: 代表一个Weblog条目
WebsiteData: Website和用户由多对多的关系. Website和Weblog条目,Weblog分类,以及文件夹等有一对多单向关系.使用UserManager去创建,读取和更新websites.

 

Roller分析(4):模板
Roller的Look&Feel是通过主题(Theme)和模版(Template)来实现的.主题由一系列模版组成.
每个主题都不同,但是所有主题都必须包含两个页面(这两个页面你不能删除和重命名): Weblog模版和_day模版
有一些主题还必须包含_css模版用来定义CSS


weblog 模版例子

>

<html><head>

<title>$model.weblog.name : $model.weblogPage.nametitle> #1

#showAutodiscoveryLinks($model.weblog) #2

<style type="text/css">#includeTemplate($model.weblog "_css")style> #3

head>

<body>

<table border="0" align="center" width="95%">

<tr>

<td class="entries" width="80%" valign="top">

<h1>$model.weblog.nameh1> #4

<p class="descrip">$model.weblog.descriptionp>

#set($rootCategory = $model.weblog.getWeblogCategory("nil")) #5

#showWeblogCategoryLinksList($rootCategory false false)<br>

#set($pager = $model.getWeblogEntriesPager()) #6

<div class="next-previous">

#if ($model.results) #7

#showWeblogSearchAgainForm($model.weblog)

#showNextPrevSearchControl($pager)

#else

#showNextPrevEntriesControl($pager) #8

#end

div>

#showWeblogEntriesPager($pager) #9

#if ($model.permalink) #10

#showWeblogEntryComments($entry)

#showWeblogEntryCommentForm($entry)

#end

td>

<td width="20%" valign="top">

<h2>Calendarh2>

#showWeblogEntryCalendar($model.weblog "nil") #11

<h2>Feedsh2>

#showAtomFeedsList($model.weblog) #12

<h2>Searchh2>

#showWeblogSearchForm($model.weblog false) #13

<h2>Linksh2>

#set($rootFolder = $model.weblog.getBookmarkFolder("/")) #14

#showBookmarkLinksList($rootFolder false false)

<h2>Navigationh2>

#showPageMenu($model.weblog) #15

#showAuthorMenu(true) #16

<h2>Referrersh2>

#set($refs = $model.weblog.getTodaysReferrers()) #17

#showReferrersList($refs 30 20)

td>

tr>

table>

body>

html>

解释:
#1 使用weblog名称和页面模版名称定义了文档标题
#2 使用宏#showAutodiscoveryLinks()对RSS和Atom Feed添加HTML连接
#3 使用CSS
#4 显示页面标题
#5 显示weblog分类列表
#6 获得条目分页器(entries pager)用来显示条目和控制分页
#7 显示搜索结果控制