周六參加了agileChina + BJUG 的活動(dòng),把我參加這次活動(dòng)的一點(diǎn)體會(huì)記下來(lái):
1)那天的風(fēng)特大,走到理想大廈的時(shí)候那風(fēng)差點(diǎn)把我給刮跑了。于是我就在想理想大廈里上班的人肯定是都穿羽絨服的,后來(lái)一
?? 看果不其然。結(jié)果是周日馬上給自己買了件羽絨服。
2)自我介紹:
? 冰云讓每個(gè)人用三個(gè)詞來(lái)概括自己,我說(shuō)了真誠(chéng)、愛(ài)讀書和運(yùn)氣好。真誠(chéng)是因?yàn)槲耶?dāng)過(guò)兵;愛(ài)讀書嗎,其實(shí)是現(xiàn)在讀書的時(shí)間越來(lái)越少了,雜文倒是喜歡。運(yùn)氣好,上次參加BEA UG時(shí)莫映就給我抽了個(gè)一等獎(jiǎng),所以....
3)topic 1 CMM VS AGILE, 講演者:楊崑(PHD在讀)
? 好多專業(yè)術(shù)語(yǔ)我都沒(méi)聽(tīng)過(guò),大部分要靠想象去理解。還好知道單回路和雙回路是什么:)理論總是讓人難以理解的。
4)topic 2 DSL In Practice 講演者:徐昊(TW)
?第一次見(jiàn)到徐昊是在去年的BEA UG,當(dāng)時(shí)是一個(gè)老外介紹Selenium,他做同聲翻譯,留下了深刻的印象。語(yǔ)言有趣、易懂。
? 對(duì)我來(lái)說(shuō)效果很直觀:知道DSL是什么,能做什么了。然后附加知道了徐昊機(jī)器的屏保時(shí)間很短,他總是飛跑著去關(guān)掉屏保。
5)關(guān)于topic 3 Selenium 講演者:黃亮(TW)
? 其實(shí)去年就試用過(guò)Selenium,悲慘的很,去年做的項(xiàng)目在firefox里跑不起來(lái),于是作罷。怎么辦?黃亮讓我的手又癢癢了。
?
6)冰云(limo): 主持的相當(dāng)不錯(cuò),休息的時(shí)候問(wèn)了他工作角色的問(wèn)題。知道了冰云就是李莫,李莫就是冰云。
? yulimin:第一次休息的時(shí)候本打算去找他去的,沒(méi)想到他先過(guò)來(lái)了。其實(shí)最早認(rèn)識(shí)他是在jdon,那時(shí)我還在軍校里,每天在
? jdon里狂翻帖子,下載jive的源碼。然后就看到了他的頭像,于是就想:怎么也是個(gè)當(dāng)兵的??好感那時(shí)就生長(zhǎng)起來(lái)了。這次
? 見(jiàn)到了本人,真的是非常隨和,很有親切感。談到很多東西,然后是晚上一路回家。時(shí)間太短,心里想什么時(shí)候能夠再見(jiàn)面。
?
? 總結(jié):下次還會(huì)參加。
posted @
2006-12-20 12:03 ronghao 閱讀(572) |
評(píng)論 (0) |
編輯 收藏
數(shù)據(jù)權(quán)限分為兩種,一種是數(shù)據(jù)范圍權(quán)限,一種是具體到每一條數(shù)據(jù)的權(quán)限。前一種可以通過(guò)動(dòng)態(tài)構(gòu)建SQL解決;后一種
似乎必須通過(guò)ACL不可。于是就想對(duì)Acegi ACL做一個(gè)通用的擴(kuò)展。以通訊錄為例
先看一個(gè)總的配置
? <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>
擴(kuò)展一、當(dāng)你增加一條記錄的同時(shí)向ACL表里插入權(quán)限信息 這個(gè)SS已經(jīng)做到了這一點(diǎn)
??ss有一個(gè)接口標(biāo)示哪些doamin需要acl保護(hù) AclDomainAware
??這里再擴(kuò)展一個(gè)基類 ,目的很簡(jiǎn)單當(dāng)讀出數(shù)據(jù)時(shí)附加上權(quán)限信息
??public? class BasicAclDomain implements AclDomainAware {
??? private int mask; //權(quán)限
??? public int getMask() {
??????? return mask;
??? }
??? public void setMask(int mask) {
??????? this.mask = mask;
??? }
??}
??
??public class Contact extends BasicAclDomain
擴(kuò)展二、讀取列表時(shí)進(jìn)行數(shù)據(jù)的過(guò)濾,原來(lái)的acegi在ACL的集合后處理會(huì)造成分頁(yè)產(chǎn)生虎牙子
???? 這里采用前攔截,在acl表里增加一個(gè)className字段,里面放上PO的類名,這樣可以縮小
???? 數(shù)據(jù)查詢范圍.實(shí)際在讀取集合時(shí),是先到acl表里完成分頁(yè),然后獲得對(duì)Contact的real id list
???? 然后攔截實(shí)際DAO方法,動(dòng)態(tài)改變SQL成select * from real_data where id in ( {real id list} )的形式,這樣就OK了,
???? 分頁(yè)實(shí)際是對(duì)acl表里相應(yīng)記錄的'分頁(yè)'.比如說(shuō)取第10條到20條,實(shí)際是取acl表里相應(yīng)記錄的第10條到20條來(lái)動(dòng)態(tài)改變SQL
???? 這個(gè)可以寫一個(gè)專門被用來(lái)攔截的類 SecurityDAO 方法findByPageACL(query, page),ContactServiceImpl中g(shù)etAllContacts
???? 方法強(qiáng)制調(diào)用該方法
擴(kuò)展三、后攔截。這里AFTER_ACL_COLLECTION_READ和AFTER_ACL_READ的目的就很簡(jiǎn)單了,因?yàn)樗麄儾辉龠M(jìn)行數(shù)據(jù)過(guò) 濾,?他們只是把用戶對(duì)每條記錄的mask取最大權(quán)限就OK,然后往PO里setMask。這樣PO帶了權(quán)限信息到頁(yè)面上就非常好處理了。比如button的顯示等等
擴(kuò)展四、封裝AclService,對(duì)單條記錄的ACL權(quán)限管理。比如增加權(quán)限、修改權(quán)限、刪除權(quán)限。這個(gè)acegi的最新1.0.3已經(jīng)開(kāi)始加入。
具體在實(shí)現(xiàn)中感覺(jué)acl的vote完全是雞肋,全部不用。另外在擴(kuò)展二中如果用戶數(shù)據(jù)要實(shí)現(xiàn)數(shù)據(jù)庫(kù)排序就比較困難。所以就有了還未實(shí)現(xiàn)的構(gòu)想:
一、PO創(chuàng)建向ACL表里插入權(quán)限信息時(shí)可以配置不同的策略:比如通訊錄創(chuàng)建一條新信息只能創(chuàng)建者可以看并管理,而你往請(qǐng)假表里插一條新信息后,不僅你了,你的上司也可以同時(shí)看到。(這個(gè)還是比較easy)
二、用戶數(shù)據(jù)要實(shí)現(xiàn)數(shù)據(jù)庫(kù)排序。需要在ACL_OBJECT_IDENTITY里增加幾個(gè)額外的字段,把po相應(yīng)的排序字段同步更新到ACL表中。什么?不好做?寫配置文件啊!再對(duì)PO的update進(jìn)行后攔截。
想法就這樣。實(shí)現(xiàn)??
posted @
2006-12-14 10:20 ronghao 閱讀(4279) |
評(píng)論 (6) |
編輯 收藏
作為CMS內(nèi)容發(fā)布來(lái)說(shuō),將要顯示的內(nèi)容html化無(wú)疑是一個(gè)很基本的要求,這樣可以提高整個(gè)系統(tǒng)的效率。
考慮一個(gè)內(nèi)容節(jié)點(diǎn)Content,其中節(jié)點(diǎn)有個(gè)pagecontent的屬性,這個(gè)屬性用來(lái)存儲(chǔ)用戶在后臺(tái)輸入的內(nèi)容,
內(nèi)容+模板=顯示,這里是:
內(nèi)容+模板-->顯示靜態(tài)html
內(nèi)容用FCK來(lái)編輯,模板也同樣用FCK編輯,這里用freemarker無(wú)疑是一個(gè)好的選擇。這里是個(gè)最簡(jiǎn)單的例子。
首先定義一個(gè)最簡(jiǎn)單的模板content.ftl
然后就是把內(nèi)容填充進(jìn)去:
?Configuration?cfg?=?new?Configuration();
?//模板存儲(chǔ)的目錄
?cfg.setDirectoryForTemplateLoading(Path.getTemplateDirectory());
?//默認(rèn)
?cfg.setObjectWrapper(new?DefaultObjectWrapper());
//填充數(shù)據(jù)????????
Map?root?=?new?HashMap();
root.put("content",?c.getPageContent());
?????Template?temp?=?cfg.getTemplate("content.ftl");
//發(fā)布日期
String?date=c.getActivedate();
String?filename?=?c.getId()+".html";
//創(chuàng)建目錄
Path.createFold(Path.getWebCmsHtmlDirPath(),date);
Writer?out?=?new?OutputStreamWriter(new?FileOutputStream(Path.getWebCmsHtmlDirPath()+"/"+date+"/"+filename));
temp.process(root,?out);
out.flush();其實(shí)就是這么簡(jiǎn)單!對(duì)html的管理就很容易了,基本的FILE操作
posted @
2006-11-27 18:51 ronghao 閱讀(6008) |
評(píng)論 (8) |
編輯 收藏
CMS包括了網(wǎng)頁(yè)的發(fā)布,在編輯網(wǎng)頁(yè)內(nèi)容的時(shí)候用到了FCK.網(wǎng)上的教程是很多的.一切剛開(kāi)始都很順利.問(wèn)題出在對(duì)圖片\FLASH的上傳和瀏覽支持上.對(duì)JAVA來(lái)說(shuō)是需要編碼的.這里用到了FCK-java.2.2這個(gè)包.其實(shí)里面除了兩個(gè)servlet其他的都可以干掉的,似乎用不上它提供的標(biāo)簽.
兩個(gè)servlet里用到了common-fileupload.jar.一切看起來(lái)都很不錯(cuò),可是就是上傳不了文件.debug發(fā)現(xiàn)common-fileupload得不到fileItem.很是郁悶,因?yàn)樘峁┑膕ample是可以正常跑的.上了common-fileupload的官方網(wǎng)站,才發(fā)現(xiàn)是有別的進(jìn)程攔截request的緣故.于是開(kāi)始調(diào)試.我靠,系統(tǒng)里的過(guò)濾器真TM的多,最后是把webwork\webwork-cleanup攔截/*變?yōu)?.action這才正常.
?問(wèn)題:我們真的需要這么多的filter嗎?這些filter過(guò)濾的范圍認(rèn)真考慮過(guò)嗎,可以縮小嗎?
posted @
2006-11-23 22:02 ronghao 閱讀(1463) |
評(píng)論 (1) |
編輯 收藏
平臺(tái)新版本將要發(fā)布,目前還缺CMS.原計(jì)劃是將原先的CMS移植過(guò)來(lái)即可,原先的版本是基于Slide開(kāi)發(fā)的,后來(lái)經(jīng)過(guò)討論還是決定重新架構(gòu).新版本基于jackrabbit.大概考慮了一下需求:
1.很多CMS都包括了發(fā)布模板、顯示模板,這里不用考慮,CMS僅僅是內(nèi)容管理,負(fù)責(zé)內(nèi)容存儲(chǔ),至于展現(xiàn),那是門戶事情.內(nèi)容和展現(xiàn)分開(kāi).CMS作為門戶數(shù)據(jù)源的一個(gè)選擇.
2.一個(gè)完整的CMS并不是作為一個(gè)所謂的欄目信息,它還必須包括對(duì)各種文件的保存.對(duì)整個(gè)平臺(tái)的文件和附件進(jìn)行統(tǒng)一管理
3.版本管理
4.全文檢索
5.權(quán)限管理,具體到每一個(gè)節(jié)點(diǎn)的配置.不僅僅是在CMS內(nèi)部,用戶通過(guò)門戶看到的信息也是要經(jīng)過(guò)權(quán)限過(guò)濾(內(nèi)網(wǎng)門戶)
6.一套可擴(kuò)展的組織用戶接口(目前是直接用平臺(tái)內(nèi)部的組織用戶,考慮到CMS將來(lái)的獨(dú)立性,這個(gè)也是必要的)
7.文件的webdav支持
大概就是這些了,已初步完成了對(duì)jcr的封裝和架構(gòu).感到spring有勁使不上,呵呵.
CMS信息發(fā)布需求
信息分兩種:未發(fā)布的和發(fā)布的
1、未發(fā)布的信息可以進(jìn)行增刪改查、版本管理、上傳和下載附件
2、將未發(fā)布的信息發(fā)布,信息的狀態(tài)將置為發(fā)布狀態(tài)同時(shí)結(jié)合模板生成靜態(tài)HTML
3、發(fā)布的信息本身會(huì)增加一個(gè)對(duì)靜態(tài)HTNL聯(lián)接的屬性,在后臺(tái)即可以對(duì)靜態(tài)HTML進(jìn)行瀏覽
4、發(fā)布的信息依舊可以進(jìn)行內(nèi)容修改和版本恢復(fù),這樣會(huì)將生成的靜態(tài)HTML刪除然后再重新生成
5、發(fā)布的信息可以刪除,信息進(jìn)入回收站,靜態(tài)HTML同時(shí)被刪除
6、從回收站恢復(fù)信息,信息重新發(fā)布,生成靜態(tài)HTML
7、通過(guò)欄目的設(shè)置來(lái)決定信息的發(fā)布是直接發(fā)布還是通過(guò)工作流發(fā)布
posted @
2006-11-16 22:55 ronghao 閱讀(5014) |
評(píng)論 (12) |
編輯 收藏