English Version
Smooks Tools 是一個針對Smooks數據轉換平臺而開發的一個工具,整個工具是基于Eclipse的。
工具目前主要是由兩個編輯器組成:1.Smooks configuration file編輯器,也就是Smooks Configuration Editor。2.EDI消息映射配置文件編輯器,EDI Message Mapping Editor。
本文將簡要介紹一下Smooks configuration editor。
Quick Start
為了能夠快速熟悉一下整個編輯器,我將通過一個QuickStart作為整片文章的開始。本例將講述怎么使用Smooks tools創建,配置Java-to-Java轉換所需的配置文件,以及如何編寫Smooks代碼進行運行該例。
下載以及安裝
首先需要先下載Eclipse以及Smooks工具的Plugin:
Eclipse WTP 3.1 :http://www.eclipse.org/downloads/
Smooks Tools : http://www.jboss.org/tools/download.html
下載好Eclipse WTP后,解壓縮到某個目錄下,然后將smooks tools壓縮包解壓后,找到./plugins文件夾,將該文件夾下的jar文件復制到Eclipse WTP對應的文件夾(./eclipse/plugins)下。
然后我們需要去到Smooks.org下載Smooks 1.2.1。
完成后啟動Eclipse,在菜單欄上選擇:Help -> About Eclipse SDK -> Installation Details -> Plug-ins ,在列表中我們會看到Smooks tools所對應的3個plugin:
這說明Smooks tools已經安裝成功了。
新建Smooks項目
在eclipse中我們新建一個Java工程,在項目下新建一個libs文件夾,然后將所下載的Smooks 1.2.1中的libraries復制到該文件夾下,并將這些libraries加入到java項目的classpath當中(右鍵點擊項目-> Properties -> Java Build Path -> Libraries -> Add JARs... )
然后在該項目中創建我們所要轉換的目標Java類以及轉換輸入Java類。(這些Java類以及代碼都來自Smooks 1.2.1中的Java-to-Java example,讀者可以去自行下載該例,或者直接從本文給出的鏈接中下載)。
映射規則
在使用Smooks tools工作之前,我們需要先搞清楚映射的規則:
轉換輸入Java類example.sourcemodel.Order類,具有以下結構:
1.Order類本身
2.Order包含有一個Header類,以及一個List類
3.Header類具有customerName,customerNumber,priority三個屬性
4.List中將存放的是一個OrderItem類
5.OrderItem具有price,productId,quantity三個屬性
讓我們看看轉換目標類LineOrder:

該結構為:
1.LineOrder類包含有customerId,customerName,priority 三個屬性以及一個lineItems的數組。
2.數據lineItems是由LineItem組成
3.LineItem具有productCode,unitPrice,unitQuantity三個屬性。
了解完轉換輸入以及轉換目標的結構后,我們將要以下列的規則來將轉換輸入映射到轉換目標中:
1.每一個Order類的實例對應生成一個LineOrder的實例
2.Order實例中Header的customerName值將賦值到對應LineOrder實例中的customerName
3.Order實例中Header的customerNumber值將賦值到對應LineOrder實例中的customerId
4.Order實例中Header的proiority值將賦值到對應LineOrder實例中的proiority
5.每一個Order實例中的orderitems List的實例將對應生成一個LineOrder中的lineItems數組對象,并且orderItem List中的OrderItem實例將會對應生成一個LineItem對象,該LineItem的對象會被放置到生成的lineItems數組對象中。
6.OrderItem實例中的productId值將賦值到對應LineItem對象中的productCode
7.OrderItem實例中的price值將賦值到對應LineItem對象中的unitPrice
8.OrderItem實例中的quantity值將賦值到對應LineItem對象中的unitQuantity
請仔細閱讀以上規則后進入到下一節。
新建Smooks configuration file
我們選中所建項目的src文件夾,點右鍵,選擇New -> Other... -> Smooks -> Smooks Configuratin File.
然后點擊Next > ,選擇所要生成smooks config file所在的文件夾,選擇到所生成項目的src下,然后點擊Finish完成配置文件的創建。
我們將會看到新建的smooks conig file , 并且該文件自動被Smooks Configuration Editor打開。
添加輸入數據
在該編輯器的下方有一組tab按鈕,分別是:
Overview, Reader , Message Filter ,Graph , Source
首先第一步,我們需要將轉換輸入Order類添加進來,點擊Reader tab,切換到Reader/Input編輯頁。
在該編輯頁的下方,我們可以看到一個Input Data的列表,點擊該列表右側的Add按鈕,根據向導,添加一個Java輸入:
確定后點擊Finish,Order類將被作為輸入數據添加進來。
添加目標Bean
完成輸入數據的添加后,我們切換到Message Filter頁。
點擊Add按鈕,將有一個向導頁出現。
我們選擇Java Binding v1.2 -> Bean v1.2 然后確定,添加一個Bean:
這時我們會發現在Message Filter頁面中增加一個Bean v1.2項,選中該項,在頁面的右側將會顯示出它可配置的屬性:
在bean Id 處,我們輸入lineOrder,作為該Bean的id,在Class處我們點擊Browse按鈕,選擇LineOrder類作為該Bean的Class。
(溫馨小貼士:選中Class的文本框后,可以輸入字符,然后按Alt+/ 鍵,將會有內容幫助窗口彈出,這樣的可以提高效率。如果輸入Alt + /無效果,可以使用Ctrl + space,這是Eclipse的內容幫助快捷鍵,在不同的平臺上會有不同)
將這兩項值輸入完成后,我們點擊下方的Add Binding , 將會彈出一個對話框,讓我們選擇所有添加的Bean的綁定屬性:
全選后點擊OK,我們會看到在左側的Bean元素下,會生成一組屬性綁定元素:
我們按照上述方法,再生成一個數組Bean lineItems以及一個LineItem的Bean。
這兩個Bean所對應的Class以及Bean id 為:
數組Bean ,BeanId : lineItems , Class : example.trgmodel.LineItem[]
LineItem Bean , BeanId : lineItem , Class : example.trgmodel.LineItem
(溫馨小貼士:作為數組bean,其class的值一般是以[]作為結尾,說明該bean是一個數組類型,而class中的類名則是數組所存放的bean的類型)
完成后,分別使用Add Binding鍵,將對應的綁定屬性都添加好。
最后的結果如下:
我們看到有很多小紅叉在這些Binding元素上,這是因為我們還沒有設置其對應的源的Selector值。
(溫馨小貼士:關于selector請到smooks.org上查看相關的描述)
創建映射
現在讓我們切換到Graph頁面,我們會看到一組圖形:

現在我來對該圖做一個介紹:
最左側沒有標題的圖形是我們設定的Input Data,它是以樹形結構的形式展現的。
右側從上到下, Bean v1.2 這是我們在Message Filter中添加的一個Bean v1.2 ,現在顯示在Graph頁中,它的子圖形是它所對應的binding子項。請參照上一節。
現在我們可以試著選中最左側的圖形的根節點“Order”,然后拖拽它,我們會發現會有一根線出現。我們將它拖拽到Bean v1.2 (lineOrder)上后釋放,在這兩個圖形中出現了一條線。
這條線表示:Order 實例將會根據Bean v1.2 (lineOrder)中所描述的class,對應生成一個實例。我們在前幾個章節“映射規則” 中已經說明了。
現在我們根據映射規則,將輸入圖形對應的點映射到Bean對應的圖形上:
1.每一個Order類的實例對應生成一個LineOrder的實例
操作:將order點連接到lineOrder上
2.Order實例中Header的customerName值將賦值到對應LineOrder實例中的customerName
操作:將customerName連接到 lineOrder.customerName上
3.Order實例中Header的customerNumber值將賦值到對應LineOrder實例中的customerId
操作:將customerNumber連接到 lineOrder.customerId上
4.Order實例中Header的proiority值將賦值到對應LineOrder實例中的proiority
操作:將proiority連接到 lineOrder.proiority上
5.每一個Order實例中的orderitems List的實例將對應生成一個LineOrder中的lineItems數組對象,并且orderItem List中的OrderItem實例將會對應生成一個LineItem對象,該LineItem的對象會被放置到生成的lineItems數組對象中。
操作:先將lineOrder.lineItems連接到lineItems圖形上,然后將orderItems連接到 lineItems上 , 并將lineItems的子圖形lineItems.LineItem連接到lineItem上
6.OrderItem實例中的productId值將賦值到對應LineItem對象中的productCode
操作:將productId連接到 lineItem.productCode上
7.OrderItem實例中的price值將賦值到對應LineItem對象中的unitPrice
操作:將price連接到 lineItem.unitPrice上
8.OrderItem實例中的quantity值將賦值到對應LineItem對象中的unitQuantity
操作:將quantity連接到 lineItem.unitQuantity上
最后我們得到以下的圖形:
在這里,我們需要回到Message Filter頁面,選中Bean v1.2 (lineItems)節點,將它的property值刪除,因為它所對應的是數組,所以不應該具有property值。
我們的映射工作已經完成,還有一些類型匹配上的工作沒有做。
切換到Message Filter頁,我們需要對一些屬性的類型進行一些映射。
1.lineItem.unitPrice ,選中該元素,在它的Decoder中輸入BigDecimal
2.lineItem.unitQuantity , 險種該元素,在她的Decoder中輸入Integer
3.lineOrder.priority , 選中該元素,點擊右鍵,選擇 Add Smooks Resource -> Decod Param Type,一個增加四組。
對應的Name和Value分別是:
enumType :example.trgmodel.LineOrderPriority
LOW :NOT_IMPORTANT
MEDIUM : IMPORTANT
HIGH:VERY_IMPORTANT
保存文件。自此,我們的配置工作就完成了。
運行轉換測試
先下載Main類,然后放到項目中,運行該類,測試轉換是否成功。