青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 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.jarcommonj.sdo.jarecore.xmi.jarecore.jarcommon.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 閱讀(488) 評論(0)  編輯 收藏 引用 所屬分類: 技術文章

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美亚日韩国产aⅴ精品中极品| 亚洲综合成人在线| 亚洲无毛电影| 亚洲午夜激情| 亚洲欧美日韩精品在线| 亚洲大胆人体视频| 国产精品久久77777| aa级大片欧美三级| 亚洲午夜久久久| 亚洲在线观看免费| 欧美在线在线| 欧美不卡一卡二卡免费版| 亚洲国产成人porn| 欧美国产亚洲另类动漫| 亚洲欧洲日夜超级视频| 亚洲精品婷婷| 午夜精品久久久99热福利| 欧美在线亚洲在线| 欧美不卡三区| 国产精品视频成人| 亚洲国产精品成人va在线观看| 日韩天天综合| 久久国产精品免费一区| 美女黄毛**国产精品啪啪| 亚洲精品日韩激情在线电影| 亚洲免费影视第一页| 免费在线亚洲| 国产一区二区三区自拍| 99精品国产热久久91蜜凸| 欧美一区永久视频免费观看| 欧美高清在线视频| 午夜一区在线| 欧美劲爆第一页| 国产一区二区久久久| 99精品视频免费全部在线| 欧美在线视频一区| 亚洲人久久久| 久久躁狠狠躁夜夜爽| 国产精品乱码人人做人人爱| 在线欧美电影| 欧美在线观看视频一区二区| 亚洲国语精品自产拍在线观看| 亚洲欧美在线网| 欧美日本久久| 亚洲国产视频直播| 久久日韩精品| 亚洲一区尤物| 欧美日韩综合久久| 亚洲毛片一区| 女仆av观看一区| 久久成人18免费网站| 国产精品久线观看视频| 一区二区日本视频| 欧美国产视频日韩| 美女视频网站黄色亚洲| 狠狠色综合一区二区| 久久国产主播精品| 先锋影音网一区二区| 国产精品久久久久毛片软件| 99riav国产精品| 欧美日韩在线观看一区二区三区 | 欧美大尺度在线观看| 亚洲一二三区在线| 欧美肉体xxxx裸体137大胆| 亚洲成色www久久网站| 久久综合九九| 久久久一区二区| 樱桃视频在线观看一区| 久久精品中文| 欧美呦呦网站| 国产一区在线看| 久久久精品动漫| 久久久综合免费视频| 精品福利电影| 欧美激情国产日韩精品一区18| 久久综合一区二区| 亚洲国产成人在线播放| 免费在线观看日韩欧美| 蜜臀va亚洲va欧美va天堂| 亚洲国产日韩综合一区| 欧美国产丝袜视频| 欧美日韩国产成人在线免费| 亚洲永久网站| 欧美亚洲一级片| 亚洲第一在线| 日韩视频在线观看国产| 国产精品毛片高清在线完整版| 欧美一区二区三区四区在线| 欧美在线一级视频| 亚洲精品在线二区| 亚洲免费在线播放| 亚洲国内在线| 亚洲视频网站在线观看| 国内精品美女在线观看| 亚洲国产aⅴ天堂久久| 欧美新色视频| 久久精品视频在线免费观看| 老司机免费视频一区二区三区| 99re66热这里只有精品4| 亚洲视频中文| 最新国产精品拍自在线播放| 在线视频免费在线观看一区二区| 国产日韩一区二区三区| 亚洲欧洲一级| 黄色成人91| 99精品免费| 在线不卡中文字幕播放| 妖精成人www高清在线观看| 国产一区二区三区奇米久涩| 亚洲成色777777在线观看影院| 欧美特黄视频| 欧美激情视频给我| 国产真实精品久久二三区| 亚洲精品在线视频观看| 好吊日精品视频| 一区二区成人精品| 亚洲精品在线视频观看| 久久久久综合一区二区三区| 亚洲一区自拍| 欧美老女人xx| 欧美xxxx在线观看| 亚洲天堂男人| 亚洲欧美日韩精品综合在线观看| 亚洲黄色免费网站| 欧美中文字幕视频在线观看| 99国内精品久久| 美女主播精品视频一二三四| 欧美在线三级| 国产精品美女一区二区| 亚洲免费久久| 夜夜爽www精品| 欧美成人资源| 亚洲黄色av一区| 亚洲精品视频一区| 欧美成人久久| 亚洲电影免费观看高清| 亚洲激情欧美激情| 免费成人av在线| 亚洲韩日在线| 亚洲精品男同| 欧美精品一区二| 亚洲人成久久| 中国成人黄色视屏| 国产精品wwwwww| 亚洲欧美另类久久久精品2019| 欧美一区二区三区在线观看视频| 欧美偷拍另类| 亚洲一区精彩视频| 久久国产精品99国产精| 国产一区二区三区久久久| 欧美一区二区三区四区视频| 久久精品视频一| 伊人精品久久久久7777| 久久中文精品| 亚洲人成艺术| 亚洲欧美资源在线| 国产一区二区欧美日韩| 麻豆国产va免费精品高清在线| 亚洲黄色成人网| 亚洲欧美影院| 好男人免费精品视频| 欧美成年人视频| av成人国产| 久久久久免费视频| 在线成人免费观看| 欧美日韩国产电影| 香蕉成人啪国产精品视频综合网| 久久天堂国产精品| 夜夜嗨av一区二区三区| 国产精品区一区| 久久一区免费| 一区二区av在线| 久久五月天婷婷| 亚洲视频电影图片偷拍一区| 国产精品一区二区三区四区| 久久美女性网| 亚洲精品人人| 久久综合99re88久久爱| av成人手机在线| 国产一区二区三区奇米久涩| 欧美大片免费久久精品三p| 亚洲视频导航| 亚洲高清在线| 久久久91精品| 亚洲一二三四区| 最近中文字幕日韩精品| 国产亚洲一区精品| 欧美女同在线视频| 久久综合精品一区| 欧美一区国产一区| 一区二区三区三区在线| 欧美激情精品久久久久久大尺度| 性色av一区二区三区| 欧美精品日韩www.p站| 国内精品久久久久久| 欧美三级欧美一级| 欧美搞黄网站| 久久中文字幕一区| 亚洲欧美日韩一区二区三区在线观看 | 亚洲综合日韩在线|