/*******************************************************************************
* 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.explorer.wado;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.dcm4che3.data.Tag;
import org.dcm4che3.util.UIDUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.weasis.core.api.explorer.model.DataExplorerModel;
import org.weasis.core.api.media.data.MediaSeriesGroup;
import org.weasis.core.api.media.data.MediaSeriesGroupNode;
import org.weasis.core.api.media.data.Series;
import org.weasis.core.api.media.data.TagW;
import org.weasis.core.api.service.BundleTools;
import org.weasis.dicom.codec.DicomInstance;
import org.weasis.dicom.codec.DicomSeries;
import org.weasis.dicom.codec.TagD;
import org.weasis.dicom.codec.TagD.Level;
import org.weasis.dicom.codec.wado.WadoParameters;
import org.weasis.dicom.explorer.DicomModel;
import org.weasis.dicom.explorer.ExplorerTask;
import org.weasis.dicom.explorer.Messages;
public class LoadRemoteDicomURL extends ExplorerTask<Boolean, String> {
private static final Logger LOGGER = LoggerFactory.getLogger(LoadRemoteDicomURL.class);
private final URL[] urls;
private final DicomModel dicomModel;
public LoadRemoteDicomURL(String[] urls, DataExplorerModel explorerModel) {
super(Messages.getString("DicomExplorer.loading"), true); //$NON-NLS-1$
if (urls == null || !(explorerModel instanceof DicomModel)) {
throw new IllegalArgumentException("invalid parameters"); //$NON-NLS-1$
}
URL[] urlRef = new URL[urls.length];
for (int i = 0; i < urls.length; i++) {
if (urls[i] != null) {
try {
urlRef[i] = new URL(urls[i]);
} catch (MalformedURLException e) {
LOGGER.error("Not a valid URL", e); //$NON-NLS-1$
}
}
}
this.urls = urlRef;
this.dicomModel = (DicomModel) explorerModel;
}
public LoadRemoteDicomURL(URL[] urls, DataExplorerModel explorerModel) {
super(Messages.getString("DicomExplorer.loading"), true); //$NON-NLS-1$
if (urls == null || !(explorerModel instanceof DicomModel)) {
throw new IllegalArgumentException("invalid parameters"); //$NON-NLS-1$
}
this.urls = urls;
this.dicomModel = (DicomModel) explorerModel;
}
@Override
protected Boolean doInBackground() throws Exception {
String seriesUID = null;
for (int i = 0; i < urls.length; i++) {
if (urls[i] != null) {
seriesUID = urls[i].toString();
break;
}
}
if (seriesUID != null) {
String unknown = TagW.NO_VALUE;
MediaSeriesGroup patient = new MediaSeriesGroupNode(TagD.getUID(Level.PATIENT), UIDUtils.createUID(),
DicomModel.patient.getTagView());
patient.setTag(TagD.get(Tag.PatientID), unknown);
patient.setTag(TagD.get(Tag.PatientName), unknown);
dicomModel.addHierarchyNode(MediaSeriesGroupNode.rootNode, patient);
MediaSeriesGroup study =
new MediaSeriesGroupNode(TagD.getUID(Level.STUDY), UIDUtils.createUID(), DicomModel.study.getTagView());
dicomModel.addHierarchyNode(patient, study);
Series dicomSeries = new DicomSeries(seriesUID);
dicomSeries.setTag(TagW.ExplorerModel, dicomModel);
dicomSeries.setTag(TagD.get(Tag.SeriesInstanceUID), seriesUID);
final WadoParameters wadoParameters = new WadoParameters("", false, "", null, null); //$NON-NLS-1$ //$NON-NLS-2$
dicomSeries.setTag(TagW.WadoParameters, wadoParameters);
List<DicomInstance> dicomInstances = new ArrayList<>();
dicomSeries.setTag(TagW.WadoInstanceReferenceList, dicomInstances);
dicomModel.addHierarchyNode(study, dicomSeries);
for (int i = 0; i < urls.length; i++) {
if (urls[i] != null) {
String url = urls[i].toString();
DicomInstance dcmInstance = new DicomInstance(url);
dcmInstance.setDirectDownloadFile(url);
dicomInstances.add(dcmInstance);
}
}
if (!dicomInstances.isEmpty()) {
String modality = TagD.getTagValue(dicomSeries, Tag.Modality, String.class);
boolean ps = modality != null && ("PR".equals(modality) || "KO".equals(modality)); //$NON-NLS-1$ //$NON-NLS-2$
final LoadSeries loadSeries = new LoadSeries(dicomSeries, dicomModel,
BundleTools.SYSTEM_PREFERENCES.getIntProperty(LoadSeries.CONCURRENT_DOWNLOADS_IN_SERIES, 4), true);
if (!ps) {
loadSeries.startDownloadImageReference(wadoParameters);
}
loadSeries.setPriority(new DownloadPriority(patient, study, dicomSeries, true));
DownloadManager.addLoadSeries(loadSeries, dicomModel, true);
DownloadManager.CONCURRENT_EXECUTOR.prestartAllCoreThreads();
}
}
return true;
}
}