`
xmarkgogo
  • 浏览: 29442 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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)。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics