iheOS實現XDS.b註冊與存儲服務

       前面的blog中提到了,Openxds使用iheos實現XDS Registry和XDS Repository的服務,也就是XDS.規範中的事務。iheOS即IHE Open Source(http://sourceforge.net/projects/iheos/)項目最近更新時間是2011年11月。

       在服務成功發佈後,可以看到Registry和Repository分別開放的調用接口。另外,也可以在openxds的服務配置文件中找到服務對應的實現類,路徑是\openxds-core\src\main\resources\axis2repository\services\iheos.aar,這個壓縮包中唯一的文件是services.xml。上篇blog也貼上了部分service配置信息,這裏再次奉上,用於分析。

1、存儲庫實現Repository

服務配置文件:

 <service name="xdsrepositoryb">
  <description>XDS.b Repository Interface</description> 
  <parameter name="ServiceClass" locked="false">gov.nist.registry.ws.serviceclasses.RepositoryB</parameter> 
 <operation name="ProvideAndRegisterDocumentSetRequest">
  <messageReceiver class="gov.nist.registry.common2.service.XDSRawXMLInOutMessageReceiver" /> 
  <actionMapping>urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-b</actionMapping> 
  <parameter name="enableMTOM">true</parameter> 
  </operation>
<operation name="RetrieveDocumentSetRequest">
  <messageReceiver class="gov.nist.registry.common2.service.XDSRawXMLInOutMessageReceiver" /> 
  <actionMapping>urn:ihe:iti:2007:RetrieveDocumentSet</actionMapping> 
  <parameter name="enableMTOM">true</parameter> 
  </operation>
  </service>

        

             Repository角色提供了四個服務接口,除了上面配置文件的ProvideAndRegistryDocumentSetRequest和RetrieveDocumentSetRequest外,還包括RepositoryB類的兩個public方法:runContentValidationService和getServiceName。下面對前三個重要的方法進行具體分析。

        1.1  ProvideAndRegistryDocumentSetRequest

        即IHE事務ITI-41,提交和註冊文檔請求,提交的內容有:DocumentEntry元數據、Submission Set元數據、XDS Folder數據以及文檔本身。在配置文件中,與ITI-41對應的實現類是XDSRawXMLInOutMessageReceiver,下面是這個類的類圖。


        這個核心類只有一個方法,即validate_action,傳入的參數是axis2消息,根據具體的axis2消息請求類型調用對應的處理。具體的java代碼如下:

public void validate_action(MessageContext msgContext, MessageContext newmsgContext) {
		String in_action = msgContext.getWSAAction();
		
		String out_action = SoapActionFactory.getResponseAction(in_action);
		if (out_action == null) {
			newmsgContext.setFailureReason(new Exception("Unknown action <" + in_action + ">"));
			return;
		}
		newmsgContext.setWSAAction(out_action);
	}

        ITI-41消息請求XML根結點是:ProvideAndRegisterDocumentSetRequest,其中的核心類SoapActionFactory就起到了調用對應處理類的作用。所以在下面要分析的Registry接收消息的類也是XDSRawXMLInOutMessageReceiver,這種鬆耦合方式值得學習。

SoapActionFactory類定義了5個final static屬性以及一個map,將請求消息與響應消息名稱作對應。

	public final static String pnr_b_async_action = "urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-b";
	public final static String pnr_b_action       = "urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-b";
	public final static String ret_b_action       = "urn:ihe:iti:2007:RetrieveDocumentSet";
	public final static String ret_b_async_action = "urn:ihe:iti:2007:RetrieveDocumentSet";
	public final static String anon_action        = "urn:anonOutInOp";
        async指的是異步消息處理。這5個屬性只是ITI-41和ITI-43,沒有包含ITI-41,但並不是沒有ITI-41,只是把它寫在了map中。

	private static final Map<String, String> actions =
		new HashMap<String, String>()
		{
				     {
		    	 put(pnr_b_action,       "urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-bResponse");
		    	 put(pnr_b_async_action, "urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-bResponse");
		    	 put("urn:ihe:iti:2007:RegisterDocumentSet-b",           "urn:ihe:iti:2007:RegisterDocumentSet-bResponse");
		    	 put(ret_b_action,       "urn:ihe:iti:2007:RetrieveDocumentSetResponse");
		    	 put(ret_b_async_action, "urn:ihe:iti:2007:RetrieveDocumentSetResponse");
		    	 put(MetadataSupport.SQ_action,             "urn:ihe:iti:2007:RegistryStoredQueryResponse");
		    	 //put("urn:ihe:iti:2007:RegistryStoredQueryAsync",        "urn:ihe:iti:2007:RegistryStoredQueryResponse");
		    	 put("urn:ihe:iti:2007:CrossGatewayRetrieve",            "urn:ihe:iti:2007:CrossGatewayRetrieveResponse");
		    	 put("urn:ihe:iti:2007:CrossGatewayQuery",               "urn:ihe:iti:2007:CrossGatewayQueryResponse");
		    	 //put("urn:ihe:iti:2007:CrossGatewayQueryAsync",          "urn:ihe:iti:2007:CrossGatewayQueryResponse");
		    	 put(MetadataSupport.dsub_subscribe_action,  MetadataSupport.dsub_subscribe_response_action);
		    	 put(MetadataSupport.MPQ_action,  "urn:ihe:iti:2009:MultiPatientStoredQueryResponse");
		     }
		
		};

               此處的ProvideAndRegisterDocumentSetRequesty請求對應的響應是"urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-bResponse"。提供的getReponseAction方法返回的只是一個String值,即響應的uri。XDSRawXMLInOutMessageReceiver將得到的響應消息名稱傳遞給MessageContext。

        此時遇到了問題:gov.nist.registry.common2.registry.Response這個抽象類的子類只有4個,有一個還是測試類,另外三個是:AdhocQueryResponse、RegistryResponse、RetrieveMultipleResponse。這裏面沒有ITI-41請求的響應類,ITI-41的響應是怎麼處理的呢?

         

<service name="xdsregistryb">
  <description>XDS.b Registry Interface</description> 
  <parameter name="ServiceClass" locked="false">gov.nist.registry.ws.serviceclasses.RegistryB</parameter> 
<operation name="SubmitObjectsRequest">
  <messageReceiver class="gov.nist.registry.common2.service.XDSRawXMLInOutMessageReceiver" /> 
  <actionMapping>urn:ihe:iti:2007:RegisterDocumentSet-b</actionMapping> 
  </operation>
<operation name="AdhocQueryRequest">
  <messageReceiver class="gov.nist.registry.common2.service.XDSRawXMLInOutMessageReceiver" /> 
  <actionMapping>urn:ihe:iti:2007:RegistryStoredQuery</actionMapping> 
  <actionMapping>urn:ihe:iti:2009:MultiPatientStoredQuery</actionMapping> 
  </operation>
  </service>
            這是Registry角色相關的服務接口,同樣包含四個服務,除了上面看到的兩個:SubmitObjectsRequest、AdhocQueryRequest,還包括RegistryB的兩個public方法:getServiceName和runContentValidationService。下面對每一個服務具體分析。

        1.SubmitObjectsRequest

        這是




        注:在研究的過程中,發現了另外一個IHE的開源實現,即HIEOS,與iheOS長的太像,以致於一度弄混,把OpenXDS搞清楚之後研究一下它。HIEOS全稱是:Health Information Exchange Open Source,實現了IHE XDS.b和IHE XCA集成規範。在2010年2月之前使用的SUN公司的Kenai項目平臺(http://kenai.com/projects/hieos),之後遷移到了Sourceforge(http://sourceforge.net/projects/hieos)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章