Skip to content

Commit

Permalink
Improve DicomState to have more parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
nroduit committed Mar 29, 2021
1 parent 63959b5 commit 948ebc5
Show file tree
Hide file tree
Showing 9 changed files with 145 additions and 49 deletions.
6 changes: 6 additions & 0 deletions src/main/java/org/dcm4che3/tool/getscu/GetSCU.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ public String getCuid() {
private int cancelAfter;
private final DicomState state;
private DimseRSPHandler rspHandler;
private long totalSize = 0;

private BasicCStoreSCP storageSCP =
new BasicCStoreSCP("*") {
Expand All @@ -112,6 +113,7 @@ protected void store(
File file = new File(storageDir, TMP_DIR + File.separator + iuid);
try {
storeTo(as, as.createFileMetaInformation(iuid, cuid, tsuid), data, file);
totalSize += file.length();
renameTo(as, file, new File(storageDir, iuid));
} catch (Exception e) {
throw new DicomServiceException(Status.ProcessingFailure, e);
Expand Down Expand Up @@ -302,6 +304,10 @@ public DicomState getState() {
return state;
}

public long getTotalSize() {
return totalSize;
}

public void stop() {
try {
close();
Expand Down
21 changes: 15 additions & 6 deletions src/main/java/org/weasis/dicom/op/CFind.java
Original file line number Diff line number Diff line change
Expand Up @@ -128,15 +128,19 @@ public static DicomState process(
findSCU.addLevel(level.name());
}

DicomState dcmState = findSCU.getState();
for (DicomParam p : keys) {
addAttributes(findSCU.getKeys(), p);
String[] values = p.getValues();
if (values != null && values.length > 0) {
dcmState.addDicomMatchingKeys(p);
}
}
findSCU.setCancelAfter(cancelAfter);
findSCU.setPriority(options.getPriority());

service.start();
try {
DicomState dcmState = findSCU.getState();
long t1 = System.currentTimeMillis();
findSCU.open();
long t2 = System.currentTimeMillis();
Expand All @@ -150,7 +154,9 @@ public static DicomState process(
findSCU.getAAssociateRQ().getCalledAET(),
t2 - t1,
t3 - t2);
return DicomState.buildMessage(dcmState, timeMsg, null);
dcmState = DicomState.buildMessage(dcmState, timeMsg, null);
dcmState.addProcessTime(t1, t3);
return dcmState;
} catch (Exception e) {
LOGGER.error("findscu", e);
ServiceUtil.forceGettingAttributes(findSCU.getState(), findSCU);
Expand All @@ -161,10 +167,13 @@ public static DicomState process(
}
} catch (Exception e) {
LOGGER.error("findscu", e);
return new DicomState(
Status.UnableToProcess,
"DICOM Find failed" + StringUtil.COLON_AND_SPACE + e.getMessage(),
null);
return DicomState.buildMessage(
new DicomState(
Status.UnableToProcess,
"DICOM Find failed" + StringUtil.COLON_AND_SPACE + e.getMessage(),
null),
null,
e);
}
}

Expand Down
24 changes: 17 additions & 7 deletions src/main/java/org/weasis/dicom/op/CGet.java
Original file line number Diff line number Diff line change
Expand Up @@ -123,13 +123,17 @@ public static DicomState process(

configureRelatedSOPClass(getSCU, sopClassURL);

DicomState dcmState = getSCU.getState();
for (DicomParam p : keys) {
getSCU.addKey(p.getTag(), p.getValues());
String[] values = p.getValues();
getSCU.addKey(p.getTag(), values);
if (values != null && values.length > 0) {
dcmState.addDicomMatchingKeys(p);
}
}

service.start();
try {
DicomState dcmState = getSCU.getState();
long t1 = System.currentTimeMillis();
getSCU.open();
long t2 = System.currentTimeMillis();
Expand All @@ -143,7 +147,10 @@ public static DicomState process(
getSCU.getAAssociateRQ().getCalledAET(),
t2 - t1,
t3 - t2);
return DicomState.buildMessage(dcmState, timeMsg, null);
dcmState = DicomState.buildMessage(dcmState, timeMsg, null);
dcmState.addProcessTime(t1, t3);
dcmState.setBytesSize(getSCU.getTotalSize());
return dcmState;
} catch (Exception e) {
LOGGER.error("getscu", e);
ServiceUtil.forceGettingAttributes(getSCU.getState(), getSCU);
Expand All @@ -154,10 +161,13 @@ public static DicomState process(
}
} catch (Exception e) {
LOGGER.error("getscu", e);
return new DicomState(
Status.UnableToProcess,
"DICOM Get failed" + StringUtil.COLON_AND_SPACE + e.getMessage(),
null);
return DicomState.buildMessage(
new DicomState(
Status.UnableToProcess,
"DICOM Get failed" + StringUtil.COLON_AND_SPACE + e.getMessage(),
null),
null,
e);
}
}

Expand Down
23 changes: 16 additions & 7 deletions src/main/java/org/weasis/dicom/op/CMove.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,14 +90,18 @@ public static DicomState process(
options.getTsuidOrder(),
options.getQueryOptions().contains(QueryOption.RELATIONAL));

DicomState dcmState = moveSCU.getState();
for (DicomParam p : keys) {
moveSCU.addKey(p.getTag(), p.getValues());
String[] values = p.getValues();
moveSCU.addKey(p.getTag(), values);
if (values != null && values.length > 0) {
dcmState.addDicomMatchingKeys(p);
}
}
moveSCU.setDestination(destinationAet);

service.start();
try {
DicomState dcmState = moveSCU.getState();
long t1 = System.currentTimeMillis();
moveSCU.open();
long t2 = System.currentTimeMillis();
Expand All @@ -111,7 +115,9 @@ public static DicomState process(
moveSCU.getAAssociateRQ().getCalledAET(),
t2 - t1,
t3 - t2);
return DicomState.buildMessage(dcmState, timeMsg, null);
dcmState = DicomState.buildMessage(dcmState, timeMsg, null);
dcmState.addProcessTime(t1, t3);
return dcmState;
} catch (Exception e) {
LOGGER.error("movescu", e);
ServiceUtil.forceGettingAttributes(moveSCU.getState(), moveSCU);
Expand All @@ -122,10 +128,13 @@ public static DicomState process(
}
} catch (Exception e) {
LOGGER.error("movescu", e);
return new DicomState(
Status.UnableToProcess,
"DICOM Move failed" + StringUtil.COLON_AND_SPACE + e.getMessage(),
null);
return DicomState.buildMessage(
new DicomState(
Status.UnableToProcess,
"DICOM Move failed" + StringUtil.COLON_AND_SPACE + e.getMessage(),
null),
null,
e);
}
}

Expand Down
16 changes: 11 additions & 5 deletions src/main/java/org/weasis/dicom/op/CStore.java
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,10 @@ public static DicomState process(
t2 - t1,
t3 - t2,
FileUtil.humanReadableByte(storeSCU.getTotalSize(), false));
return DicomState.buildMessage(dcmState, timeMsg, null);
dcmState = DicomState.buildMessage(dcmState, timeMsg, null);
dcmState.addProcessTime(t1, t3);
dcmState.setBytesSize(storeSCU.getTotalSize());
return dcmState;
} catch (Exception e) {
LOGGER.error("storescu", e);
ServiceUtil.forceGettingAttributes(storeSCU.getState(), storeSCU);
Expand All @@ -184,10 +187,13 @@ public static DicomState process(
}
} catch (Exception e) {
LOGGER.error("storescu", e);
return new DicomState(
Status.UnableToProcess,
"DICOM Store failed" + StringUtil.COLON_AND_SPACE + e.getMessage(),
null);
return DicomState.buildMessage(
new DicomState(
Status.UnableToProcess,
"DICOM Store failed" + StringUtil.COLON_AND_SPACE + e.getMessage(),
null),
null,
e);
} finally {
FileUtil.safeClose(storeSCU);
}
Expand Down
7 changes: 5 additions & 2 deletions src/main/java/org/weasis/dicom/op/Echo.java
Original file line number Diff line number Diff line change
Expand Up @@ -100,15 +100,18 @@ public static DicomState process(
storeSCU.getAAssociateRQ().getCalledAET(),
t2 - t1,
t3 - t2);
return new DicomState(rsp.getInt(Tag.Status, Status.Success), message, null);
DicomState dcmState = new DicomState(rsp.getInt(Tag.Status, Status.Success), message, null);
dcmState.addProcessTime(t1, t3);
return dcmState;
} finally {
FileUtil.safeClose(storeSCU);
service.stop();
}
} catch (Exception e) {
String message = "DICOM Echo failed, storescu: " + e.getMessage();
LOGGER.error(message, e);
return new DicomState(Status.UnableToProcess, message, null);
return DicomState.buildMessage(
new DicomState(Status.UnableToProcess, message, null), null, e);
}
}
}
69 changes: 63 additions & 6 deletions src/main/java/org/weasis/dicom/param/DicomState.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,26 @@
*/
package org.weasis.dicom.param;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.net.Status;
import org.weasis.core.util.StringUtil;

public class DicomState {
private volatile int status;
private String message;
private final List<Attributes> dicomRSP;
private final DicomProgress progress;
private final List<DicomParam> dicomMatchingKeys;

private volatile int status;
private String message;
private String errorMessage;
private LocalDateTime startTransferDateTime;
private LocalDateTime endTransferDateTime;
private long bytesSize;

public DicomState() {
this(Status.Pending, null, null);
Expand All @@ -34,6 +43,8 @@ public DicomState(int status, String message, DicomProgress progress) {
this.message = message;
this.progress = progress;
this.dicomRSP = new ArrayList<>();
this.dicomMatchingKeys = new ArrayList<>();
this.bytesSize = -1;
}

/**
Expand Down Expand Up @@ -73,10 +84,55 @@ public List<Attributes> getDicomRSP() {
return dicomRSP;
}

public List<DicomParam> getDicomMatchingKeys() {
return dicomMatchingKeys;
}

public LocalDateTime getStartTransferDateTime() {
return startTransferDateTime;
}

public void setStartTransferDateTime(LocalDateTime startTransferDateTime) {
this.startTransferDateTime = startTransferDateTime;
}

public LocalDateTime getEndTransferDateTime() {
return endTransferDateTime;
}

public void setEndTransferDateTime(LocalDateTime endTransferDateTime) {
this.endTransferDateTime = endTransferDateTime;
}

public String getErrorMessage() {
return errorMessage;
}

public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}

public long getBytesSize() {
return bytesSize;
}

public void setBytesSize(long bytesSize) {
this.bytesSize = bytesSize;
}

public void addDicomRSP(Attributes dicomRSP) {
if (dicomRSP != null) {
this.dicomRSP.add(dicomRSP);
}
this.dicomRSP.add(dicomRSP);
}

public void addDicomMatchingKeys(DicomParam param) {
this.dicomMatchingKeys.add(param);
}

public void addProcessTime(long startTimeStamp, long endTimeStamp) {
setStartTransferDateTime(
Instant.ofEpochMilli(startTimeStamp).atZone(ZoneId.systemDefault()).toLocalDateTime());
setEndTransferDateTime(
Instant.ofEpochMilli(endTimeStamp).atZone(ZoneId.systemDefault()).toLocalDateTime());
}

public static DicomState buildMessage(DicomState dcmState, String timeMessage, Exception e) {
Expand Down Expand Up @@ -112,7 +168,8 @@ public static DicomState buildMessage(DicomState dcmState, String timeMessage, E
if (msg.length() > 0) {
msg.append(" ");
}
msg.append(e.getLocalizedMessage());
msg.append(e.getMessage());
state.setErrorMessage(e.getMessage());
}

if (p != null && p.getAttributes() != null) {
Expand Down
14 changes: 6 additions & 8 deletions src/test/java/org/weasis/dicom/CFindNetTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,12 @@ public void testProcess() {
Assert.assertNotNull(state);

List<Attributes> items = state.getDicomRSP();
if (items != null) {
for (int i = 0; i < items.size(); i++) {
Attributes item = items.get(i);
System.out.println("===========================================");
System.out.println("CFind Item " + (i + 1));
System.out.println("===========================================");
System.out.println(item.toString(100, 150));
}
for (int i = 0; i < items.size(); i++) {
Attributes item = items.get(i);
System.out.println("===========================================");
System.out.println("CFind Item " + (i + 1));
System.out.println("===========================================");
System.out.println(item.toString(100, 150));
}

System.out.println("DICOM Status:" + state.getStatus());
Expand Down
14 changes: 6 additions & 8 deletions src/test/java/org/weasis/dicom/ModalityWorklistNetTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,14 +88,12 @@ public void testProcess() {
Assert.assertNotNull(state);

List<Attributes> items = state.getDicomRSP();
if (items != null) {
for (int i = 0; i < items.size(); i++) {
Attributes item = items.get(i);
System.out.println("===========================================");
System.out.println("Worklist Item " + (i + 1));
System.out.println("===========================================");
System.out.println(item.toString(100, 150));
}
for (int i = 0; i < items.size(); i++) {
Attributes item = items.get(i);
System.out.println("===========================================");
System.out.println("Worklist Item " + (i + 1));
System.out.println("===========================================");
System.out.println(item.toString(100, 150));
}

System.out.println("DICOM Status:" + state.getStatus());
Expand Down

0 comments on commit 948ebc5

Please sign in to comment.