Smooks 工具 - QuickStart
Posted on 2009-08-24 19:00 Dart 閱讀(6608) 評(píng)論(2) 編輯 收藏 所屬分類: JBoss SOA 產(chǎn)品English Version
Smooks Tools 是一個(gè)針對(duì)Smooks數(shù)據(jù)轉(zhuǎn)換平臺(tái)而開發(fā)的一個(gè)工具,整個(gè)工具是基于Eclipse的。
工具目前主要是由兩個(gè)編輯器組成:1.Smooks configuration file編輯器,也就是Smooks Configuration Editor。2.EDI消息映射配置文件編輯器,EDI Message Mapping Editor。
本文將簡(jiǎn)要介紹一下Smooks configuration editor。
Quick Start
為了能夠快速熟悉一下整個(gè)編輯器,我將通過一個(gè)QuickStart作為整片文章的開始。本例將講述怎么使用Smooks tools創(chuàng)建,配置Java-to-Java轉(zhuǎn)換所需的配置文件,以及如何編寫Smooks代碼進(jìn)行運(yùn)行該例。
下載以及安裝
首先需要先下載Eclipse以及Smooks工具的Plugin:
Eclipse WTP 3.1 :http://www.eclipse.org/downloads/
Smooks Tools : http://www.jboss.org/tools/download.html
下載好Eclipse WTP后,解壓縮到某個(gè)目錄下,然后將smooks tools壓縮包解壓后,找到./plugins文件夾,將該文件夾下的jar文件復(fù)制到Eclipse WTP對(duì)應(yīng)的文件夾(./eclipse/plugins)下。
然后我們需要去到Smooks.org下載Smooks 1.2.1。
完成后啟動(dòng)Eclipse,在菜單欄上選擇:Help -> About Eclipse SDK -> Installation Details -> Plug-ins ,在列表中我們會(huì)看到Smooks tools所對(duì)應(yīng)的3個(gè)plugin:

這說明Smooks tools已經(jīng)安裝成功了。
新建Smooks項(xiàng)目
在eclipse中我們新建一個(gè)Java工程,在項(xiàng)目下新建一個(gè)libs文件夾,然后將所下載的Smooks 1.2.1中的libraries復(fù)制到該文件夾下,并將這些libraries加入到j(luò)ava項(xiàng)目的classpath當(dāng)中(右鍵點(diǎn)擊項(xiàng)目-> Properties -> Java Build Path -> Libraries -> Add JARs... )
然后在該項(xiàng)目中創(chuàng)建我們所要轉(zhuǎn)換的目標(biāo)Java類以及轉(zhuǎn)換輸入Java類。(這些Java類以及代碼都來自Smooks 1.2.1中的Java-to-Java example,讀者可以去自行下載該例,或者直接從本文給出的鏈接中下載)。
映射規(guī)則
在使用Smooks tools工作之前,我們需要先搞清楚映射的規(guī)則:
轉(zhuǎn)換輸入Java類example.sourcemodel.Order類,具有以下結(jié)構(gòu):

1.Order類本身
2.Order包含有一個(gè)Header類,以及一個(gè)List類
3.Header類具有customerName,customerNumber,priority三個(gè)屬性
4.List中將存放的是一個(gè)OrderItem類
5.OrderItem具有price,productId,quantity三個(gè)屬性
讓我們看看轉(zhuǎn)換目標(biāo)類LineOrder:
該結(jié)構(gòu)為:
1.LineOrder類包含有customerId,customerName,priority 三個(gè)屬性以及一個(gè)lineItems的數(shù)組。
2.數(shù)據(jù)lineItems是由LineItem組成
3.LineItem具有productCode,unitPrice,unitQuantity三個(gè)屬性。
了解完轉(zhuǎn)換輸入以及轉(zhuǎn)換目標(biāo)的結(jié)構(gòu)后,我們將要以下列的規(guī)則來將轉(zhuǎn)換輸入映射到轉(zhuǎn)換目標(biāo)中:
1.每一個(gè)Order類的實(shí)例對(duì)應(yīng)生成一個(gè)LineOrder的實(shí)例
2.Order實(shí)例中Header的customerName值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的customerName
3.Order實(shí)例中Header的customerNumber值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的customerId
4.Order實(shí)例中Header的proiority值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的proiority
5.每一個(gè)Order實(shí)例中的orderitems List的實(shí)例將對(duì)應(yīng)生成一個(gè)LineOrder中的lineItems數(shù)組對(duì)象,并且orderItem List中的OrderItem實(shí)例將會(huì)對(duì)應(yīng)生成一個(gè)LineItem對(duì)象,該LineItem的對(duì)象會(huì)被放置到生成的lineItems數(shù)組對(duì)象中。
6.OrderItem實(shí)例中的productId值將賦值到對(duì)應(yīng)LineItem對(duì)象中的productCode
7.OrderItem實(shí)例中的price值將賦值到對(duì)應(yīng)LineItem對(duì)象中的unitPrice
8.OrderItem實(shí)例中的quantity值將賦值到對(duì)應(yīng)LineItem對(duì)象中的unitQuantity
請(qǐng)仔細(xì)閱讀以上規(guī)則后進(jìn)入到下一節(jié)。
新建Smooks configuration file
我們選中所建項(xiàng)目的src文件夾,點(diǎn)右鍵,選擇New -> Other... -> Smooks -> Smooks Configuratin File.

然后點(diǎn)擊Next > ,選擇所要生成smooks config file所在的文件夾,選擇到所生成項(xiàng)目的src下,然后點(diǎn)擊Finish完成配置文件的創(chuàng)建。

我們將會(huì)看到新建的smooks conig file , 并且該文件自動(dòng)被Smooks Configuration Editor打開。

添加輸入數(shù)據(jù)
在該編輯器的下方有一組tab按鈕,分別是:
Overview, Reader , Message Filter ,Graph , Source
首先第一步,我們需要將轉(zhuǎn)換輸入Order類添加進(jìn)來,點(diǎn)擊Reader tab,切換到Reader/Input編輯頁(yè)。

在該編輯頁(yè)的下方,我們可以看到一個(gè)Input Data的列表,點(diǎn)擊該列表右側(cè)的Add按鈕,根據(jù)向?qū)В砑右粋€(gè)Java輸入:


確定后點(diǎn)擊Finish,Order類將被作為輸入數(shù)據(jù)添加進(jìn)來。
添加目標(biāo)Bean
完成輸入數(shù)據(jù)的添加后,我們切換到Message Filter頁(yè)。

點(diǎn)擊Add按鈕,將有一個(gè)向?qū)ы?yè)出現(xiàn)。
我們選擇Java Binding v1.2 -> Bean v1.2 然后確定,添加一個(gè)Bean:

這時(shí)我們會(huì)發(fā)現(xiàn)在Message Filter頁(yè)面中增加一個(gè)Bean v1.2項(xiàng),選中該項(xiàng),在頁(yè)面的右側(cè)將會(huì)顯示出它可配置的屬性:

在bean Id 處,我們輸入lineOrder,作為該Bean的id,在Class處我們點(diǎn)擊Browse按鈕,選擇LineOrder類作為該Bean的Class。
(溫馨小貼士:選中Class的文本框后,可以輸入字符,然后按Alt+/ 鍵,將會(huì)有內(nèi)容幫助窗口彈出,這樣的可以提高效率。如果輸入Alt + /無效果,可以使用Ctrl + space,這是Eclipse的內(nèi)容幫助快捷鍵,在不同的平臺(tái)上會(huì)有不同)
將這兩項(xiàng)值輸入完成后,我們點(diǎn)擊下方的Add Binding , 將會(huì)彈出一個(gè)對(duì)話框,讓我們選擇所有添加的Bean的綁定屬性:

全選后點(diǎn)擊OK,我們會(huì)看到在左側(cè)的Bean元素下,會(huì)生成一組屬性綁定元素:

我們按照上述方法,再生成一個(gè)數(shù)組Bean lineItems以及一個(gè)LineItem的Bean。
這兩個(gè)Bean所對(duì)應(yīng)的Class以及Bean id 為:
數(shù)組Bean ,BeanId : lineItems , Class : example.trgmodel.LineItem[]
LineItem Bean , BeanId : lineItem , Class : example.trgmodel.LineItem
(溫馨小貼士:作為數(shù)組bean,其class的值一般是以[]作為結(jié)尾,說明該bean是一個(gè)數(shù)組類型,而class中的類名則是數(shù)組所存放的bean的類型)
完成后,分別使用Add Binding鍵,將對(duì)應(yīng)的綁定屬性都添加好。
最后的結(jié)果如下:

我們看到有很多小紅叉在這些Binding元素上,這是因?yàn)槲覀冞€沒有設(shè)置其對(duì)應(yīng)的源的Selector值。
(溫馨小貼士:關(guān)于selector請(qǐng)到smooks.org上查看相關(guān)的描述)
創(chuàng)建映射
現(xiàn)在讓我們切換到Graph頁(yè)面,我們會(huì)看到一組圖形:
現(xiàn)在我來對(duì)該圖做一個(gè)介紹:
最左側(cè)沒有標(biāo)題的圖形是我們?cè)O(shè)定的Input Data,它是以樹形結(jié)構(gòu)的形式展現(xiàn)的。
右側(cè)從上到下, Bean v1.2 這是我們?cè)贛essage Filter中添加的一個(gè)Bean v1.2 ,現(xiàn)在顯示在Graph頁(yè)中,它的子圖形是它所對(duì)應(yīng)的binding子項(xiàng)。請(qǐng)參照上一節(jié)。
現(xiàn)在我們可以試著選中最左側(cè)的圖形的根節(jié)點(diǎn)“Order”,然后拖拽它,我們會(huì)發(fā)現(xiàn)會(huì)有一根線出現(xiàn)。我們將它拖拽到Bean v1.2 (lineOrder)上后釋放,在這兩個(gè)圖形中出現(xiàn)了一條線。
這條線表示:Order 實(shí)例將會(huì)根據(jù)Bean v1.2 (lineOrder)中所描述的class,對(duì)應(yīng)生成一個(gè)實(shí)例。我們?cè)谇皫讉€(gè)章節(jié)“映射規(guī)則” 中已經(jīng)說明了。
現(xiàn)在我們根據(jù)映射規(guī)則,將輸入圖形對(duì)應(yīng)的點(diǎn)映射到Bean對(duì)應(yīng)的圖形上:
1.每一個(gè)Order類的實(shí)例對(duì)應(yīng)生成一個(gè)LineOrder的實(shí)例
操作:將order點(diǎn)連接到lineOrder上
2.Order實(shí)例中Header的customerName值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的customerName
操作:將customerName連接到 lineOrder.customerName上
3.Order實(shí)例中Header的customerNumber值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的customerId
操作:將customerNumber連接到 lineOrder.customerId上
4.Order實(shí)例中Header的proiority值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的proiority
操作:將proiority連接到 lineOrder.proiority上
5.每一個(gè)Order實(shí)例中的orderitems List的實(shí)例將對(duì)應(yīng)生成一個(gè)LineOrder中的lineItems數(shù)組對(duì)象,并且orderItem List中的OrderItem實(shí)例將會(huì)對(duì)應(yīng)生成一個(gè)LineItem對(duì)象,該LineItem的對(duì)象會(huì)被放置到生成的lineItems數(shù)組對(duì)象中。
操作:先將lineOrder.lineItems連接到lineItems圖形上,然后將orderItems連接到 lineItems上 , 并將lineItems的子圖形lineItems.LineItem連接到lineItem上
6.OrderItem實(shí)例中的productId值將賦值到對(duì)應(yīng)LineItem對(duì)象中的productCode
操作:將productId連接到 lineItem.productCode上
7.OrderItem實(shí)例中的price值將賦值到對(duì)應(yīng)LineItem對(duì)象中的unitPrice
操作:將price連接到 lineItem.unitPrice上
8.OrderItem實(shí)例中的quantity值將賦值到對(duì)應(yīng)LineItem對(duì)象中的unitQuantity
操作:將quantity連接到 lineItem.unitQuantity上
最后我們得到以下的圖形:

在這里,我們需要回到Message Filter頁(yè)面,選中Bean v1.2 (lineItems)節(jié)點(diǎn),將它的property值刪除,因?yàn)樗鶎?duì)應(yīng)的是數(shù)組,所以不應(yīng)該具有property值。
我們的映射工作已經(jīng)完成,還有一些類型匹配上的工作沒有做。
切換到Message Filter頁(yè),我們需要對(duì)一些屬性的類型進(jìn)行一些映射。
1.lineItem.unitPrice ,選中該元素,在它的Decoder中輸入BigDecimal
2.lineItem.unitQuantity , 險(xiǎn)種該元素,在她的Decoder中輸入Integer
3.lineOrder.priority , 選中該元素,點(diǎn)擊右鍵,選擇 Add Smooks Resource -> Decod Param Type,一個(gè)增加四組。
對(duì)應(yīng)的Name和Value分別是:
enumType :example.trgmodel.LineOrderPriority
LOW :NOT_IMPORTANT
MEDIUM : IMPORTANT
HIGH:VERY_IMPORTANT
保存文件。自此,我們的配置工作就完成了。
運(yùn)行轉(zhuǎn)換測(cè)試
先下載Main類,然后放到項(xiàng)目中,運(yùn)行該類,測(cè)試轉(zhuǎn)換是否成功。