Чтение информации dicomObject PDVInputStream по запросу ассоциации onCStoreRQ

Я пытаюсь прочитать (а затем сохранить в сторонней локальной базе данных) определенные теги объектов 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 для извлечения некоторой информации?

надеюсь мой вопрос понятен...


person thanili    schedule 20.11.2014    source источник


Ответы (1)


PDVInputStream, вероятно, является классом PDUDecoder. Вам придется сбросить позицию при многократном использовании входного потока.

Возможно, лучшим решением было бы сохранить объект DICOM в памяти и использовать его для обеих целей. Что-то похожее на:

DicomObject dcmobj = dataStream.readDataset();
String whatYouWant = dcmobj.get( Tag.whatever );
dcmobj.initFileMetaInformation( transferSyntaxUID );
outStream.writeDicomFile( dcmobj );
person cneller    schedule 02.12.2014