周六参加了agileChina + BJUG 的活动,把我参加这次活动的一点体会记下来:
1)那天的风特大,走到理想大厦的时候那风差点把我给刮跑了。于是我就在想理想大厦里上班的人肯定是都穿羽绒服的,后来一
看果不其然。结果是周日马上给自己买了件羽绒服。
2)自我介绍:
冰云让每个人用三个词来概括自己,我说了真诚、爱读书和运气好。真诚是因为我当过兵;爱读书吗,其实是现在读书的时间越来越少了,杂文倒是喜欢。运气好,上次参加BEA UG时莫映就给我抽了个一等奖,所以....
3)topic 1 CMM VS AGILE, 讲演者:杨崑(PHD在读)
好多专业术语我都没听过,大部分要靠想象去理解。还好知道单回路和双回路是什么:)理论总是让人难以理解的。
4)topic 2 DSL In Practice 讲演者:徐昊(TW)
第一次见到徐昊是在去年的BEA UG,当时是一个老外介绍Selenium,他做同声翻译,留下了深刻的印象。语言有趣、易懂。
对我来说效果很直观:知道DSL是什么,能做什么了。然后附加知道了徐昊机器的屏保时间很短,他总是飞跑着去关掉屏保。
5)关于topic 3 Selenium 讲演者:黄亮(TW)
其实去年就试用过Selenium,悲惨的很,去年做的项目在firefox里跑不起来,于是作罢。怎么办?黄亮让我的手又痒痒了。
6)冰云(limo): 主持的相当不错,休息的时候问了他工作角色的问题。知道了冰云就是李莫,李莫就是冰云。
yulimin:第一次休息的时候本打算去找他去的,没想到他先过来了。其实最早认识他是在jdon,那时我还在军校里,每天在
jdon里狂翻帖子,下载jive的源码。然后就看到了他的头像,于是就想:怎么也是个当兵的??好感那时就生长起来了。这次
见到了本人,真的是非常随和,很有亲切感。谈到很多东西,然后是晚上一路回家。时间太短,心里想什么时候能够再见面。
总结:下次还会参加。
posted @
2006-12-20 12:03 ronghao 阅读(565) |
评论 (0) |
编辑 收藏
数据权限分为两种,一种是数据范围权限,一种是具体到每一条数据的权限。前一种可以通过动态构建SQL解决;后一种
似乎必须通过ACL不可。于是就想对Acegi ACL做一个通用的扩展。以通讯录为例
先看一个总的配置
<bean id="contactManagerSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
<property name="authenticationManager"><ref bean="authenticationManager"/></property>
<property name="accessDecisionManager"><ref local="aclDecisionManager"/></property>
<property name="afterInvocationManager"><ref local="afterInvocationManager"/></property>
<property name="objectDefinitionSource">
<value>
com.ronghao.acltest.services.ContactService.saveContact=AFTER_ACL_CREAT
com.ronghao.acltest.services.ContactService.getAllContacts=AFTER_ACL_COLLECTION_READ
com.ronghao.acltest.services.ContactService.getContact=AFTER_ACL_READ
</value>
</property>
</bean>
扩展一、当你增加一条记录的同时向ACL表里插入权限信息 这个SS已经做到了这一点
ss有一个接口标示哪些doamin需要acl保护 AclDomainAware
这里再扩展一个基类 ,目的很简单当读出数据时附加上权限信息
public class BasicAclDomain implements AclDomainAware {
private int mask; //权限
public int getMask() {
return mask;
}
public void setMask(int mask) {
this.mask = mask;
}
}
public class Contact extends BasicAclDomain
扩展二、读取列表时进行数据的过滤,原来的acegi在ACL的集合后处理会造成分页产生虎牙子
这里采用前拦截,在acl表里增加一个className字段,里面放上PO的类名,这样可以缩小
数据查询范围.实际在读取集合时,是先到acl表里完成分页,然后获得对Contact的real id list
然后拦截实际DAO方法,动态改变SQL成select * from real_data where id in ( {real id list} )的形式,这样就OK了,
分页实际是对acl表里相应记录的'分页'.比如说取第10条到20条,实际是取acl表里相应记录的第10条到20条来动态改变SQL
这个可以写一个专门被用来拦截的类 SecurityDAO 方法findByPageACL(query, page),ContactServiceImpl中getAllContacts
方法强制调用该方法
扩展三、后拦截。这里AFTER_ACL_COLLECTION_READ和AFTER_ACL_READ的目的就很简单了,因为他们不再进行数据过 滤, 他们只是把用户对每条记录的mask取最大权限就OK,然后往PO里setMask。这样PO带了权限信息到页面上就非常好处理了。比如button的显示等等
扩展四、封装AclService,对单条记录的ACL权限管理。比如增加权限、修改权限、删除权限。这个acegi的最新1.0.3已经开始加入。
具体在实现中感觉acl的vote完全是鸡肋,全部不用。另外在扩展二中如果用户数据要实现数据库排序就比较困难。所以就有了还未实现的构想:
一、PO创建向ACL表里插入权限信息时可以配置不同的策略:比如通讯录创建一条新信息只能创建者可以看并管理,而你往请假表里插一条新信息后,不仅你了,你的上司也可以同时看到。(这个还是比较easy)
二、用户数据要实现数据库排序。需要在ACL_OBJECT_IDENTITY里增加几个额外的字段,把po相应的排序字段同步更新到ACL表中。什么?不好做?写配置文件啊!再对PO的update进行后拦截。
想法就这样。实现??
posted @
2006-12-14 10:20 ronghao 阅读(4258) |
评论 (6) |
编辑 收藏
作为CMS内容发布来说,将要显示的内容html化无疑是一个很基本的要求,这样可以提高整个系统的效率。
考虑一个内容节点Content,其中节点有个pagecontent的属性,这个属性用来存储用户在后台输入的内容,
内容+模板=显示,这里是:
内容+模板-->显示静态html
内容用FCK来编辑,模板也同样用FCK编辑,这里用freemarker无疑是一个好的选择。这里是个最简单的例子。
首先定义一个最简单的模板content.ftl
然后就是把内容填充进去:
Configuration cfg = new Configuration();
//模板存储的目录
cfg.setDirectoryForTemplateLoading(Path.getTemplateDirectory());
//默认
cfg.setObjectWrapper(new DefaultObjectWrapper());
//填充数据
Map root = new HashMap();
root.put("content", c.getPageContent());
Template temp = cfg.getTemplate("content.ftl");
//发布日期
String date=c.getActivedate();
String filename = c.getId()+".html";
//创建目录
Path.createFold(Path.getWebCmsHtmlDirPath(),date);
Writer out = new OutputStreamWriter(new FileOutputStream(Path.getWebCmsHtmlDirPath()+"/"+date+"/"+filename));
temp.process(root, out);
out.flush(); 其实就是这么简单!对html的管理就很容易了,基本的FILE操作
posted @
2006-11-27 18:51 ronghao 阅读(5994) |
评论 (8) |
编辑 收藏
CMS包括了网页的发布,在编辑网页内容的时候用到了FCK.网上的教程是很多的.一切刚开始都很顺利.问题出在对图片\FLASH的上传和浏览支持上.对JAVA来说是需要编码的.这里用到了FCK-java.2.2这个包.其实里面除了两个servlet其他的都可以干掉的,似乎用不上它提供的标签.
两个servlet里用到了common-fileupload.jar.一切看起来都很不错,可是就是上传不了文件.debug发现common-fileupload得不到fileItem.很是郁闷,因为提供的sample是可以正常跑的.上了common-fileupload的官方网站,才发现是有别的进程拦截request的缘故.于是开始调试.我靠,系统里的过滤器真TM的多,最后是把webwork\webwork-cleanup拦截/*变为*.action这才正常.
问题:我们真的需要这么多的filter吗?这些filter过滤的范围认真考虑过吗,可以缩小吗?
posted @
2006-11-23 22:02 ronghao 阅读(1453) |
评论 (1) |
编辑 收藏
平台新版本将要发布,目前还缺CMS.原计划是将原先的CMS移植过来即可,原先的版本是基于Slide开发的,后来经过讨论还是决定重新架构.新版本基于jackrabbit.大概考虑了一下需求:
1.很多CMS都包括了发布模板、显示模板,这里不用考虑,CMS仅仅是内容管理,负责内容存储,至于展现,那是门户事情.内容和展现分开.CMS作为门户数据源的一个选择.
2.一个完整的CMS并不是作为一个所谓的栏目信息,它还必须包括对各种文件的保存.对整个平台的文件和附件进行统一管理
3.版本管理
4.全文检索
5.权限管理,具体到每一个节点的配置.不仅仅是在CMS内部,用户通过门户看到的信息也是要经过权限过滤(内网门户)
6.一套可扩展的组织用户接口(目前是直接用平台内部的组织用户,考虑到CMS将来的独立性,这个也是必要的)
7.文件的webdav支持
大概就是这些了,已初步完成了对jcr的封装和架构.感到spring有劲使不上,呵呵.
CMS信息发布需求
信息分两种:未发布的和发布的
1、未发布的信息可以进行增删改查、版本管理、上传和下载附件
2、将未发布的信息发布,信息的状态将置为发布状态同时结合模板生成静态HTML
3、发布的信息本身会增加一个对静态HTNL联接的属性,在后台即可以对静态HTML进行浏览
4、发布的信息依旧可以进行内容修改和版本恢复,这样会将生成的静态HTML删除然后再重新生成
5、发布的信息可以删除,信息进入回收站,静态HTML同时被删除
6、从回收站恢复信息,信息重新发布,生成静态HTML
7、通过栏目的设置来决定信息的发布是直接发布还是通过工作流发布
posted @
2006-11-16 22:55 ronghao 阅读(5000) |
评论 (12) |
编辑 收藏