edu.wustl.xipHost.avt2ext.AVTRetrieve2.java Source code

Java tutorial

Introduction

Here is the source code for edu.wustl.xipHost.avt2ext.AVTRetrieve2.java

Source

/*
Copyright (c) 2013, Washington University in St.Louis
All rights reserved.
    
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
    
  http://www.apache.org/licenses/LICENSE-2.0
    
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package edu.wustl.xipHost.avt2ext;

import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.log4j.Logger;
import org.dcm4che2.data.DicomObject;
import org.dcm4che2.data.Tag;
import org.dcm4che2.io.DicomOutputStream;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import com.siemens.scr.avt.ad.annotation.ImageAnnotation;
import com.siemens.scr.avt.ad.api.ADFacade;
import edu.wustl.xipHost.iterator.SubElement;
import edu.wustl.xipHost.iterator.TargetElement;

public class AVTRetrieve2 implements Runnable {
    final static Logger logger = Logger.getLogger(AVTRetrieve2.class);
    ADFacade adService = AVTFactory.getADServiceInstance();
    TargetElement targetElement;
    ADRetrieveTarget retrieveTarget;

    public AVTRetrieve2(TargetElement targetElement, ADRetrieveTarget retrieveTarget) throws IOException {
        this.targetElement = targetElement;
        this.retrieveTarget = retrieveTarget;
    }

    public void run() {
        try {
            logger.info("Executing AVT retrieve.");
            retrieve(targetElement, retrieveTarget);
            fireResultsAvailable(targetElement.getId());
        } catch (IOException e) {
            logger.error(e, e);
            return;
        }
    }

    SAXBuilder builder = new SAXBuilder();
    Document document;
    XMLOutputter outToXMLFile = new XMLOutputter();

    @SuppressWarnings("unchecked")
    void retrieve(TargetElement targetElement, ADRetrieveTarget retrieveTarget) throws IOException {
        List<SubElement> subElements = targetElement.getSubElements();
        Map<Integer, Object> dicomCriteria = null;
        Map<String, Object> adAimCriteria = null;
        File importDir = null;
        for (SubElement subElement : subElements) {
            dicomCriteria = subElement.getCriteria().getDICOMCriteria();
            adAimCriteria = subElement.getCriteria().getAIMCriteria();
            importDir = new File(subElement.getPath());
            if (adAimCriteria == null) {
                logger.debug("AD AIM criteria: " + adAimCriteria);
            } else {
                logger.debug("AD AIM retrieve criteria:");
                Set<String> keys = adAimCriteria.keySet();
                Iterator<String> iter = keys.iterator();
                while (iter.hasNext()) {
                    String key = iter.next();
                    String value = (String) adAimCriteria.get(key);
                    if (!value.isEmpty()) {
                        logger.debug("Key: " + key + " Value: " + value);
                    }
                }
            }
            //TODO: provide logging for DICOM criteria
            logger.debug("Import location: " + importDir.getCanonicalPath());
            logger.debug("Retrieve target: " + retrieveTarget.toString());

            File dirPath = importDir.getAbsoluteFile();
            if (retrieveTarget == ADRetrieveTarget.DICOM_AND_AIM) {
                //Retrieve DICOM
                List<DicomObject> retrievedDICOM = adService.retrieveDicomObjs(dicomCriteria, adAimCriteria);
                for (int i = 0; i < retrievedDICOM.size(); i++) {
                    DicomObject dicom = retrievedDICOM.get(i);
                    String filePrefix = dicom.getString(Tag.SOPInstanceUID);
                    String fileName = null;
                    IOFileFilter fileFilter = FileFilterUtils.trueFileFilter();
                    Iterator<File> tmpFiles = FileUtils.iterateFiles(importDir, fileFilter, null);
                    while (tmpFiles.hasNext()) {
                        File tmpFile = tmpFiles.next();
                        if (tmpFile.getName().startsWith(filePrefix)) {
                            fileName = tmpFile.getAbsolutePath();
                        }
                    }
                    FileOutputStream fos = new FileOutputStream(fileName);
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    DicomOutputStream dout = new DicomOutputStream(bos);
                    dout.writeDicomFile(dicom);
                    dout.close();
                }
                //Retrieve AIM      
                List<String> annotationUIDs = adService.findAnnotations(dicomCriteria, adAimCriteria);
                Set<String> uniqueAnnotUIDs = new HashSet<String>(annotationUIDs);
                Iterator<String> iter = uniqueAnnotUIDs.iterator();
                while (iter.hasNext()) {
                    String uid = iter.next();
                    ImageAnnotation loadedAnnot = adService.getAnnotation(uid);
                    String strXML = loadedAnnot.getAIM();
                    byte[] source = strXML.getBytes();
                    InputStream is = new ByteArrayInputStream(source);
                    try {
                        document = builder.build(is);
                    } catch (JDOMException e) {
                        logger.error(e, e);
                    }
                    //Ensure dirPath is correctly assign. There are references below of this variable
                    File outFile = new File(dirPath + File.separator + uid);
                    FileOutputStream outStream = new FileOutputStream(outFile);
                    outToXMLFile.output(document, outStream);
                    outStream.flush();
                    outStream.close();
                    //Retrieve DICOM SEG
                    //temporarily voided. AVTQuery needs to be modified to query for DICOM SEG objects
                    //
                    Set<String> dicomSegSOPInstanceUIDs = new HashSet<String>();
                    List<DicomObject> segObjects = adService.retrieveSegmentationObjects(uid);
                    for (int i = 0; i < segObjects.size(); i++) {
                        DicomObject dicom = segObjects.get(i);
                        String sopInstanceUID = dicom.getString(Tag.SOPInstanceUID);
                        //Check if DICOM SEG was not serialized in reference to another AIM
                        if (!dicomSegSOPInstanceUIDs.contains(sopInstanceUID)) {
                            dicomSegSOPInstanceUIDs.add(sopInstanceUID);
                            DicomObject dicomSeg = adService.getDicomObject(sopInstanceUID);
                            String message = "DICOM SEG " + sopInstanceUID + " cannot be loaded from file system!";
                            if (dicomSeg == null) {
                                throw new FileNotFoundException(message);
                            } else {
                                String filePrefix = sopInstanceUID;

                                IOFileFilter fileFilter = FileFilterUtils.trueFileFilter();
                                Iterator<File> tmpFiles = FileUtils.iterateFiles(importDir, fileFilter, null);
                                //DICOM SEG tmp file not found e.g. DICOM SEG belongs to not specified Study for which TargetIteratorRunner was not requested
                                boolean dicomSegFound = false;
                                while (tmpFiles.hasNext()) {
                                    File tmpFile = tmpFiles.next();
                                    if (tmpFile.getName().startsWith(filePrefix)) {
                                        dicomSegFound = true;
                                    }
                                }
                                if (dicomSegFound == true) {
                                    File outDicomSegFile = new File(dirPath + File.separator + sopInstanceUID);
                                    FileOutputStream fos = new FileOutputStream(outDicomSegFile);
                                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                                    DicomOutputStream dout = new DicomOutputStream(bos);
                                    dout.writeDicomFile(dicomSeg);
                                    dout.close();
                                } else if (dicomSegFound == false) {
                                    //There wouldn't be UUIDs for this case since it was not found with the TargetIteratorRunner
                                    //TODO: build notification, add to the MultiValueMap etc.
                                    //Eliminate duplicate code with dicomSegFound = true
                                    File outDicomSegFile = new File(dirPath + File.separator + sopInstanceUID);
                                    FileOutputStream fos = new FileOutputStream(outDicomSegFile);
                                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                                    DicomOutputStream dout = new DicomOutputStream(bos);
                                    dout.writeDicomFile(dicomSeg);
                                    dout.close();
                                }
                            }
                        }
                    } //     
                }
            } else if (retrieveTarget == ADRetrieveTarget.AIM_SEG) {
                //Retrieve AIM      
                List<String> annotationUIDs = adService.findAnnotations(dicomCriteria, adAimCriteria);
                Set<String> uniqueAnnotUIDs = new HashSet<String>(annotationUIDs);
                Iterator<String> iter = uniqueAnnotUIDs.iterator();
                Set<String> segDicomInstances = new HashSet<String>();
                while (iter.hasNext()) {
                    String uid = iter.next();
                    ImageAnnotation loadedAnnot = adService.getAnnotation(uid);
                    String strXML = loadedAnnot.getAIM();
                    byte[] source = strXML.getBytes();
                    InputStream is = new ByteArrayInputStream(source);
                    try {
                        document = builder.build(is);
                    } catch (JDOMException e) {
                        logger.error(e, e);
                    }
                    File outFile = new File(dirPath + uid + ".xml");
                    FileOutputStream outStream = new FileOutputStream(outFile);
                    outToXMLFile.output(document, outStream);
                    outStream.flush();
                    outStream.close();

                    List<DicomObject> segObjects = adService.retrieveSegmentationObjects(uid);
                    for (int i = 0; i < segObjects.size(); i++) {
                        DicomObject dicom = segObjects.get(i);
                        String sopInstanceUID = dicom.getString(Tag.SOPInstanceUID);
                        //Check of segDicom was not serialized in reference to another AIM
                        if (!segDicomInstances.contains(sopInstanceUID)) {
                            segDicomInstances.add(sopInstanceUID);
                            DicomObject segDicom = adService.getDicomObject(sopInstanceUID);
                            if (segDicom == null) {
                                String message = "DICOM SEG " + sopInstanceUID
                                        + " cannot be loaded from file system!";
                                throw new FileNotFoundException(message);
                            } else {
                                String filePrefix = sopInstanceUID;
                                String fileName = null;
                                IOFileFilter fileFilter = FileFilterUtils.trueFileFilter();
                                Iterator<File> tmpFiles = FileUtils.iterateFiles(importDir, fileFilter, null);
                                while (tmpFiles.hasNext()) {
                                    File tmpFile = tmpFiles.next();
                                    if (tmpFile.getName().startsWith(filePrefix)) {
                                        fileName = tmpFile.getName();
                                    }
                                }
                                DicomOutputStream dout = new DicomOutputStream(new FileOutputStream(fileName));
                                dout.writeDicomFile(segDicom);
                                dout.close();
                            }
                        }
                    }
                }
            }
        }
    }

    AVTRetrieve2Listener listener;

    public void addAVTListener(AVTRetrieve2Listener l) {
        listener = l;
    }

    void fireResultsAvailable(String targetElementID) {
        //instead of passing this, pass targetElement ID
        AVTRetrieve2Event event = new AVTRetrieve2Event(targetElementID);
        listener.retriveCompleted(event);
    }

}