• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 181, 文章 - 2, 評論 - 85, 引用 - 0
            數據加載中……

            IBM WebSphere 開發者技術期刊: 使用 Rational Application Developer 和 WebSphere Application Server 來加速基于 XML 的 SOA 的 JSF 開發——第 3 部分

            本文是提出了加快基于 XML 的面向服務的體系結構(Service Oriented Architecture,SOA)應用程序表示開發的解決方案系列文章的第 3 部分。這種解決方案包括 Eclipse 功能,可以生成靜態類型的用于 XSD Schema 的服務對象數據(Service Data Object,SDO),并提供了在表示元素數據與 XML 數據相互轉換中使用 SDO 的運行框架。第三部分薈萃了操作 SDO 實例的通常使用的技術。

            前言

            這個由五部分組成的系列文章提出了能夠加快基于 XML 的 SOA 應用程序表示開發的解決方案,這種解決方案包括 Eclipse 功能,可以生成靜態類型的用于 XSD Schema 的服務對象數據(Service Data Object,SDO),并提供了在表示元素數據與 XML 數據相互轉換中使用 SDO 的運行框架。在該系列文獻的

            • 第 1 部分 中,我們經歷了通過使用提供的插件集來向每個指定的 XML schema 中的服務傳遞信息的簡單 JSF 應用程序的整個開發過程,我們使用的應用程序場景進行了一次服務調用——發出一個 XML 請求及收到一個 XML 響應。這個應用程序說明了主從復合結構的數據對象視圖,連同分頁及分類的能力。在
            • 第 2 部分 中,我們增強了在 第 1 部分 中開發的解決方案,使之包括創建、更新和刪除功能,包括用本地附加的變量及基本的轉換來自定義生成 SDO。我們舉例說明多 schema 模型、對于單一頁面中多個請求及響應的場景,并且說明了綁定 XML 數據的 JSF 下拉式控制。
            • 在第三部分中,我們將提供一些在 IBM? Rational? Application Developer V6 中使用 XML SDO 以及合計方法使用的一些技巧,比如總和、平均數和轉化特寫提高的一些其他方法。

            IBM Rational Application Developer V6(后面稱為 Application Developer)和 IBM Websphere? Application Server V6 是利用這些轉化特性的必備條件。







            安裝 XSD SDO Transform 特性

            如果想安裝 XSD SDO Transform 特性,請參考第一部分中提供的詳細步驟。







            XSD SDO Transform 特性內容

            XSD SDO Transform 特性包含從 XSD schema 中生成 SDO 包的工件,以及一些用來將 SDP 包轉化為 XML 實例文檔(或相反)的框架組件。

            1. 創建 SDO Package Action
              XSD 資源中的這個動作可以從 XSD schema 生成 SDP 包。
              圖 1. 創建 SDO 包
              創建 SDO 包
            2. dw.ibm.etools.xsd.sdo.xmltransformservice.XMLTransformServiceFactory
              這個類提供了將 SDO 包實例轉化為 XML 實例文檔(或相反)的 API。
            3. dw.ibm.etools.xsd.sdo.xmltransforms.util.ObjectUtil
              這個類提供了操作 SDO 的合計和輔助方法。







            導入項目交換

            將項目交換 xyzinsurancetestclient_pi.zip下載文件導入到 Application Developer 工作區中。結果,項目 XYZInsuranceTestClient 被導入了進來(圖 2)。這個 Java? 項目包含一個測試 Java 類,里面有所有下面描述到的方法。為了簡化的目的,SDO 包被包含在了 Java 項目中,并且 SDO 運行時體現在其類路徑中。你可以選擇參考包含 SDO 包的 Web 項目,或者在包含 SDO 包的項目中創建這個 Java 類。提供的 Eclipse Modeling Framework(EMF) JAR 文件, emf.jar,或者 EMF Web Site 中一樣的 JAR 文件(ecore.sdo.jar,commonj.sdo.jarecore.xmi.jar,ecore.jar,common.jar),應該添加到項目的類路徑和構建路徑中。文件 xsdsdotransform.jar 也被添加到項目中。

            稍后,我們將描述使用 Application Developer 提供的 SDO 生成器特性來從一個獨立 Java 項目中的 XSD 來創建 SDO 包。


            圖 2. 導入項目交換
            導入項目交換






            分析 SDO

            在這一部分中,我們將分析 Java 客戶端,這個客戶端說明了用來操作生成的 SDO 包的 API。我們也會看一下 XMLTransformServiceFactory 中使用的其他的 API,以及工具類 ObjectUtil 中提供的合計類。

            正如上一篇文章圖示的那樣,XSD 的 SDO 包名是由 schema 定義中的 targetNamespace 聲明來決定的(圖 3)。生成的 SDO 包包含一個 DocumentRoot 類,該類作為 schema中定義的所有類型的根容器(圖 4)。Schema 中定義的每個類型都生成了其相應的 Java 類。這個生成的 Java 類包含了所有為 XSD 類型定義的元素和屬性(作為 Java 類型)、一個所有多值元素的清單以及任何單個值元素的引用。


            圖 3. TargetNamespace 定義
            TargetNamespace 定義

            圖 4. 生成的 SDO java 包
            生成的 SDO java 包

            為 XSD schema 類型生成的類在包注冊表中被初始化,這樣來自于或者到 Java 類型的 XSD 類型在轉化發生的時候可以被識別。在生成大量類的大型 schema 的情況下,該初始化代碼通過加載 EMF 資源來執行。在較小的 schema 情況下(取決于類、屬性等的總數的估計),該初始化代碼在包類本身中生成。

            同樣還為 Java 類中的 XSD 引用類型生成了 create<Element Name> 方法。這些 API 可以用來創建任何生成的 SDO Java 類型的實例。如清單 1 所示,一個 brokerType 的實例被創建并且添加到包含在 BrokerServiceType SDO 實例中的清單中。

            清單 1

            												
            														public void TestCreateReference(){
            	DocumentRoot root = DocumentRoot)XMLTransformServiceFactory.INSTANCE.create
            		(BrokerservicePackage.eINSTANCE.getNsURI());
            	root.getXMLNSPrefixMap().put("", BrokerservicePackage.eINSTANCE.getNsURI());
            	xyz.brokerservice.BrokerServiceType bs = root.createBrokerService();
            	BrokerType bType  = bs.createBroker();
            	bType.setBrokerId("111");
            	bType.setFirstName("Joe");
            	System.out.println(XMLTransformServiceFactory.INSTANCE.convert((DataObject)root));
            }
            												
            										

            該生成的包包含用來創建或者訪問用于所有類型和屬性的 Java 類型的方法(清單 2)。

            清單 2

            												
            														public void TestTypeCreation(){
            	EClass brokerType = BrokerservicePackage.eINSTANCE.getBrokerType();
            	System.out.println("Type Name: " + brokerType.getName());
            }
            												
            										

            生成的工廠類提供了一些 API,用來創建任何生成的 SDO Java 類型的實例。正如在清單 3 中所見的那樣,為了創建一個 brokerType 的實例,你可以使用 createBrokerType API。這個新創建的實例沒有被添加到任何清單或者引用中,其如清單 1 所示的那些相關 API 那樣。setBroker API 用來設置 brokerServiceType 中創建的新實例?;谛枨?,你可以使用任何一個這里描述的實例創建 API。

            Listing 3

            												
            														public void TestInstanceCreation(){
            	DocumentRoot root = DocumentRoot)XMLTransformServiceFactory.INSTANCE.create
            		(BrokerservicePackage.eINSTANCE.getNsURI());
            	root.getXMLNSPrefixMap().put("", BrokerservicePackage.eINSTANCE.getNsURI());
            	xyz.brokerservice.BrokerServiceType bs = root.createBrokerService();
            	BrokerType bType  = BrokerserviceFactory.eINSTANCE.createBrokerType();	bs.setBroker(bType);
            	bType.setBrokerId("111");
            	bType.setFirstName("Joe");
            	System.out.println(XMLTransformServiceFactory.INSTANCE.convert((DataObject)root));
            }
            												
            										

            想要了解 EMF 框架更多的細節,請參閱 Eclipse Modeling Framework Overview。







            創建 XML 請求

            再上一篇文章中,我們看到了 XMLTransformFactory 加載和轉化 API 如何被用來從 XML 流中序列化一系列 SDO 對象(或相反)。也有一些情況,你需要創建一個 SDO 對象(或一系列 SDO 對象)新的實例,并且將其序列化到一個 XML 中。XMLTransformFactory 中的創建 API 可以用來做這些,如清單 4a 所示。該方法的輸出顯示在清單 4b 中。

            清單 4a. 方法

            												
            														public void TestNewDocumentCreation(){
            
            														
            																
            																		
            																					DocumentRoot root = DocumentRoot)XMLTransformServiceFactory.INSTANCE.create
            		(BrokerservicePackage.eINSTANCE.getNsURI());
            																		
            	xyz.brokerservice.BrokerServiceType bs = root.createBrokerService();
            	BrokerType bType  = bs.createBroker();
            	bType.setBrokerId("111");
            	bType.setFirstName("Joe");
            	System.out.println(XMLTransformServiceFactory.INSTANCE.convert((DataObject)root));
            }
            
            														
            												
            										

            清單 4b. 輸出

            												
            														<?xml version="1.0" encoding="ASCII"?>
            <brokerservice:brokerService
            xmlns:brokerservice="http:///xyz.brokerservice.ecore">
            <brokerservice:broker brokerId="111">
            <brokerservice:firstName>Joe</brokerservice:firstName>
            </brokerservice:broker>
            </brokerservice:brokerService>
            												
            										

            改變序列化的 XML 的命名空間

            上面例子中序列化的 XML 包含所有用于新的命名空間聲明的合格的元素。如果消費這些生成的 XML 的后臺系統不不能夠處理這樣的元素,可以配置序列化器生成一個默認的命名空間聲明。雖然不推薦,但是在一些特定的情況下這是可行的。下面顯示了方法(清單 5a)和輸出(清單 5b)。

            清單 5a. 方法

            												
            														public void TestNamespaceRemove(){
            	DocumentRoot root = DocumentRoot)XMLTransformServiceFactory.INSTANCE.create
            		(BrokerservicePackage.eINSTANCE.getNsURI());
            	 root.getXMLNSPrefixMap().put("", BrokerservicePackage.eINSTANCE.getNsURI());
            	xyz.brokerservice.BrokerServiceType bs = root.createBrokerService();
            	BrokerType bType  = bs.createBroker();
            	bType.setBrokerId("111");
            	bType.setFirstName("Joe");
            	System.out.println(XMLTransformServiceFactory.INSTANCE.convert((DataObject)root));
            }
            												
            										

            清單 5b. 輸出

            												
            														<?xml version="1.0" encoding="ASCII"?>
            <brokerService xmlns="http:///xyz.brokerservice.ecore">
              <broker brokerId="111">
                <firstName>Joe</firstName>
              </broker>
            </brokerService>
            												
            										

            處理 schema 變更

            讓我們思考一個場景,生成 XML 響應的服務被更一遍來適應新的 schema 定義(BrokerServiceV2.xsd,包含在 xsd_sdo_soa_part3_listings.zip下載文件),并且這個 schema 定義比用來生成 SDO 包的包含更多的元素或者屬性。XMLTransformServiceFactory 使用的序列化器被預配置來記錄任何新的不屬于初始 schema 的元素和屬性。這個“Version 2” XML 響應(BrokerDetailResponseV2.xml,包含在 xsd_sdo_soa_part3_listings.zip下載文件)可以被加載到使用“Version 1” schema 生成的 SDO 包中。如果這個包被序列化為 XML,它將包含在加載時記錄的可選的元素,如圖 5 所示。


            圖 5. BrokerServiceV1.xsd
            BrokerServiceV1.xsd

            清單 6. BrokerDetailResponseV1.xml

            												
            														<?xml version="1.0" encoding="UTF-8"?>
            <brokerService xmlns="http:///xyz.brokerservice.ecore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
            <broker brokerId="000-00-9999">
            	<firstName>Narinder</firstName>
            	<lastName>Makin</lastName>
            	<client clientId="001-00-9999">
            		<firstName>Dan</firstName>
            		<lastName>Moore</lastName>
            		<dateOfBirth>1967-08-13</dateOfBirth>
            		<currentAddress>
            			<street>113 Oak Pine St.</street>
            			<city>Santa Clara</city>
            			<state>LA</state>
            			<zip>91929</zip>
            			<country>US</country>
            		</currentAddress>
            		<permanentAddress>
            			<street>123 Demi Lane</street>
            			<city>Cary</city>
            			<state>NC</state>
            			<zip>22999</zip>
            			<country>US</country>
            		</permanentAddress>
            		<policy policyId="L000000000">
            			<policyName>Life</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>100000.00</policyAmount>
            			<policyDescription>Life Insurance policy includes any accidental damages.</policyDescription>
            		</policy>
            		<policy policyId="H000000000">
            			<policyName>House</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>50000.00</policyAmount>
            			<policyDescription>Home Insurance</policyDescription>
            		</policy>
            		<policy policyId="C000000001">
            			<policyName>Car 1</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>15000.00</policyAmount>
            			<policyDescription>Car Insurance - Ferrari 2004 - Primary Car </policyDescription>
            		</policy>
            		<policy policyId="C000000002">
            			<policyName>Car 2</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>5000.00</policyAmount>
            			<policyDescription>Car Insurance - Lexus 2003 - Secondary Car </policyDescription>
            		</policy>
            		<policy policyId="B000000002">
            			<policyName>Restaurant</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>25000.00</policyAmount>
            			<policyDescription>Business Insurance - Restaurant</policyDescription>
            		</policy>
            	</client>
            	<client clientId="002-00-9999">
            		<firstName>Tom</firstName>
            		<lastName>Cross</lastName>
            		<dateOfBirth>1970-11-11</dateOfBirth>
            		<currentAddress>
            			<street>113 Duke St.</street>
            			<city>Shelton</city>
            			<state>CT</state>
            			<zip>08989</zip>
            			<country>US</country>
            		</currentAddress>
            		<permanentAddress>
            			<street>123 Lex Lane</street>
            			<city>Fairfield</city>
            			<state>NY</state>
            			<zip>09833</zip>
            			<country>US</country>
            		</permanentAddress>
            		<policy policyId="H100000000">
            			<policyName>House</policyName>	
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>2000.00</policyAmount>
            			<policyDescription>Home Insurance</policyDescription>
            		</policy>
            		<policy policyId="L100000000">
            			<policyName>Life</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>100000.00</policyAmount>
            			<policyDescription>Life Insurance</policyDescription>
            		</policy>
            		<policy policyId="C100000001">
            			<policyName>Car 1</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>2000.00</policyAmount>
            			<policyDescription>Car Insurance - Camry 2004 - Primary Car </policyDescription>
            		</policy>
            	</client>
            </broker>
            </brokerService>
            
            												
            										

            繼續我們的場景,為了為來自另一個客戶端的安全服務請求服務,一個新的可選屬性,securityToken,以及一個新的可選的元素,ssn,被添加到“Version 2” brokerservice 的 clientType 定義中。一個需求指示在已有的、使用舊的 XSD 為其生成 SDO 包的客戶端應用程序中不需要做任何的修改。XMLTransformFactory 具有一定的格式,這樣 XML 流中呈現的任何未知的元素將被記錄到 SDO 實例中。當這些實例被序列化時,這些被記錄的未知元素(ssn 和 securityToken)也會被序列化。


            圖 6. BrokerServiceV2.xsd 修改
            BrokerServiceV2.xsd Modifications

            清單 7. BrokerDetailResponseV2.xml

            												
            														<?xml version="1.0" encoding="UTF-8"?>
            <brokerService xmlns="http:///xyz.brokerservice.ecore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
            <broker brokerId="000-00-9999">
            	<firstName>Narinder</firstName>
            	<lastName>Makin</lastName>
            	<client clientId="001-00-9999" securityToken="abcded">
            		<firstName>Dan</firstName>
            		<lastName>Moore</lastName>
            		<dateOfBirth>1967-08-13</dateOfBirth>
            		<currentAddress>
            			<street>113 Oak Pine St.</street>
            			<city>Santa Clara</city>
            			<state>LA</state>
            			<zip>91929</zip>
            			<country>US</country>
            		</currentAddress>
            		<permanentAddress>
            			<street>123 Demi Lane</street>
            			<city>Cary</city>
            			<state>NC</state>
            			<zip>22999</zip>
            			<country>US</country>
            		</permanentAddress>
            		<policy policyId="L000000000">
            			<policyName>Life</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>100000.00</policyAmount>
            			<policyDescription>Life Insurance policy includes any accidental damages.</policyDescription>
            		</policy>
            		<policy policyId="H000000000">
            			<policyName>House</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>50000.00</policyAmount>
            			<policyDescription>Home Insurance</policyDescription>
            		</policy>
            		<policy policyId="C000000001">
            			<policyName>Car 1</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>15000.00</policyAmount>
            			<policyDescription>Car Insurance - Ferrari 2004 - Primary Car </policyDescription>
            		</policy>
            		<policy policyId="C000000002">
            			<policyName>Car 2</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>5000.00</policyAmount>
            			<policyDescription>Car Insurance - Lexus 2003 - Secondary Car </policyDescription>
            		</policy>
            		<policy policyId="B000000002">
            			<policyName>Restaurant</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>25000.00</policyAmount>
            			<policyDescription>Business Insurance - Restaurant</policyDescription>
            		</policy>
            		<ssn>1234567</ssn>
            	</client>
            	<client clientId="002-00-9999"  securityToken="xyz">
            		<firstName>Tom</firstName>
            		<lastName>Cross</lastName>
            		<dateOfBirth>1970-11-11</dateOfBirth>
            		<currentAddress>
            			<street>113 Duke St.</street>
            			<city>Shelton</city>
            			<state>CT</state>
            			<zip>08989</zip>
            			<country>US</country>
            		</currentAddress>
            		<permanentAddress>
            			<street>123 Lex Lane</street>
            			<city>Fairfield</city>
            			<state>NY</state>
            			<zip>09833</zip>
            			<country>US</country>
            		</permanentAddress>
            		<policy policyId="H100000000">
            			<policyName>House</policyName>	
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>2000.00</policyAmount>
            			<policyDescription>Home Insurance</policyDescription>
            		</policy>
            		<policy policyId="L100000000">
            			<policyName>Life</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>100000.00</policyAmount>
            			<policyDescription>Life Insurance</policyDescription>
            		</policy>
            		<policy policyId="C100000001">
            			<policyName>Car 1</policyName>
            			<policyStartDate>2004-01-01</policyStartDate>
            			<policyEndDate>2005-01-01</policyEndDate>
            			<policyAmount>2000.00</policyAmount>
            			<policyDescription>Car Insurance - Camry 2004 - Primary Car </policyDescription>
            		</policy>
            		<ssn>12345678</ssn>
            	</client>
            </broker>
            </brokerService>
            
            												
            										

            在清單 8 的代碼里面,加載了 BrokerDetailResponseV2.xml 并修改了 firstName。這時該數據對象被序列化回 XML。序列化的 XML(清單)包含了修改,以及在加載過程中記錄的可選的 ssn 和 securityToken 元素。

            清單 8

            												
            														public void TestSchemaChange()
            {
            xyz.brokerservice.DocumentRoot loaded = ( xyz.brokerservice.DocumentRoot)
            	XMLTransformServiceFactory.INSTANCE.loadFile("./input/brokerDetailResponseV2.xml");
            xyz.brokerservice.BrokerServiceType bs = loaded.getBrokerService();
            bs.getBroker().setFirstName("NEW NAME");
            System.out.println(XMLTransformServiceFactory.INSTANCE.convert((DataObject)loaded))     
            }
            												
            										

            清單 9

            												
            														<?xml version="1.0" encoding="UTF-8"?>
            <brokerService xmlns="http:///xyz.brokerservice.ecore">
              <broker brokerId="000-00-9999">
                <firstName>NEW NAME</firstName>
                <lastName>Makin</lastName>
                <client clientId="001-00-9999" securityToken="abcded">
                  <firstName>Dan</firstName>
                  <lastName>Moore</lastName>
                  <dateOfBirth>1967-08-13</dateOfBirth>
                  <currentAddress>
                    <street>113 Oak Pine St.</street>
                    <city>Santa Clara</city>
                    <state>LA</state>
                    <zip>91929</zip>
                    <country>US</country>
                  </currentAddress>
                  <permanentAddress>
                    <street>123 Demi Lane</street>
                    <city>Cary</city>
                    <state>NC</state>
                    <zip>22999</zip>
                    <country>US</country>
                  </permanentAddress>
                  <policy policyId="L000000000">
                    <policyName>Life</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>100000.00</policyAmount>
                    <policyDescription>Life Insurance policy includes any accidental damages.</policyDescription>
                  </policy>
                  <policy policyId="H000000000">
                    <policyName>House</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>50000.00</policyAmount>
                    <policyDescription>Home Insurance</policyDescription>
                  </policy>
                  <policy policyId="C000000001">
                    <policyName>Car 1</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>15000.00</policyAmount>
                    <policyDescription>Car Insurance - Ferrari 2004 - Primary Car </policyDescription>
                  </policy>
                  <policy policyId="C000000002">
                    <policyName>Car 2</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>5000.00</policyAmount>
                    <policyDescription>Car Insurance - Lexus 2003 - Secondary Car </policyDescription>
                  </policy>
                  <policy policyId="B000000002">
                    <policyName>Restaurant</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>25000.00</policyAmount>
                    <policyDescription>Business Insurance - Restaurant</policyDescription>
                  </policy>
                  <ssn>1234567</ssn>
                </client>
                <client clientId="002-00-9999" securityToken="xyz">
                  <firstName>Tom</firstName>
                  <lastName>Cross</lastName>
                  <dateOfBirth>1970-11-11</dateOfBirth>
                  <currentAddress>
                    <street>113 Duke St.</street>
                    <city>Shelton</city>
                    <state>CT</state>
                    <zip>08989</zip>
                    <country>US</country>
                  </currentAddress>
                  <permanentAddress>
                    <street>123 Lex Lane</street>
                    <city>Fairfield</city>
                    <state>NY</state>
                    <zip>09833</zip>
                    <country>US</country>
                  </permanentAddress>
                  <policy policyId="H100000000">
                    <policyName>House</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>2000.00</policyAmount>
                    <policyDescription>Home Insurance</policyDescription>
                  </policy>
                  <policy policyId="L100000000">
                    <policyName>Life</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>100000.00</policyAmount>
                    <policyDescription>Life Insurance</policyDescription>
                  </policy>
                  <policy policyId="C100000001">
                    <policyName>Car 1</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>2000.00</policyAmount>
                    <policyDescription>Car Insurance - Camry 2004 - Primary Car </policyDescription>
                  </policy>
                  <ssn>12345678</ssn>
                </client>
              </broker>
            </brokerService>
            
            												
            										

            上面的行為可能并不需要,并且也可以通過修改清單 10a 中的序列化器選項來關閉,其使用 getOptions API。該序列化器為正在加載的 XML 中的元素拋出一個異常,但是該 XML 并不是用來生成包的原始 schema 的一部分。XML 輸出入清單 10b 所示。

            清單 10a. 方法

            												
            														public void TestRestrictSchemaChange()
            {
            	try
            	{
            		XMLTransformServiceFactory.INSTANCE.getOptions().put
            			(org.eclipse.emf.ecore.xmi.XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.FALSE);
            	        xyz.brokerservice.DocumentRoot loaded = ( xyz.brokerservice.DocumentRoot)
            			XMLTransformServiceFactory.INSTANCE.loadFile("./DataFile/brokerDetailResponseV2.xml");
            	        xyz.brokerservice.BrokerServiceType bs = loaded.getBrokerService();
            		bs.getBroker().setFirstName("NEW NAME");
            		System.out.println(XMLTransformServiceFactory.INSTANCE.convert((DataObject)loaded));
            	}
            	catch(Exception e)
            	{
            		e.printStackTrace();
            	}
            }
            
            												
            										

            清單 10b. 輸出

            												
            														org.eclipse.emf.ecore.xmi.FeatureNotFoundException: Feature 'securityToken' not found. (root.xml, 6, 56)
            	at org.eclipse.emf.ecore.xmi.impl.XMLHandler.reportUnknownFeature(XMLHandler.java:1168)
            	at org.eclipse.emf.ecore.xmi.impl.XMLHandler.handleUnknownFeature(XMLHandler.java:1138)
            	at org.eclipse.emf.ecore.xmi.impl.XMLHandler.setAttribValue(XMLHandler.java:1780)
            	at org.eclipse.emf.ecore.xmi.impl.SAXXMLHandler.handleObjectAttribs(SAXXMLHandler.java:145)
            	at org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObjectFromFactory(XMLHandler.java:1346)
            	at org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObjectFromFeatureType(XMLHandler.java:1318)
            	at org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObject(XMLHandler.java:1213)
            	at org.eclipse.emf.ecore.xmi.impl.XMLHandler.handleFeature(XMLHandler.java:1022)
            	at org.eclipse.emf.ecore.xmi.impl.XMLHandler.processElement(XMLHandler.java:448)
            	at org.eclipse.emf.ecore.xmi.impl.XMLHandler.startElement(XMLHandler.java:431)
            	at org.eclipse.emf.ecore.xmi.impl.SAXWrapper.startElement(SAXWrapper.java:75)
            	at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
            	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
            	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl
            		$FragmentContentDispatcher.dispatch(Unknown Source)
            	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
            	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
            	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
            	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
            	at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
            	at javax.xml.parsers.SAXParser.parse(Unknown Source)
            	at org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl.load(XMLLoadImpl.java:129)
            	at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doLoad(XMLResourceImpl.java:155)
            	at org.eclipse.emf.ecore.resource.impl.ResourceImpl.load(ResourceImpl.java:884)
            	at dw.ibm.etools.xsd.sdo.xmltransformservice.impl.XMLTransformServiceImpl.load
            		(XMLTransformServiceImpl.java:85)
            	at dw.ibm.etools.xsd.sdo.xmltransformservice.impl.XMLTransformServiceImpl.load
            		(XMLTransformServiceImpl.java:102)
            	at dw.ibm.etools.xsd.sdo.xmltransformservice.impl.XMLTransformServiceFactoryImpl.loadStream
            		(XMLTransformServiceFactoryImpl.java:50)
            	at dw.ibm.etools.xsd.sdo.xmltransformservice.impl.XMLTransformServiceFactoryImpl.loadFile
            		(XMLTransformServiceFactoryImpl.java:65)
            	at sdotestclient.TestClient.TestRestrictSchemaChange(TestClient.java:101)
            	at sdotestclient.TestClient.main(TestClient.java:33)
            java.lang.NullPointerException
            	at sdotestclient.TestClient.TestRestrictSchemaChange(TestClient.java:102)
            	at sdotestclient.TestClient.main(TestClient.java:33)
            
            												
            										







            SDO API 的使用

            生成的 SDO 包使用了一個潛在的 Eclipse Modeling Framework 實現。EMF 提供了用于圖表或相關(或不相關)對象的通用導航模型,并且包含了一個內置的變更通知機制。因此,生成的 SDO 包含使其可以穿過相關(或不相關)的 SDO 的 API。對這些對象實例或它們清單的任何修改都導致了管理變更的通知問題。下一部分主要強調了在操作從 XML 流中加載的 SDO 實例時的一些基本考慮。功能包含:

            (參閱資源來查看關于 EMF 和 SDO 的更多信息。)

            添加

            正如我們在上一部分中看到的那樣,SDO 對象的一個新的實例既可以通過使用工具包中生成的工廠類來創建,以可以使用相關 SDO 的 create<SDO Name> 方法。讓我們考慮一個例子,我們有一個從 XML 請求中加載的 SDO 圖表實例。現在我們需要創建一個新的包含來自于加載的 SDO 圖表實例的 SDO 圖表。

            在清單 11a 中,來自于 moveFrom 的 Broker 實例在 moveTo SDO 中被攝置。如果我們檢查 moveFrom 的內容,我們將看到它不再包含 broker 實例,然而 moveTo SDO 卻包含。默認情況下,這個案例中一個簡單的,添加操作導致了從原始容器到新的容器的一個移動。因此一個 SDO 實例在同一時刻僅能被一個容器所包含。

            清單 11a. 方法

            public void TestMove()
               {
            	xyz.brokerservice.DocumentRoot moveFrom = ( xyz.brokerservice.DocumentRoot)
            		XMLTransformServiceFactory.INSTANCE.loadFile("./DataFile/brokerDetailResponseV1.xml");        
            	xyz.brokerservice.DocumentRoot moveTo = xyz.brokerservice.DocumentRoot)
            		XMLTransformServiceFactory.INSTANCE.create(BrokerservicePackage.eINSTANCE.getNsURI());
            	moveTo.getXMLNSPrefixMap().put("", BrokerservicePackage.eINSTANCE.getNsURI());
            	moveTo.createBrokerService().setBroker(moveFrom.getBrokerService().getBroker());
            	System.out.println("**********Changes in Original XML********");	    
            	System.out.println(XMLTransformServiceFactory.INSTANCE.convert((DataObject)moveFrom));
            	System.out.println("**********************************************************");
            	System.out.println("**********Target XML**************************");
            	System.out.println(XMLTransformServiceFactory.INSTANCE.convert((DataObject)moveTo));
            	System.out.println("**********************************************************");
               }

            清單 11b. 輸出

            **********Changes in Original XML********
            <?xml version="1.0" encoding="UTF-8"?>
            <brokerService xmlns="http:///xyz.brokerservice.ecore"/>
            **********************************************************
            **********Target XML**************************
            <?xml version="1.0" encoding="ASCII"?>
            <brokerService xmlns="http:///xyz.brokerservice.ecore">
              <broker brokerId="000-00-9999">
                <firstName>Narinder</firstName>
                <lastName>Makin</lastName>
                <client clientId="001-00-9999">
                  <firstName>Dan</firstName>
                  <lastName>Moore</lastName>
                  <dateOfBirth>1967-08-13</dateOfBirth>
                  <currentAddress>
                    <street>113 Oak Pine St.</street>
                    <city>Santa Clara</city>
                    <state>LA</state>
                    <zip>91929</zip>
                    <country>US</country>
                  </currentAddress>
                  <permanentAddress>
                    <street>123 Demi Lane</street>
                    <city>Cary</city>
                    <state>NC</state>
                    <zip>22999</zip>
                    <country>US</country>
                  </permanentAddress>
                  <policy policyId="L000000000">
                    <policyName>Life</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>100000.00</policyAmount>
                    <policyDescription>Life Insurance policy includes any accidental damages.</policyDescription>
                  </policy>
                  <policy policyId="H000000000">
                    <policyName>House</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>50000.00</policyAmount>
                    <policyDescription>Home Insurance</policyDescription>
                  </policy>
                  <policy policyId="C000000001">
                    <policyName>Car 1</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>15000.00</policyAmount>
                    <policyDescription>Car Insurance - Ferrari 2004 - Primary Car </policyDescription>
                  </policy>
                  <policy policyId="C000000002">
                    <policyName>Car 2</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>5000.00</policyAmount>
                    <policyDescription>Car Insurance - Lexus 2003 - Secondary Car </policyDescription>
                  </policy>
                  <policy policyId="B000000002">
                    <policyName>Restaurant</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>25000.00</policyAmount>
                    <policyDescription>Business Insurance - Restaurant</policyDescription>
                  </policy>
                </client>
                <client clientId="002-00-9999">
                  <firstName>Tom</firstName>
                  <lastName>Cross</lastName>
                  <dateOfBirth>1970-11-11</dateOfBirth>
                  <currentAddress>
                    <street>113 Duke St.</street>
                    <city>Shelton</city>
                    <state>CT</state>
                    <zip>08989</zip>
                    <country>US</country>
                  </currentAddress>
                  <permanentAddress>
                    <street>123 Lex Lane</street>
                    <city>Fairfield</city>
                    <state>NY</state>
                    <zip>09833</zip>
                    <country>US</country>
                  </permanentAddress>
                  <policy policyId="H100000000">
                    <policyName>House</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>2000.00</policyAmount>
                    <policyDescription>Home Insurance</policyDescription>
                  </policy>
                  <policy policyId="L100000000">
                    <policyName>Life</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>100000.00</policyAmount>
                    <policyDescription>Life Insurance</policyDescription>
                  </policy>
                  <policy policyId="C100000001">
                    <policyName>Car 1</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>2000.00</policyAmount>
                    <policyDescription>Car Insurance - Camry 2004 - Primary Car </policyDescription>
                  </policy>
                </client>
              </broker>
            </brokerService>
            **********************************************************

            復制

            如果需要一個準確的復制操作,這樣兩個 SDO 圖表都將包含 SDO,應該改用 ObjectUtil.copyFrom 操作,因為在內部使用的是 EMF API。這個 API 執行了深度拷貝,包含所有嵌套的子對象都被復制到新的圖表里面。

            在清單 12a 中,copyFrom 的內容和以前相比并沒有改變,但是 copyTo 包含該 broker 的新實例,并且同為其從 copyFrom SDO 獲得的數據有相同的結構。

            清單 12a. 方法

            public void TestCopy()
               {
            	xyz.brokerservice.DocumentRoot copyFrom = (xyz.brokerservice.DocumentRoot)
            		XMLTransformServiceFactory.INSTANCE.loadFile("./DataFile/brokerDetailResponseV1.xml");
            	xyz.brokerservice.DocumentRoot copyTo = (xyz.brokerservice.DocumentRoot)
            		XMLTransformServiceFactory.INSTANCE.create(BrokerservicePackage.eINSTANCE.getNsURI());
            	copyTo.getXMLNSPrefixMap().put("", BrokerservicePackage.eINSTANCE.getNsURI());
            	copyTo.createBrokerService().setBroker((BrokerType)ObjectUtil.INSTANCE.copyFrom((DataObject)
            		copyFrom.getBrokerService().getBroker()));
            	System.out.println("**********No Changes in Original XML********");
            	System.out.println(XMLTransformServiceFactory.INSTANCE.convert((DataObject)copyFrom));
            	System.out.println("**********************************************************");
            	System.out.println("**********Target XML**************************");
            	System.out.println(XMLTransformServiceFactory.INSTANCE.convert((DataObject)copyTo));
            	System.out.println("**********************************************************");
               }

            清單 12b. 輸出

            **********No Changes in Original XML********
            <?xml version="1.0" encoding="UTF-8"?>
            <brokerService xmlns="http:///xyz.brokerservice.ecore">
              <broker brokerId="000-00-9999">
                <firstName>Narinder</firstName>
                <lastName>Makin</lastName>
                <client clientId="001-00-9999">
                  <firstName>Dan</firstName>
                  <lastName>Moore</lastName>
                  <dateOfBirth>1967-08-13</dateOfBirth>
                  <currentAddress>
                    <street>113 Oak Pine St.</street>
                    <city>Santa Clara</city>
                    <state>LA</state>
                    <zip>91929</zip>
                    <country>US</country>
                  </currentAddress>
                  <permanentAddress>
                    <street>123 Demi Lane</street>
                    <city>Cary</city>
                    <state>NC</state>
                    <zip>22999</zip>
                    <country>US</country>
                  </permanentAddress>
                  <policy policyId="L000000000">
                    <policyName>Life</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>100000.00</policyAmount>
                    <policyDescription>Life Insurance policy includes any accidental damages.</policyDescription>
                  </policy>
                  <policy policyId="H000000000">
                    <policyName>House</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>50000.00</policyAmount>
                    <policyDescription>Home Insurance</policyDescription>
                  </policy>
                  <policy policyId="C000000001">
                    <policyName>Car 1</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>15000.00</policyAmount>
                    <policyDescription>Car Insurance - Ferrari 2004 - Primary Car </policyDescription>
                  </policy>
                  <policy policyId="C000000002">
                    <policyName>Car 2</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>5000.00</policyAmount>
                    <policyDescription>Car Insurance - Lexus 2003 - Secondary Car </policyDescription>
                  </policy>
                  <policy policyId="B000000002">
                    <policyName>Restaurant</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>25000.00</policyAmount>
                    <policyDescription>Business Insurance - Restaurant</policyDescription>
                  </policy>
                </client>
                <client clientId="002-00-9999">
                  <firstName>Tom</firstName>
                  <lastName>Cross</lastName>
                  <dateOfBirth>1970-11-11</dateOfBirth>
                  <currentAddress>
                    <street>113 Duke St.</street>
                    <city>Shelton</city>
                    <state>CT</state>
                    <zip>08989</zip>
                    <country>US</country>
                  </currentAddress>
                  <permanentAddress>
                    <street>123 Lex Lane</street>
                    <city>Fairfield</city>
                    <state>NY</state>
                    <zip>09833</zip>
                    <country>US</country>
                  </permanentAddress>
                  <policy policyId="H100000000">
                    <policyName>House</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>2000.00</policyAmount>
                    <policyDescription>Home Insurance</policyDescription>
                  </policy>
                  <policy policyId="L100000000">
                    <policyName>Life</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>100000.00</policyAmount>
                    <policyDescription>Life Insurance</policyDescription>
                  </policy>
                  <policy policyId="C100000001">
                    <policyName>Car 1</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>2000.00</policyAmount>
                    <policyDescription>Car Insurance - Camry 2004 - Primary Car </policyDescription>
                  </policy>
                </client>
              </broker>
            </brokerService>
            **********************************************************
            **********Target XML**************************
            <?xml version="1.0" encoding="ASCII"?>
            <brokerService xmlns="http:///xyz.brokerservice.ecore">
              <broker brokerId="000-00-9999">
                <firstName>Narinder</firstName>
                <lastName>Makin</lastName>
                <client clientId="001-00-9999">
                  <firstName>Dan</firstName>
                  <lastName>Moore</lastName>
                  <dateOfBirth>1967-08-13</dateOfBirth>
                  <currentAddress>
                    <street>113 Oak Pine St.</street>
                    <city>Santa Clara</city>
                    <state>LA</state>
                    <zip>91929</zip>
                    <country>US</country>
                  </currentAddress>
                  <permanentAddress>
                    <street>123 Demi Lane</street>
                    <city>Cary</city>
                    <state>NC</state>
                    <zip>22999</zip>
                    <country>US</country>
                  </permanentAddress>
                  <policy policyId="L000000000">
                    <policyName>Life</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>100000.00</policyAmount>
                    <policyDescription>Life Insurance policy includes any accidental damages.</policyDescription>
                  </policy>
                  <policy policyId="H000000000">
                    <policyName>House</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>50000.00</policyAmount>
                    <policyDescription>Home Insurance</policyDescription>
                  </policy>
                  <policy policyId="C000000001">
                    <policyName>Car 1</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>15000.00</policyAmount>
                    <policyDescription>Car Insurance - Ferrari 2004 - Primary Car </policyDescription>
                  </policy>
                  <policy policyId="C000000002">
                    <policyName>Car 2</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>5000.00</policyAmount>
                    <policyDescription>Car Insurance - Lexus 2003 - Secondary Car </policyDescription>
                  </policy>
                  <policy policyId="B000000002">
                    <policyName>Restaurant</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>25000.00</policyAmount>
                    <policyDescription>Business Insurance - Restaurant</policyDescription>
                  </policy>
                </client>
                <client clientId="002-00-9999">
                  <firstName>Tom</firstName>
                  <lastName>Cross</lastName>
                  <dateOfBirth>1970-11-11</dateOfBirth>
                  <currentAddress>
                    <street>113 Duke St.</street>
                    <city>Shelton</city>
                    <state>CT</state>
                    <zip>08989</zip>
                    <country>US</country>
                  </currentAddress>
                  <permanentAddress>
                    <street>123 Lex Lane</street>
                    <city>Fairfield</city>
                    <state>NY</state>
                    <zip>09833</zip>
                    <country>US</country>
                  </permanentAddress>
                  <policy policyId="H100000000">
                    <policyName>House</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>2000.00</policyAmount>
                    <policyDescription>Home Insurance</policyDescription>
                  </policy>
                  <policy policyId="L100000000">
                    <policyName>Life</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>100000.00</policyAmount>
                    <policyDescription>Life Insurance</policyDescription>
                  </policy>
                  <policy policyId="C100000001">
                    <policyName>Car 1</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>2000.00</policyAmount>
                    <policyDescription>Car Insurance - Camry 2004 - Primary Car </policyDescription>
                  </policy>
                </client>
              </broker>
            </brokerService>
            **********************************************************
            

            刪除

            通過一個簡單的列表"remove"操作,SDO 可以從容器中刪除。如清單 13a 所示,客戶端的實例從 broker 實例中被移除。

            清單 13a. 方法

            public void TestDelete()
               {
            	xyz.brokerservice.DocumentRoot deleteFrom = ( xyz.brokerservice.DocumentRoot)
            		XMLTransformServiceFactory.INSTANCE.loadFile("./DataFile/brokerDetailResponseV1.xml");
            	BrokerType brokerType = deleteFrom.getBrokerService().getBroker();
            	List clientList = brokerType.getClient();
            	Iterator clientListItr = clientList.iterator();
            	ClientType clientMoore = null;
            	while(clientListItr.hasNext()){
            		ClientType clientType = (ClientType)clientListItr.next();
            		if(clientType.getLastName().equals("Moore")){
            			clientMoore = clientType;
            			break;
            		}
                    }
            	clientList.remove(clientMoore);        
            		System.out.println("**********Client with last name 'Moore'  removed from Original XML********");
            		System.out.println(XMLTransformServiceFactory.INSTANCE.convert((DataObject)deleteFrom));
            		System.out.println("**********************************************************");
               }

            清單 13b. 輸出

            **********Client with last name 'Moore'  removed from Original XML********
            <?xml version="1.0" encoding="UTF-8"?>
            <brokerService xmlns="http:///xyz.brokerservice.ecore">
              <broker brokerId="000-00-9999">
                <firstName>Narinder</firstName>
                <lastName>Makin</lastName>
                <client clientId="002-00-9999">
                  <firstName>Tom</firstName>
                  <lastName>Cross</lastName>
                  <dateOfBirth>1970-11-11</dateOfBirth>
                  <currentAddress>
                    <street>113 Duke St.</street>
                    <city>Shelton</city>
                    <state>CT</state>
                    <zip>08989</zip>
                    <country>US</country>
                  </currentAddress>
                  <permanentAddress>
                    <street>123 Lex Lane</street>
                    <city>Fairfield</city>
                    <state>NY</state>
                    <zip>09833</zip>
                    <country>US</country>
                  </permanentAddress>
                  <policy policyId="H100000000">
                    <policyName>House</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>2000.00</policyAmount>
                    <policyDescription>Home Insurance</policyDescription>
                  </policy>
                  <policy policyId="L100000000">
                    <policyName>Life</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>100000.00</policyAmount>
                    <policyDescription>Life Insurance</policyDescription>
                  </policy>
                  <policy policyId="C100000001">
                    <policyName>Car 1</policyName>
                    <policyStartDate>2004-01-01</policyStartDate>
                    <policyEndDate>2005-01-01</policyEndDate>
                    <policyAmount>2000.00</policyAmount>
                    <policyDescription>Car Insurance - Camry 2004 - Primary Car </policyDescription>
                  </policy>
                </client>
              </broker>
            </brokerService>
            **********************************************************
            

            旋轉

            因為 SDO 實現是基于 EMF 的,所以可以使用 EMF 旋轉 API 來旋轉一個 SDO 圖表。你即可以訪問相關的子對象,也可以使用 ObjectUtil 的 getParent API 來旋轉父對象樹。這個 API 將該引用旋轉到容器 SDO,其包含 SDO 并作為一個類型引用或在一個列表中。在清單 14a 和 14b 中,broker 實例從客戶端 SDO 的實例旋轉過來。

            清單 14a. 代碼

            public void TestGraphTravesal()
               {
            	xyz.brokerservice.DocumentRoot traverseFrom = ( xyz.brokerservice.DocumentRoot)
            		XMLTransformServiceFactory.INSTANCE.loadFile("./DataFile/brokerDetailResponseV1.xml");
            	BrokerType brokerType = traverseFrom.getBrokerService().getBroker();
            	System.out.println("BrokerType is: " + brokerType.getFirstName());
            	List clientList = brokerType.getClient();
            	Iterator clientListItr = clientList.iterator();
            	ClientType clientMoore = null;
            	while(clientListItr.hasNext()){
            		ClientType clientType = (ClientType)clientListItr.next();
            		BrokerType parent = (BrokerType)ObjectUtil.INSTANCE.getParent(((DataObject)clientType));
            		System.out.println("Parent brokerType is: " + parent.getFirstName());
            	}
               }

            清單 14b. 結果

            BrokerType is: Narinder
            Parent brokerType is: Narinder
            Parent brokerType is: Narinder
            







            合計 API 的使用

            工具 API,比如 sort,sum,mean 等,其使用一般貫穿于整個應用程序。為一個基于 XML 的 SOA 創建的應用程序一般都會需要這種 API 的編碼。如果我們使用 SDO 實現,這些方法在貫穿該 SDO 實例都會提供。在 XSD SDO Transform 特性中提供的 ObjectUtil 輔助類,包含合計和其他工具 API,來操作 SDO 對象。這一部分圖示了這些 API 的使用。

            Sum

            Sum API 可以用來提供一個列表中 EAttribute 值的總和。這個 API 通過對列表一個簡單的調用來使用,該列表包含屬性的實例和 EAttribute。EPackage 提供了到所有 EMF 類型的訪問,這些類型用于呈現在 SDO 包中的 EObject 和 EAttribute。類型 Integer,Float,Long,Short,Double,BigDecimal 和 String 的屬性對于 Sum 是可用的。對于類型為 String 的屬性,已經在暗地里將其轉化為 Long,Double 或者 Float。

            清單 15. Sum API

            /**
             * Get the sum for the values of the attribute in an EList
             * @exception Exception Throws java.lang.Exception
             * @param list a EList containing the attribute values
             * @param attr The EAttribute for the attribute whose sum is to be determined
             * @return Object  The sum of the value of the EAttributes in the list.If the length is less than 0
             * then return null. If the attribute is not valid for doing sum and mean then return null
             */
            public Object sum(List list, EAttribute attr) throws Exception

            Mean

            Mean API 可以用來提供列表中呈現的 EAttribute 的平均值。這個 API 通過對列表的一個簡單調用來實現,該列表包含該屬性的實例和 EAttribute。其合法的屬性類型同 Sun 是相同的。

            Listing 16. Mean API

            /**
             * Get the mean for the values of the attribute in an EList
             * @exception Exception Throws java.lang.Exception
             * @param list a EList containing the attribute values
             * @param attr The EAttribute for the attribute whose mean is to be determined
             * @return Object  The mean of the value of the EAttributes in the list.If the length is less than 0
             * then return null. If the attribute is not valid for doing sum and mean then return null
             */
            public Object mean(List list, EAttribute attr) throws Exception

            Min

            Min API 可以用來提供呈現在列表中 EAttribute 的最小值。這個 API 可以通過一個對列表的簡單調用來使用,該列表包含用于該屬性的實例和 EAttribute。類型為 Integer,Float,Long,Short,Double,BigDecimal,Date,Time,Timestamp 和 String 的屬性對于 Min 都是可用的。

            清單 17. Min API

            /**
             * Get the minimum value from the attributes in the EList
             * @param list a EList containing the attribute values
             * @param attr an EAttribute defining the EType of the attributes in the list
             * @return Object  The minimum value in the list 
             * If the length is less than 0 then return null.
             * If the attribute is not valid then return null
             */
            public Object min(List list, EAttribute attr) throws Exception

            Max

            Max API 可以用來提供列表中呈現的 EAttribute 的最大值。這個 API 通過對列表的一個簡單調用來實現,該列表包含該屬性的實例和 EAttribute。其合法的屬性類型同 Min 是相同的。

            清單 18. Max API

            /**
             * Get the maximum value from the attributes in the EList
             * @param list a EList containing the attribute values
             * @param attr an EAttribute defining the EType of the attributes in the list
             * @return Object  The maximum value in the list 
             * If the length is less than 0 then return null.
             * If the attribute is not valid then return null
             */
            public Object max(List list, EAttribute attr) throws Exception

            這個合計 API 的編碼和結果如圖 19a 和 19b 所示。

            清單 19a. 代碼

            public void TestAggregateAPI(){
            	xyz.brokerservice.DocumentRoot root = ( xyz.brokerservice.DocumentRoot)
            		XMLTransformServiceFactory.INSTANCE.loadFile("./DataFile/brokerDetailResponseV1.xml");
            	BrokerServiceType bs = root.getBrokerService();
            	try {
            		//sum test
            		System.out.println("Sum is : " + ObjectUtil.INSTANCE.sum(bs.getBroker()
            			.getClientAsArray()[0].getPolicy(), 
            			BrokerservicePackage.eINSTANCE.getPolicyType_PolicyAmount()));
            			
            		//mean test
            		System.out.println("Mean is : " + ObjectUtil.INSTANCE.mean(bs.getBroker()
            			.getClientAsArray()[0].getPolicy(), 
            			BrokerservicePackage.eINSTANCE.getPolicyType_PolicyAmount()));
            			
            		//max test
            		System.out.println("Max is : " + ObjectUtil.INSTANCE.max(bs.getBroker()
            			.getClientAsArray()[0].getPolicy(), 
            			BrokerservicePackage.eINSTANCE.getPolicyType_PolicyName()));
            			
            		//min test
            		System.out.println("Min is : " + ObjectUtil.INSTANCE.min(bs.getBroker()
            			.getClientAsArray()[0].getPolicy(), 
            			BrokerservicePackage.eINSTANCE.getPolicyType_PolicyName()));
            	} 
            	catch (Exception e) {
            		// TODO Auto-generated catch block
            		e.printStackTrace();
            	}
            }

            清單 19b. 結果

            Sum is : 195000.0
            Mean is : 39000.0
            Max is : Restaurant
            Min is : Car 1







            使用 XSD-to-SDO 生成器

            Application Developer 還提供了從 XSD 文檔生成 SDO 包的特性。你可以使用這個特性來生成 SDO Java 包,而不是通過e Create SDO Package 動作。Create SDO Package 動作生成的代碼包含數組方法和用于相關 SDO 對象的列表方法。這就簡化了數據庫表到 collection 的綁定,而不用提示定義 collection 中定義的類型。除了這些,這個生成器還可以添加需要的框架 JAR 到項目中,這樣就不需要人工的設置。當你不僅僅需要創建 SDO 包的時候,使用 Create SDO Package 動作是可行的,比如當開發一個 Web 項目的時候。當使用一個簡單的 Java 項目的時候,你可能希望使用 XSD SDO 生成器并且手工的添加框架 JAR 文件,xsdsdotransform.jar,到類路徑中,并且如果需要轉化能力的話就構建項目路徑。EMF 框架 JAR 被生成器自動添加到項目中。(這些 JAR 在站點 EMF Web site 上可以下載,并且同 Application Developer 或者 WebSphere Application Server 運行時提供的 emf.jar 時相同的。)

            為了使用 Application Developer 中的 SDO 生成器:

            1. 在參數選項對話框中打開 XML 開發能力(圖片 7)。
              圖 7. 打開 XML 能力
              打開 XML 能力
            2. 這使一個 XSD 文檔被選中的時候,一個相應的菜單可以用來生成 Java。(圖 8)
              圖 8. 菜單動作
              菜單動作
            3. 在 Generate Java 對話框中,選擇 SDO Generator 來使 XSD SDO Java 包的生成可用(圖 9)。
              圖 9. XSD SDO 生成器向導
              XSD SDO 生成器向導
            4. 最為向操作的結果,SDO Java 包被創建(圖 10)并且所需的框架 JAR 被添加到 Java 項目的構建和類路徑中。
              圖 10. SDO Java Package
              SDO Java Package

            已知的局限性:XSD 繼承在 SDO 包的生成中是不支持的。在創建 SDO 包以前,你將需要手動修復生成的代碼或者將 schema 放入一個單獨的文件。







            結束語

            這一系列文章的第三部分著重講了在構建一個基于 XML 的 SOA 應用程序的時候,通常使用的用于操作 SDO 實例的一些技術。怎么使用 SDO 生成器,以及在代碼生成的時候使用 Create SDO Package 動作的不同也都進行了討論。

            第四部分將集中在使用 XSD SDO 轉化特性的基于 XML 的 SOA 的 portlet 開發,選擇 JSR 168 portlet 創建,在 portlet 之間的參數傳遞,以及在一個 portlet 動作上動態的設置其他任何 portlet 的目標 portlet 的視圖。第五部分將討論為使用 XSD SDO 轉化特性的基于 XML 的 SOA 本地化 JSF 和 portlet 應用程序,并且將定位基于優選的區域顯示本地化的靜態和動態內容。








            下載

            描述名字大小下載方法
            Download file 1xyzinsurancetestclient_pi.zip2.0 MB?FTP|HTTP
            Download file 2xsdsdotransform-feature.zip52 KB?FTP|HTTP
            Download file 3xsd_sdo_soa_part3_listings.zip4 KB?FTP|HTTP

            posted on 2006-04-17 03:22 wsdfsdf 閱讀(482) 評論(0)  編輯 收藏 引用 所屬分類: 技術文章

            青青热久久国产久精品 | 精品人妻久久久久久888| 精品欧美一区二区三区久久久| 久久久久久九九99精品| 97精品国产97久久久久久免费| 国产精品热久久无码av| 色综合久久中文综合网| 久久不射电影网| 91精品国产91热久久久久福利| 国产精品久久久久9999| 狠狠色丁香久久综合五月| 久久精品九九亚洲精品天堂| 久久免费国产精品一区二区| 91精品国产高清久久久久久国产嫩草 | 97精品伊人久久大香线蕉| 日韩影院久久| 东方aⅴ免费观看久久av| 亚洲国产精品18久久久久久| 久久久久亚洲Av无码专| 国产精品一久久香蕉国产线看| 久久婷婷综合中文字幕| 国内精品久久久久久中文字幕| 伊人久久精品影院| 色88久久久久高潮综合影院| 久久中文娱乐网| 狠狠色丁香久久婷婷综合蜜芽五月| 伊人久久大香线蕉亚洲五月天| 久久人人爽人人爽人人AV东京热| 久久96国产精品久久久| 久久久久九国产精品| 国产美女亚洲精品久久久综合| 99久久婷婷国产综合亚洲| 蜜桃麻豆www久久国产精品| 无码AV中文字幕久久专区| 国产精品VIDEOSSEX久久发布| 国产精品久久久久久久久软件| 99国产精品久久| 国产成人久久精品一区二区三区| 久久久综合九色合综国产| 大香伊人久久精品一区二区| 狠狠狠色丁香婷婷综合久久五月|