package org.weasis.acquire.explorer;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.swing.SwingWorker;
import org.dcm4che3.data.Tag;
import org.dcm4che3.util.UIDUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.weasis.core.api.media.data.TagW;
import org.weasis.core.api.service.BundleTools;
import org.weasis.core.api.util.FileUtil;
import org.weasis.dicom.codec.TagD;
import org.weasis.dicom.op.CStore;
import org.weasis.dicom.param.AdvancedParams;
import org.weasis.dicom.param.ConnectOptions;
import org.weasis.dicom.param.DicomNode;
import org.weasis.dicom.param.DicomProgress;
import org.weasis.dicom.param.DicomState;
/**
* Do the process of publish DICOM files from the given temporary folder. Operation is a CSTORE to a DICOM node
* destination. All the job is done outside of the EDT instead of setting AcquireImageStatus change and removing related
* Acquired Images from the dataModel. But, full process progression can still be listened with propertyChange
* notification of this workerTask.
*
* @version $Rev$ $Date$
*/
public class PublishDicomTask extends SwingWorker<DicomState, File> {
private static final Logger LOGGER = LoggerFactory.getLogger(PublishDicomTask.class);
private final File exportDirDicom;
private final DicomNode callingNode;
private final DicomNode destinationNode;
private final DicomProgress dicomProgress = new DicomProgress();
public PublishDicomTask(File exportDirDicom, DicomNode destinationNode) {
this.exportDirDicom = Objects.requireNonNull(exportDirDicom);
this.destinationNode = Objects.requireNonNull(destinationNode);
this.callingNode = new DicomNode(BundleTools.SYSTEM_PREFERENCES.getProperty("weasis.aet", "WEASIS_AE")); //$NON-NLS-1$ //$NON-NLS-2$
LOGGER.debug("destinationNode is : {}", destinationNode); //$NON-NLS-1$
initDicomProgress();
}
private void initDicomProgress() {
dicomProgress.addProgressListener(progress -> {
int completed = progress.getNumberOfCompletedSuboperations() + progress.getNumberOfFailedSuboperations();
int remaining = progress.getNumberOfRemainingSuboperations();
setProgress((completed * 100) / (completed + remaining));
publish(progress.getProcessedFile());
});
}
@Override
protected DicomState doInBackground() throws Exception {
List<String> exportFilesDicomPath = new ArrayList<>();
exportFilesDicomPath.add(exportDirDicom.getPath());
AdvancedParams params = new AdvancedParams();
ConnectOptions connectOptions = new ConnectOptions();
connectOptions.setConnectTimeout(3000);
connectOptions.setAcceptTimeout(5000);
params.setConnectOptions(connectOptions);
try {
return CStore.process(params, callingNode, destinationNode, exportFilesDicomPath, dicomProgress);
} finally {
FileUtil.recursiveDelete(exportDirDicom);
}
}
@Override
protected void process(List<File> chunks) {
if (!dicomProgress.isLastFailed()) {
chunks.stream().filter(Objects::nonNull).map(imageFile -> AcquireManager.findByUId(imageFile.getName()))
.filter(Objects::nonNull).forEach(imageInfo -> {
imageInfo.setStatus(AcquireImageStatus.PUBLISHED);
imageInfo.getImage().setTag(TagW.Checked, Boolean.TRUE);
AcquireManager.getInstance().removeImage(imageInfo);
});
}
}
@Override
protected void done() {
super.done();
// Change to a new exman after publishing (avoid to reuse the same exam)
AcquireManager.GLOBAL.setTag(TagD.get(Tag.StudyInstanceUID), UIDUtils.createUID());
}
}