Dcm4chee源码解析:
读懂Dcm4chee的源码是建立在对DICOM标准、WADO通讯以及JBOSS Mbean仓库反射了解的基础上。
开始解读代码:
从WADOServlet的doGet开始解读
WADOResponseObject respObject = delegate.getWADOObject((WADORequestObject)reqObject );
这段代码利用托管对象delegate将WADO请求对象变成WADO响应对象,然后
sendWADOFile( response, respObject ); 第一个参数为HttpServletResponse 对象,第二个参数为WADO响应对象,也可以理解为一个DICOM对象,这样就将DICOM对象发往浏览器。
WADOResponseObject类(没有继承和实现),在它的getWADOObject函数中有这样一段代码
Objecto = server.invoke(wadoServiceName,
"getWADOObject",
new Object[] { reqVO },
new String[] { WADORequestObject.class.getName() } );
这段代码就是MBean的动态创建,了解动态创建后,这段代码实现上是执行了一个WADOService(注解1:This class use WADOSupport for the WADOmethods and WADOCache for caching jpg images.
)的getWADOObject方法,在该方法内写着WADOResponseObject resp = support.getWADOObject(reqVO);这样一段代码,support为WADOSupport对象,这个对象见上面的注解1。接着执行WADOSupport类里面的getWADOObject方法,在这里面写了
objectDs = cmd.getDataset();
req.setObjectInfo(objectDs);
file =this.getDICOMFile(req.getStudyUID(),req.getSeriesUID(),
req.getObjectUID());
resp =handleTextTransform(req, file, contentTypeDicomXML,
getDicomXslURL(), dict);
resp为一个WADOResponseObject对象。
getDICOMFile方法解析:
在里面有这样一段代码:
dicomObject= server.invoke(queryRetrieveScpName, "locateInstance",
new Object[] { instanceUID, studyUID},
new String[] { String.class.getName(),
String.class.getName() });
又是动态,代码会执行QueryRetrieveScpService的locateInstance方法,返回一个AEDTO对象,接着fetchFromExternalRetrieveAET(ae, studyUID, seriesUID, instanceUID),返回一个File对象。