在服务成功发布后,可以看到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)。