/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.dicom.codec; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import org.dcm4che3.data.Attributes; import org.dcm4che3.data.BulkData; import org.dcm4che3.data.Tag; import org.dcm4che3.util.StreamUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.weasis.core.api.gui.util.AppProperties; import org.weasis.core.api.media.MimeInspector; import org.weasis.core.api.media.data.Series; import org.weasis.core.api.media.data.TagW; import org.weasis.core.api.util.FileUtil; public class DicomEncapDocSeries extends Series<DicomEncapDocElement> implements FilesExtractor { private static final Logger LOGGER = LoggerFactory.getLogger(DicomEncapDocSeries.class); public DicomEncapDocSeries(String subseriesInstanceUID) { super(TagW.SubseriesInstanceUID, subseriesInstanceUID, DicomSeries.defaultTagView); } public DicomEncapDocSeries(DicomSeries dicomSeries) { super(TagW.SubseriesInstanceUID, dicomSeries.getTagValue(TagW.SubseriesInstanceUID), DicomSeries.defaultTagView); Iterator<Entry<TagW, Object>> iter = dicomSeries.getTagEntrySetIterator(); while (iter.hasNext()) { Entry<TagW, Object> e = iter.next(); setTag(e.getKey(), e.getValue()); } } @Override public void addMedia(DicomEncapDocElement media) { if (media != null && media.getMediaReader() instanceof DicomMediaIO) { DicomMediaIO dicomImageLoader = (DicomMediaIO) media.getMediaReader(); String extension = ".tmp"; //$NON-NLS-1$ Attributes ds = dicomImageLoader.getDicomObject(); String mime = ds.getString(Tag.MIMETypeOfEncapsulatedDocument); List<String> extensions = MimeInspector.getExtensions(mime); if (!extensions.isEmpty()) { extension = "." + extensions.get(0); //$NON-NLS-1$ } // see http://dicom.nema.org/MEDICAL/Dicom/current/output/chtml/part03/sect_C.24.2.html Object data = dicomImageLoader.getDicomObject().getValue(Tag.EncapsulatedDocument); if (data instanceof BulkData) { BulkData bulkData = (BulkData) data; FileInputStream in = null; FileOutputStream out = null; try { File file = File.createTempFile("encap_", extension, AppProperties.FILE_CACHE_DIR); //$NON-NLS-1$ in = new FileInputStream(media.getFile()); out = new FileOutputStream(file); StreamUtils.skipFully(in, bulkData.offset()); StreamUtils.copy(in, out, bulkData.length()); media.setDocument(file); this.add(media); } catch (Exception e) { LOGGER.error("Cannot extract encapsulated document", e); //$NON-NLS-1$ } finally { FileUtil.safeClose(out); FileUtil.safeClose(in); } } } } @Override public String getToolTips() { StringBuilder toolTips = new StringBuilder("<html>"); //$NON-NLS-1$ addToolTipsElement(toolTips, Messages.getString("DicomSeries.pat"), TagD.get(Tag.PatientName)); //$NON-NLS-1$ addToolTipsElement(toolTips, Messages.getString("DicomSeries.mod"), TagD.get(Tag.Modality)); //$NON-NLS-1$ addToolTipsElement(toolTips, Messages.getString("DicomSeries.series_nb"), TagD.get(Tag.SeriesNumber)); //$NON-NLS-1$ addToolTipsElement(toolTips, Messages.getString("DicomSeries.study"), TagD.get(Tag.StudyDescription)); //$NON-NLS-1$ addToolTipsElement(toolTips, Messages.getString("DicomSeries.series"), TagD.get(Tag.SeriesDescription)); //$NON-NLS-1$ addToolTipsElement(toolTips, Messages.getString("DicomSeries.date"), TagD.get(Tag.SeriesDate)); //$NON-NLS-1$ toolTips.append("</html>"); //$NON-NLS-1$ return toolTips.toString(); } @Override public String toString() { return (String) getTagValue(TagW.SubseriesInstanceUID); } @Override public String getMimeType() { return DicomMediaIO.SERIES_ENCAP_DOC_MIMETYPE; } @Override public List<File> getExtractFiles() { // Should have only one file as all the DicomEncapDocElement items are split in sub-series List<File> files = new ArrayList<>(); getMedias(null, null).forEach(dcm -> files.add(dcm.getExtractFile())); // Synchronized iteration with forEach return files; } }