posts - 262,  comments - 221,  trackbacks - 0
12 2009 档案
【原】RSS工具开发手记(12)---Informa的parsers包      摘要: 可以看到,对于这个解析过程,一般的步骤就是:
A.获取channnel下的某个子节点元素
B.如果该子节点元素有子元素或属性,则继续递归访问
C.调用该channnel子元素的createXxx方法加载或创建该子元素
D.调用Channel的setXxx方法添加该子元素到channel实例中  阅读全文
posted @ 2009-12-30 10:45 Paul Lin 阅读(278) | 评论 (0)  编辑
【原】RSS工具开发手记(11)---Informa的parse包      摘要: FeedParser是一个facade类,这个类的工作就是根据读入的RSS Feed的协议系和版本“委托(delegate)”给已经硬编码的规则(concrete rules)指定的解析器,而且这些解析器是私有的。这意味着:用户不能直接调用一个RSS_0_91_Parser类的实例来进行解析工作。  阅读全文
posted @ 2009-12-29 15:56 Paul Lin 阅读(1527) | 评论 (0)  编辑
【原】RSS工具开发手记(10)---Informa的impl.hibernate包      摘要: ChannelBuilder对channel object的创建原则就是:
A.如果能够从持久层中找到对应的记录,那么从持久层返回
B.如果找不到,则创建它并持久化它,然后返回该对象(已持久化)

只要记得的一点就是:从ChannelBuilder返回的对象都是已经持久化的。  阅读全文
posted @ 2009-12-28 15:57 Paul Lin 阅读(1280) | 评论 (0)  编辑
【原】RSS工具开发手记(09)---Informa的impl.hibernate包      摘要: 经过和impl.basic包中Channel的比较,发现两者的实现有如下的不同:

A.构造方法中多了3个方法,其中两个是使用title和location来构造的,最后一个是使用Element,title,location来构造的
B.从Hibernate中检索出来的是不用设置ID的,而从内存中生成的必须使用IdGenerator产生唯一ID
C.basic实现中没有getLocationString方法和setLocationString方法
D.basic实现中没有getSiteString方法和setSiteString方法
E.basic实现中没有getGroup方法和setGroup方法
F.basic实现中没有getFormatString和setFormatString方法
G.basic中没有setItems方法,而且getItems方法中的实现不同(basic采用了同步的hashset,而hibernate没有)
H.basic中的addItem方法是添加到hashmap,而hib  阅读全文
posted @ 2009-12-28 10:51 Paul Lin 阅读(269) | 评论 (0)  编辑
【原】RSS工具开发手记(08)---Informa的build.xml      摘要: 其中dbscheme是关键,它的主要工作包括:
A.创建用于保存DDL输出结果的scripts目录
B.定义一个名为schemaexport的Ant task,用于把hbm文件导出为ddl文件
C.执行schemaexport任务,把classes目录下的hbm文件export成DDL,并输出到指定的位置
D.输出执行结果信息  阅读全文
posted @ 2009-12-23 10:45 Paul Lin 阅读(1408) | 评论 (0)  编辑
【原】RSS工具开发手记(07)---Informa的impl.basic包      摘要: 这个ID生成类采用了系统当前时间作为随即数产生的种子,这个并不难理解。但是有一个地方需要我们注意的就是关键字transient的使用。这个关键的作用是告诉编译器假设该类的对象被序列化了,这个值不需要被保存。因为它是“瞬时”的。  阅读全文
posted @ 2009-12-23 00:03 Paul Lin 阅读(1418) | 评论 (0)  编辑
【原】RSS工具开发手记(06)---Informa的impl.basic包      摘要: 在ChannelBuilder下有几种类型的方法:
★构造方法和初始化方法:即创建Channel对象的方法及初始化的方法
★元素构建方法:即构建Channel子元素的方法
★事务控制方法:即控制构建,析构过程的方法  阅读全文
posted @ 2009-12-22 23:52 Paul Lin 阅读(1292) | 评论 (0)  编辑
【原】RSS工具开发手记(05)---Informa的impl.basic包      摘要: 总结起来,channel的创建,更新过程如下:
①接收经过ChannelParser解析后的XML Element元素,和其他一系列属性,调用构造方法
②构造方法为channel生成一个全局唯一ID
③构造方法创建item列表,观察者列表,设置好分类(Category),首次更新时间
④如果有新item到来,则添加到item列表,同时更新item的channel归属
⑤如果现有channel更新,则设置最新更新时间
⑥通知每一个已注册的观察者有事件发生  阅读全文
posted @ 2009-12-22 23:31 Paul Lin 阅读(1302) | 评论 (0)  编辑
【原】RSS工具开发手记(04)---Informa的core包      摘要: Informa的core包介绍如下:

“This package contains interfaces for the news channel objects, it builds the core API for all news channel storage implementation. ”

从上面这句话来看,core包里面定义的都是关于“news channel objects”的接口---实际上就是RSS协议中的channel和item元素。经过一个多小时查看源代码和阅读API,发现Informa对core包的设计有如下特点:

core包中的元素被分为标记接口、实体接口、行为接口  阅读全文
posted @ 2009-12-21 22:09 Paul Lin 阅读(1286) | 评论 (0)  编辑
【原】RSS工具开发手记(03)---初始Informa      摘要: Informa的API结构如下:

★core包:
核心包。订阅了RSS中channel,item等一系列元素和元数据的接口

★impl.basic包:
基本功能包。使用in-memory模式实现了core包订阅的接口

★impl.hibernate包:
基于hibernate实现的包,使用关系型数据库模式实现了core包定义的接口

★parsers包:
定义了永远解析channel,item的解析器工具

★exporters包:
定义了一组把channel,item导出成各种协议格式的工具

★search包:
定义了用于全文搜索channel,item的工具

★utils.manager.memory包:
定义了一组用于管理“in-memory”模式持久化的工具

★utils.manager.hibernate包:   阅读全文
posted @ 2009-12-21 15:39 Paul Lin 阅读(1285) | 评论 (0)  编辑
【原】RSS工具开发手记(02)---工欲善其事,必先利其器      摘要: 选择一个开源框架,我的标准有几条:

★良好的文档和源代码管理:这是最基本的一条,想RSSLibJ这种连文档、官网都没有的一律pass掉
★持续的改进:这是第二个重要的,像上面某些工具从02年后就不再更新了,出了问题你找谁诉苦去
★简单和易上手:在短时间内可以迅速依样画葫芦
★活跃的社区:参与的人越多软件成长得越多。我不是特别在乎软件目前的使用率,因为好的软件都是慢慢出名的  阅读全文
posted @ 2009-12-21 11:52 Paul Lin 阅读(1406) | 评论 (0)  编辑
【原】RSS工具开发手记(01)---Kick off      摘要: ◆软件必须适应不同的终端,不同的访问方式,不同版本的协议。对设计通用性要求较高
◆软件必须解析和生成XML,涉及到大量的字符串和格式处理。对XML和性能要求较高
◆软件必须具备实时监控功能,且具备主动推送功能,对多线程和异步通讯要求较高
◆软件必须支持不同的持久化方式,对缓存和持久化要求较高
◆软件必须支持基于全文的搜索,对搜索技术有一定要求
◆软件界面必须是支持拖拽功能的,对GUI和Ajax有一定要求  阅读全文
posted @ 2009-12-18 12:14 Paul Lin 阅读(373) | 评论 (0)  编辑
【原】SVN In Action系列发布      摘要: SVN是一个开放的、免费的版本控制管理工具,相比CVS,Perforce等其他工具,SVN在版本模型,锁定策略方面要更加灵活高效。下面就让我们开始一步一步地学习如何使用SVN,如何把版本控制融入到日常工作中,更重要的是在学习版本控制的过程中树立起团队合作的理念。

关于SVN的参考资料,最好的莫过于其官方文档《Version Control with Subversion》,作为新手一定要看的是里面的第一章《Fundamental Concepts》和第二章《Basic Usage》以及第九章《Subversion Complete Reference》。

为了做到真正的In Action,我采用了Step-by-Step的方式,模拟一个项目从检出项目开始,到修改本地副本,再到提交变更,解决冲突等一系列的实际工作中会遇到的场景,期望通过这些场景和任务来对SVN和版本控制、团队合作有一个基本的认识  阅读全文
posted @ 2009-12-13 12:29 Paul Lin 阅读(3541) | 评论 (5)  编辑
【原】SVN In Action(23)      摘要: SVN日常操作基本命令总结
1. 导入/导出资源:svn import、svn checkout
2. 更新工作副本: svn update
3. 添加变化:svn add、svn delete、svn copy、svn move
4. 检查变化:svn status、svn diff
5. 撤销变化:svn revert
6. 解决冲突:svn resolved
7. 提交变更:svn commit  阅读全文
posted @ 2009-12-11 18:23 Paul Lin 阅读(489) | 评论 (0)  编辑
【原】SVN In Action(22)      摘要: 这时就需要用到SVN提供的清理功能了。清理功能是通过svn cleanup 命令来完成的。当执行这个命令时,SVN会首先完成log文件中没有完成的剩余工作,释放锁定,最后删除log文件。通常我们都是在项目的根目录来执行这个命令  阅读全文
posted @ 2009-12-11 18:19 Paul Lin 阅读(392) | 评论 (0)  编辑
【原】SVN In Action(21)      摘要: 什么时候是Branch?什么时候是Tag?原则如下:

如果你还需要继续向目录提交变更,它就是个分支。如果一旦拷贝后不再提交任何改变哪就是标记。实际上SVN不会强制你不能对名为***tag的目录进行commit操作,这只是通常上约定。即便因为误操作我们也可以轻易的使用update操作回滚到当初创建Tag时的快照版本  阅读全文
posted @ 2009-12-11 17:39 Paul Lin 阅读(398) | 评论 (0)  编辑
【原】SVN In Action(18)      摘要: svn merge的命令用法有三种:
A.svn merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
B.svn merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
C.svn merge[[-c M]...|[-r N:M]...] [SOURCE[@REV][WCPATH]]

Step 1:确定要从哪个版本开始~那个版本结束
Step 2: 执行集成
Step 3: 提交集成结果

  阅读全文
posted @ 2009-12-11 12:02 Paul Lin 阅读(587) | 评论 (2)  编辑
【原】SVN In Action(17)      摘要: svn switch [--relocate] URL。该命令有两种用法:一种是不使用参数relocate的,一种是使用relocate参数的。它们的使用原则如下:

A.如果切换后的版本库路径还是在同一个版本库,只是在不同的路径下。那么使用svn switch URL
B.如果切换后的版本库位置已经改变(主机迁移,版本库迁移),但是目录结构不变。就需要加relocate参数  阅读全文
posted @ 2009-12-10 19:02 Paul Lin 阅读(461) | 评论 (0)  编辑