Я пытаюсь прочитать (а затем сохранить в сторонней локальной базе данных) определенные теги объектов DICOM «во время» входящего запроса на ассоциацию.
Для приема запросов на ассоциацию и локального хранения моих файлов dicom я использовал модифицированную версию инструмента dcmrcv(). В частности, я переопределил метод onCStoreRQ, например:
@Override
protected void onCStoreRQ(Association association, int pcid, DicomObject dcmReqObj,
PDVInputStream dataStream, String transferSyntaxUID,
DicomObject dcmRspObj)
throws DicomServiceException, IOException {
final String classUID = dcmReqObj.getString(Tag.AffectedSOPClassUID);
final String instanceUID = dcmReqObj.getString(Tag.AffectedSOPInstanceUID);
config = new GlobalConfig();
final File associationDir = config.getAssocDirFile();
final String prefixedFileName = instanceUID;
final String dicomFileBaseName = prefixedFileName + DICOM_FILE_EXTENSION;
File dicomFile = new File(associationDir, dicomFileBaseName);
assert !dicomFile.exists();
final BasicDicomObject fileMetaDcmObj = new BasicDicomObject();
fileMetaDcmObj.initFileMetaInformation(classUID, instanceUID, transferSyntaxUID);
final DicomOutputStream outStream = new DicomOutputStream(new BufferedOutputStream(new FileOutputStream(dicomFile), 600000));
//i would like somewhere here to extract some TAGS from incoming dicom object. By trying to do it using dataStream my dicom files
//are getting corrupted!
//System.out.println("StudyInstanceUID: " + dataStream.readDataset().getString(Tag.StudyInstanceUID));
try {
outStream.writeFileMetaInformation(fileMetaDcmObj);
dataStream.copyTo(outStream);
} finally {
outStream.close();
}
dicomFile.renameTo(new File(associationDir, dicomFileBaseName));
System.out.println("DICOM file name: " + dicomFile.getName());
}
@Override
public void associationAccepted(final AssociationAcceptEvent associationAcceptEvent) {
....
@Override
public void associationClosed(final AssociationCloseEvent associationCloseEvent) {
...
}
Я хотел бы где-то между этим кодом перехватить метод, который будет читать dataStream и анализировать определенные теги и сохранять в локальной базе данных.
Однако, где бы я ни пытался поместить фрагмент кода, который пытается манипулировать (просто прочитать для начала) dataStream, мои файлы dicom будут повреждены!
PDVInputStream реализует java.io.InputStream....
Даже если я попытаюсь просто поставить:
System.out.println("StudyInstanceUID: " + dataStream.readDataset().getString(Tag.StudyInstanceUID));
перед копированием потока данных в outStream ... тогда мои файлы dicom повреждаются (размер 1 КБ) ...
Как я должен использовать поток данных в запросе ассоциации CStoreRQ для извлечения некоторой информации?
надеюсь мой вопрос понятен...