在服務成功發佈後,可以看到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)。