Web服務的面包和黃油主要是由為了實現協作性需求的應用間的交換式的XML結構所組成。在這些交換繁盛之前,大多數XML數據必須忍受一系列的步驟,包括確認和轉換,大多數的這類問題可用像Schemas, DTD's, Xpath及 XSL等常用的XML方法解決。接著我們還將探究另一種技術,該技術是OASIS開發的,其能很好地與上述程序的大多數所互補,它的名字:CAM (Content Assembly Mechanism) 。
CAM的主要目標是通過特定的模塊的應用來定義,組織及驗證XML內容,其允許將語境業務規則應用於任何XML結構。在我們深入挖掘那些實際上組成語境業務規則的內容及它們有用的原因之前,你必須認識到的關於CAM的第一件事就是它與許多其他的你也許已經非常熟悉的驗證和轉換技術一樣根源於同樣的原則,如運用與Schemas 相似的Xpath和結構。所以在這個層面上,CAM是一個一種易於消化接受的方法,其不要求啟動一個新的學習曲線。
所以對於XML來說什麼是語境業務規則?這是可以應用於新的的XML數據之前用於一個實際的Web服務或應用的精心設計的邏輯。這些業務規則能依次用於執行一個特定的XML結構(確認)或轉換XML片段以適用於事先所決定的形式。接著就可以說,讓我們進一步觀察那些業務規則吧,包括他們的語法,他們是如何在一個CAM模塊中聲明的及一個實際的XML機構是如何運用CAM的。列表1.1展示了一個使用了CAM的XML文檔。
列表1.1 運用CAM模塊的XML結構
<?XML version='1.0'?>
<as:CAM CAMlevel="1" version="1.0"
XMLns:as="http://www.oasis-open.org/committees/cam" >
<as:Header>
<as:Description>
Sample CAM template for Purchase Order
</as:Description>
<as:Owner>CAM Example</as:Owner>
<as:Version>0.1</as:Version>
<as:DateTime>2007-03-06T09:48:00</as:DateTime>
<as:Parameters>
<as:Parameter name="QuickBooks"
values="'true'|'false'"
default="false" use="local"/>
</as:Parameters>
</as:Header>
<as:AssemblyStructure>
<as:Structure ID="W3C-PO" taxonomy="XML" reference="">
<PurchaSEOrder orderDate="%1999-05-20%">
<shipTo type="%US%">
<name>%Alice Smith%</name>
<street>%123 Maple Street%</street>
<city>%Mill Valley%</city>
<state>%CA%</state>
<zip>%90952%</zip>
</shipTo>
<shipDate>%1999-05-25%</shipDate>
<comment>%
Get these use express shipping
%</comment>
<Items>
<Item pno="%333-333%">
<productName>%
Lawnmower, model BUZZ-1
%</productName>
<quantity>%1%</quantity>
<price>%148.95%</price>
<comment>%
Please confirm this is
the electric model
%</comment>
</Item>
</Items>
</PurchaSEOrder>
</as:Structure>
</as:AssemblyStructure>
</as:CAM>
上個XML結構在文檔的一開始就引入了CAM命名空間,並將其應用為:限定詞圍繞其進行了各種聲明。除了運用這個特殊的命名空間外,其他唯一值得一提的就是在特定的XML標記內符號%被用於劃定字符數據的界限,所有這些都被CAM用於識別內容數據發生的地方。現在讓我們看看列表1.2,其說明了一部分CAM模塊用於執行在前述文檔中的特定規則。
列表1.2 部分CAM模塊
<as:BusinessUseContext>
<as:Rules>
<as:default>
<as:context>
<as:constraint action="makeRepeatable(//Items/Item)"/>
<as:constraint action="makeOptional(//Item/comment)"/>
<as:constraint action="setLength(//shipTo/state,2)"/>
<as:constraint action="setDateMask(//PurchaSEOrder/shipDate,YYYY-MM-DD)"/>
<as:constraint action="makeOptional(//PurchaSEOrder/comment)"/>
<as:constraint action="restrictValues(//shipTo/@type,'US'| 'CA'| 'MX', 'US')"/>
<as:constraint action="setDateMask(//PurchaSEOrder/@orderDate,YYYY-MM-DD)"/>
<as:constraint action="setNumberMask(//Item/@pno,###-###)"/>
<as:constraint action="setNumberMask(//Item/quantity,###)"/>
<as:constraint action="setNumberMask(//Item/price,####.##)"/>
<as:constraint condition="//Item/@pno = 123-678" action="restrictValues(//shipTo/state,'WA')">
<as:annotation> <as:documentation type="documentation">
Can only ship item 123-678 to Washington State </as:documentation> </as:annotation>
</as:constraint>
<as:constraint condition="$QuickBooks = true" action="excludeElement(//Item/comment)" />
</as:context>
</as:default>
</as:Rules>
</as:BusinessUseContext>
對於這些CAM規則需要認識的第一件事就是這裡的語法是基於Xpath——比如說//Item/@pno,其是Xpath行話中用來說明項目標記的pno屬性的。更重要的是,盡管如此,那些CAM規則所要達到的事情。這裡有一個XML文檔的使用樣式的引言——比如說makeRepeatable, makeOptional及restrictValues——為更好的闡釋驗證和修飾XML數據的條件。針對這種情況,我們發現一個規則,其闡述了//Item/@pno標記值是否與123-678相符。它也驗證標記//shipTo/state是否與WA等價,而且我們還發現了另一個規則,其闡述了在XML文檔中的$QuickBooks變量是否為真,CAM應該禁止XML標記//Item/comment。
為了將以前的CAM模塊和XML文檔應用於實際,你將需要安裝一個CAM引擎,其是為了保持驗證和轉換過程粘著性的軟件基礎設施。加之,為了減少創造CAM模塊的負擔,一個XML編輯者在CAM項目的開發生命周期中也是有所幫助的。幸運的是,CAM已經設法成長為一個圍繞那些區域和使Java CAM Engine and CAM editor能被免費下載兩個方面的很強大的開放源社群。
現在,與探究上述兩個CAM片段的配置和使用細節相反——這之中的大多數已在文檔中有所說明——讓我們提出一個與CAM效用相關的更高層次的問題:軟件的另一模塊的實際引入——閱讀CAM引擎——對於SOA項目的已經在增加的復雜性是以個方便的或是實際的方法?正如它所展現的,對於那些服務來說,已經持續地改變XML驗證和轉換需求,CAM提供了一個新的觀察角度,而且能減少復雜性。
與XML的經典驗證和轉換技術相關的問題是在一種或是另一種形式下,它們將嚴重依賴底層編程環境,為了應用一個XSL樣式表或是簡化運用應用邏輯在XML Schemas所支持的式樣之外以執行驗證邏輯開始具體編程說明的另一種形式。在這些情況下,XML驗證或是轉換需求的持續變化會很快變為一個負擔,因為固有的緊耦合,而不管你是運用像CAM這樣一個更加松散耦合的機構的方法來達到——後者是一個高度觊觎的SOA特點。
雖然CAM引入了一個額外的層次以使XML結構的驗證和轉換成為可能,將這樣一個間接的層次結合進你的Web服務項目將會使那些要求對精細的XML內容規則給予支持的SOA項目提高一個出色的解決方案。加之,CAM是在OASIS的指導下進行開發的,OASIS開發了大量的其他Web服務標准,而且你能確信CAM將會在你的或是圍繞你的Web服務項目繼續開展下去。