顯示具有 Open source 標籤的文章。 顯示所有文章
顯示具有 Open source 標籤的文章。 顯示所有文章

星期五, 11月 02, 2007

Install trac on ubuntu with multi-project

晚上在Ubuntu上把trac 裝好了,因為clearsilver的so link 會遇到一些問題,所以,把過程記錄下來。

安裝軟體套件

sudo apt-get install trac apache2 libapache2-svn

建立trac環境

sudo mkdir /var/lib/trac

sudo chown www-data:www-data /var/lib/trac

設定apache (enable sites)

ScriptAlias /trac "/usr/share/trac/cgi-bin/trac.cgi"

<Location "/trac">

SetEnv TRAC_ENV_PARENT_DIR "/var/lib/trac"

</Location>

Alias /trac/chrome/common "/usr/share/trac/htdocs"

<Directory "/usr/share/trac/htdocs">

Order allow,deny

Allow from all

</Directory>

做到這邊,trac 環境應該可以正常的運作了,如果需要使用者認證的話,則需要在apache的設定中加上以下設定 (Multiple project 環境)

<LocationMatch "trac/[^/]+/login">

AuthType Basic

AuthName "Trac"

AuthUserFile /somewhere/trac.passwd

require valid-user

</LocationMatch>

重新啟動apache,trac環境就可以正常運作了。

接下來,只需要在新增專案的時候,在/var/lib/trac下用trac-admin 的initenv command建新的trac repository了。

星期六, 9月 22, 2007

CXF REST transport notes


搞了一整天,總算試出CXF的REST介面可以運作的設定模式,雖然wrapped mode一直搞不定,不過,總算搞定unwrapped mode的設定方式。主要必需注意的事情是:


  • interface上一定要有@WebService annotation

  • 在需要傳遞的參數上必需要使用 @HttpResource 指定對應的uri pattern

  • 因為是unwrapped mode, 接受的參數都必需要用VTO (value transfer object)包起來,如同CXF 文件Java REST annotation中的範例一樣

  • CXF 會根據 URI template中的參數名稱{param}將參數對於到VTO中的property。



範例 (interface), spring 設定中的 serviceFactory必需設定unwrapped = false


@WebService(targetNamespace="http://employee.some.company.com")
public interface EmployeeService {
@Get
@HttpResource(location="/employees/{serial}")
@WebResult(name="Employee")
Employee getEmployee(GetEmployee getEmployee);
}

星期二, 7月 17, 2007

struts 2: field validation and type conversion

一般web 應用中,很基本的一個功能是參數的驗證(validation),而在struts 2中,這個功能是透過validation來達成的。但是,在驗證之前,struts 2會先做type conversion 的動作,以確定輸入的參數能夠滿足action 中各個properties的需求。所以,interceptor的執行順序是
  1. 型別轉換 (type conversion)
  2. 參數驗證 (validation)
如果在型別轉換時就發生錯誤的話,相同的欄位就不會進行參數驗證。我就是忽略了這個順序,才搞了二天。

舉例來說,如果有個property 是 setDate(Date theDate),在zh_TW的locale中,預設的日期格式是mm/dd/yyyy,我想在為這個欄位加上validation, 於是,在我的Action-validation.xml中有下列的一段程式碼:


<field name="date">
<field-validator type="regex">
<param name="expression"> ...</param>
<message>wrong format for field date</message>
</field-validator>
</field>


但是,當格式錯誤時,regex卻不會抓到錯誤,問題就是出在type conversion 的interceptor 先運作了,所以總是會出現type conversion 的錯誤訊息 : "Invalid field value for field "date"",所以,對於非String 型態的property,比較有意義的validator只剩下required、date、int這幾個有意義,其他的意義都不大。

那接下來的問題就在於,怎麼把"Invalid field value for vield ..." 這段訊息換成我們想顯示的訊息。這必需透過struts 2的I18N機制來達成,根據AnnotationXWorkConverter文件中提到的,可以在ClassName.properties中設定 invalid.fieldvalue.欄位名稱,來設定特定欄位的conversion error錯誤訊息,如果要改變預設的訊息的話,則可以透過設定global的I18N屬性xwork.default.invalid.fieldvalue 來達成效果。

星期一, 7月 16, 2007

sturts 2 validation and action property

今天又犯了個豬頭錯誤,我有兩個Struts Action,程式碼類似這樣:
public class ParentAction {
protected long property;
...
public long getProperty(){
return property;
}
}

public class ChildAction extends ParentAction{
public void setProperty(int property ){
this.property = property;
}
}

當我對ChildAction 加上required validation時,問題就來了,不論我輸入的是什麼值,validation interceptor總是告訴會回報property is null,找了半天,一路trace到Ognl層,才發現問題出在,透過reflection API取得property 的method descriptor時,因為setProperty的參數型態和getProperty的參數型態不符,而getProperty又在parent,所以會只認getProperty,而把setProperty(int) 當作是一個overloading method,以致於無法設值進去,只要把setProperty 由setProperty(int)改成setProperty(long),就又能夠正常運作了。

這樣的錯誤,只能說是自己不小心造成的,但是,這種錯,應該會常常發生吧,下次,得把這類的檢查也加到test case中。

星期五, 5月 25, 2007

需要wiki嗎? 自己挑一個吧!!

這幾年,wiki (維基)愈來愈紅,不管是公司、社群,甚至個人常常都會有個wiki。但是愈來愈紅代表的也就是選擇可能會愈來愈多,在wiki的領域,可選擇的軟體也愈來愈多,甚至也可以偷懶直接使用別人的wiki 主機服務。這麼多的wiki怎麼選呢? 當然,就是要靠比較多,這次介紹的網站,就是可以幫你比較常見的wiki間的差異、支援等等,讓你更方便的選擇一個自己的wiki。


這個網站收錄了87個Wiki軟體及服務(主機服務),可以讓你對各個wiki之間的功能作詳細的比較,更提供了一個Wiki Choice Wizard,透過幾個問題,先幫你作篩選,讓你不用在87個軟體間漫無目的的尋找,需要wiki嗎? 挑個自己合用的吧!!


WikiMatrix - Compare them all

星期六, 1月 06, 2007

OpenLogic partner

昨天突然收到OpenLogic的Partner邀請,作為他們subclipse計畫的後端支援人員,原來是他們從subclipse的comitter列表中找到我的名字,才發出邀請函。想想自己目前的工作,還算有空檔能幫幫Open source社群的一些忙,也就答應了,不過,他們有提供能協力伙伴一些金錢上的支援,會根據解決的問題,得到若干的報酬就是了。