Попытка реализовать настольное приложение DICOM Router (Java) с использованием набора инструментов dcm4che (v.2).
Маршрутизатор DICOM должен принимать любые входящие запросы отправки DICOM, хранить файлы локально (в определенной структуре папок) и после завершения каждого запроса отправки исследования DICOM он должен обрабатывать файлы определенным образом (внутренние действия).
Я использую утилиту / инструмент dcmrcv для реализации приемника DICOM следующим образом (getDcmRcv () на самом деле является объектом dmcRcv):
...
private final CustomStorageService storageSCP = new CustomStorageService(CUIDS);
...
public DcmRcv(String name) {
device = new Device(name);
executor = new NewThreadExecutor(name);
device.setNetworkApplicationEntity(ae);
device.setNetworkConnection(nc);
ae.setNetworkConnection(nc);
ae.setAssociationAcceptor(true);
ae.register(new VerificationService());
ae.register(storageSCP);
ae.register(stgcmtSCP);
ae.addAssociationListener(storageSCP);
}
Я как-то изменил StorageService для управления AssociationListener следующим образом:
private final class CustomStorageService extends StorageService implements AssociationListener {
public CustomStorageService(final String[] sopClasses) {
super(sopClasses);
}
@Override
protected void onCStoreRQ(final Association association, final int pcid, final DicomObject dcmReqObj,
final PDVInputStream dataStream, final String transferSyntaxUID,
final DicomObject dcmRspObj)
throws DicomServiceException, IOException {
final String classUID = dcmReqObj.getString(Tag.AffectedSOPClassUID);
final String instanceUID = dcmReqObj.getString(Tag.AffectedSOPInstanceUID);
GlobalConfig 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 + PARTIAL_FILE_EXTENSION);
assert !dicomFile.exists();
final BasicDicomObject fileMetaDcmObj = new BasicDicomObject();
fileMetaDcmObj.initFileMetaInformation(classUID, instanceUID, transferSyntaxUID);
final DicomOutputStream outStream = new DicomOutputStream(
new BufferedOutputStream(new FileOutputStream(dicomFile), 600000));
try {
outStream.writeFileMetaInformation(fileMetaDcmObj);
dataStream.copyTo(outStream);
} finally {
outStream.close();
}
dicomFile.renameTo(new File(associationDir, dicomFileBaseName));
System.out.println("DICOM file name: " + dicomFile.getName());
}
}
Таким образом, я могу принимать запросы отправки DICOM от клиента (например, Mayam), НО файлы хранятся в плоской структуре в каталоге «rootDirectory» (C: \ XXXXXX \ YYYY \ Development \ AssocDir).
Я пытаюсь получить такую информацию, как StudyID и SeriedID из объекта ассоциации, чтобы создать структуру папок, например root / StudyID / SeriesID / DicmFile из dcmReqObj или dicomFile ... Однако:
dcmReqObj фактически пуст (заполняются только теги AffectedSOPClassUID и AffectedSOPInstanceUID)
Даже если я попытаюсь получить его после: outStream.writeFileMetaInformation (fileMetaDcmObj), тег StudyID еще не заполнен (внутри этого метода) ...
Также в этом методе, если я пытаюсь получить "dicomFile" внутри onCStoreRQ, я могу использовать его только в переходной фазе, когда он еще не является заполненным объектом DICOM ...
Что мне здесь не хватало?