Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mail sender, fix transfers dicom, modality + sop class uid in monitoring/notification #198 #199 #200 #201

Merged
merged 6 commits into from
Feb 22, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/maven.yml
Original file line number Diff line number Diff line change
@@ -11,9 +11,14 @@ jobs:
build:
name: Build
runs-on: ubuntu-latest

env:
PUSH_PACKAGES: ${{ github.event_name == 'push' }}
steps:
- name: Setup NODE
uses: actions/setup-node@v2
with:
node-version: "16"
- uses: actions/checkout@v3
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
@@ -32,7 +32,7 @@
<javax.el.version>3.0.0</javax.el.version>
<javax.mail.version>1.6.2</javax.mail.version>
<vaadin.version>21.0.9</vaadin.version>
<weasis-dicom-tools.version>5.29.0.1</weasis-dicom-tools.version>
<weasis-dicom-tools.version>5.29.0.2</weasis-dicom-tools.version>
<weasis.opencv.native.version>4.6.0-dcm</weasis.opencv.native.version>
<springdoc.version>1.6.12</springdoc.version>
<mockito.version>4.2.0</mockito.version>
2 changes: 0 additions & 2 deletions src/main/java/org/karnak/backend/constant/Notification.java
Original file line number Diff line number Diff line change
@@ -23,8 +23,6 @@ public class Notification {

public static final String DEFAULT_INTERVAL = "45";

public static final String MAIL_SMTP_SENDER = "[email protected]";

// Thymeleaf
public static final String CONTEXT_THYMELEAF = "notif";

Original file line number Diff line number Diff line change
@@ -81,7 +81,7 @@ public EchoController(final EchoService echoService) {
*/
@GetMapping(
value = {EndPoint.DESTINATIONS_PATH},
produces = {MediaType.APPLICATION_XML_VALUE})
produces = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<DestinationEchos> retrieveStatusConfiguredDestinations(
@RequestParam(value = EndPoint.SRC_AET_PARAM) String srcAet) {

139 changes: 65 additions & 74 deletions src/main/java/org/karnak/backend/data/entity/TransferStatusEntity.java
Original file line number Diff line number Diff line change
@@ -97,6 +97,10 @@ public class TransferStatusEntity implements Serializable {

private String sopInstanceUidToSend;

private String modality;

private String sopClassUid;

public TransferStatusEntity() {
}

@@ -123,7 +127,9 @@ public TransferStatusEntity(
String serieDescriptionToSend,
LocalDateTime serieDateToSend,
String serieUidToSend,
String sopInstanceUidToSend) {
String sopInstanceUidToSend,
String modality,
String sopClassUid) {
this.forwardNodeId = forwardNodeId;
this.destinationId = destinationId;
this.transferDate = transferDate;
@@ -147,6 +153,8 @@ public TransferStatusEntity(
this.serieDateToSend = serieDateToSend;
this.serieUidToSend = serieUidToSend;
this.sopInstanceUidToSend = sopInstanceUidToSend;
this.modality = modality;
this.sopClassUid = sopClassUid;
}

public static TransferStatusEntity buildTransferStatusEntity(
@@ -155,7 +163,9 @@ public static TransferStatusEntity buildTransferStatusEntity(
Attributes attributesOriginal,
Attributes attributesToSend,
boolean sent,
String reason) {
String reason,
String modality,
String sopClassUid) {
return new TransferStatusEntity(
forwardNodeId,
destinationId,
@@ -187,7 +197,8 @@ public static TransferStatusEntity buildTransferStatusEntity(
DateUtil.getDicomDate(attributesToSend.getString(Tag.SeriesDate)),
DateUtil.getDicomTime(attributesToSend.getString(Tag.SeriesTime))),
attributesToSend.getString(Tag.SeriesInstanceUID),
attributesToSend.getString(Tag.SOPInstanceUID));
attributesToSend.getString(Tag.SOPInstanceUID),
modality, sopClassUid);
}

@Id
@@ -410,6 +421,22 @@ public void setSopInstanceUidToSend(String sopInstanceUidToSend) {
this.sopInstanceUidToSend = sopInstanceUidToSend;
}

public String getModality() {
return modality;
}

public void setModality(String modality) {
this.modality = modality;
}

public String getSopClassUid() {
return sopClassUid;
}

public void setSopClassUid(String sopClassUid) {
this.sopClassUid = sopClassUid;
}

@Override
public boolean equals(Object o) {
if (this == o) {
@@ -444,7 +471,9 @@ public boolean equals(Object o) {
&& Objects.equals(serieDescriptionToSend, that.serieDescriptionToSend)
&& Objects.equals(serieDateToSend, that.serieDateToSend)
&& Objects.equals(serieUidToSend, that.serieUidToSend)
&& Objects.equals(sopInstanceUidToSend, that.sopInstanceUidToSend);
&& Objects.equals(sopInstanceUidToSend, that.sopInstanceUidToSend)
&& Objects.equals(modality, that.modality)
&& Objects.equals(sopClassUid, that.sopClassUid);
}

@Override
@@ -475,79 +504,41 @@ public int hashCode() {
serieDescriptionToSend,
serieDateToSend,
serieUidToSend,
sopInstanceUidToSend);
sopInstanceUidToSend,
modality, sopClassUid);
}

@Override
public String toString() {
return "TransferStatusEntity{"
+ "id="
+ id
+ ", forwardNodeEntity="
+ forwardNodeEntity
+ ", forwardNodeId="
+ forwardNodeId
+ ", destinationEntity="
+ destinationEntity
+ ", destinationId="
+ destinationId
+ ", transferDate="
+ transferDate
+ ", sent="
+ sent
+ ", reason='"
+ reason
+ '\''
+ ", patientIdOriginal='"
+ patientIdOriginal
+ '\''
+ ", accessionNumberOriginal='"
+ accessionNumberOriginal
+ '\''
+ ", studyDescriptionOriginal='"
+ studyDescriptionOriginal
+ '\''
+ ", studyDateOriginal="
+ studyDateOriginal
+ ", studyUidOriginal='"
+ studyUidOriginal
+ '\''
+ ", serieDescriptionOriginal='"
+ serieDescriptionOriginal
+ '\''
+ ", serieDateOriginal="
+ serieDateOriginal
+ ", serieUidOriginal='"
+ serieUidOriginal
+ '\''
+ ", sopInstanceUidOriginal='"
+ sopInstanceUidOriginal
+ '\''
+ ", patientIdToSend='"
+ patientIdToSend
+ '\''
+ ", accessionNumberToSend='"
+ accessionNumberToSend
+ '\''
+ ", studyDescriptionToSend='"
+ studyDescriptionToSend
+ '\''
+ ", studyDateToSend="
+ studyDateToSend
+ ", studyUidToSend='"
+ studyUidToSend
+ '\''
+ ", serieDescriptionToSend='"
+ serieDescriptionToSend
+ '\''
+ ", serieDateToSend="
+ serieDateToSend
+ ", serieUidToSend='"
+ serieUidToSend
+ '\''
+ ", sopInstanceUidToSend='"
+ sopInstanceUidToSend
+ '\''
+ '}';
return "TransferStatusEntity{" +
"id=" + id +
", forwardNodeEntity=" + forwardNodeEntity +
", forwardNodeId=" + forwardNodeId +
", destinationEntity=" + destinationEntity +
", destinationId=" + destinationId +
", transferDate=" + transferDate +
", sent=" + sent +
", reason='" + reason + '\'' +
", patientIdOriginal='" + patientIdOriginal + '\'' +
", accessionNumberOriginal='" + accessionNumberOriginal + '\'' +
", studyDescriptionOriginal='" + studyDescriptionOriginal + '\'' +
", studyDateOriginal=" + studyDateOriginal +
", studyUidOriginal='" + studyUidOriginal + '\'' +
", serieDescriptionOriginal='" + serieDescriptionOriginal + '\'' +
", serieDateOriginal=" + serieDateOriginal +
", serieUidOriginal='" + serieUidOriginal + '\'' +
", sopInstanceUidOriginal='" + sopInstanceUidOriginal + '\'' +
", patientIdToSend='" + patientIdToSend + '\'' +
", accessionNumberToSend='" + accessionNumberToSend + '\'' +
", studyDescriptionToSend='" + studyDescriptionToSend + '\'' +
", studyDateToSend=" + studyDateToSend +
", studyUidToSend='" + studyUidToSend + '\'' +
", serieDescriptionToSend='" + serieDescriptionToSend + '\'' +
", serieDateToSend=" + serieDateToSend +
", serieUidToSend='" + serieUidToSend + '\'' +
", sopInstanceUidToSend='" + sopInstanceUidToSend + '\'' +
", modality='" + modality + '\'' +
", sopClassUid='" + sopClassUid + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
@@ -10,8 +10,8 @@
package org.karnak.backend.model.notification;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import org.karnak.backend.constant.Notification;

/**
@@ -29,7 +29,11 @@ public class SerieSummaryNotification {

private long nbTransferNotSent;

private List<String> unTransferedReasons;
private Set<String> unTransferedReasons;

private Set<String> transferredModalities;

private Set<String> transferredSopClassUid;

public String getSerieUid() {
return serieUid;
@@ -71,44 +75,62 @@ public void setNbTransferNotSent(long nbTransferNotSent) {
this.nbTransferNotSent = nbTransferNotSent;
}

public List<String> getUnTransferedReasons() {
public Set<String> getUnTransferedReasons() {
return unTransferedReasons;
}

public void setUnTransferedReasons(List<String> unTransferedReasons) {
public void setUnTransferedReasons(Set<String> unTransferedReasons) {
this.unTransferedReasons = unTransferedReasons;
}

public Set<String> getTransferredModalities() {
return transferredModalities;
}

public void setTransferredModalities(Set<String> transferredModalities) {
this.transferredModalities = transferredModalities;
}

public Set<String> getTransferredSopClassUid() {
return transferredSopClassUid;
}

public void setTransferredSopClassUid(Set<String> transferredSopClassUid) {
this.transferredSopClassUid = transferredSopClassUid;
}

@Override
public boolean equals(Object o) {

if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
SerieSummaryNotification that = (SerieSummaryNotification) o;
return nbTransferSent == that.nbTransferSent
&& nbTransferNotSent == that.nbTransferNotSent
&& Objects.equals(serieUid, that.serieUid)
&& Objects.equals(serieDescription, that.serieDescription)
&& Objects.equals(serieDate, that.serieDate)
&& Objects.equals(unTransferedReasons, that.unTransferedReasons);
return nbTransferSent == that.nbTransferSent && nbTransferNotSent == that.nbTransferNotSent
&& Objects.equals(serieUid, that.serieUid) && Objects.equals(
serieDescription, that.serieDescription) && Objects.equals(serieDate,
that.serieDate) && Objects.equals(unTransferedReasons, that.unTransferedReasons)
&& Objects.equals(transferredModalities, that.transferredModalities)
&& Objects.equals(transferredSopClassUid, that.transferredSopClassUid);
}

@Override
public int hashCode() {
return Objects.hash(
serieUid,
serieDescription,
serieDate,
nbTransferSent,
nbTransferNotSent,
unTransferedReasons);
return Objects.hash(serieUid, serieDescription, serieDate, nbTransferSent, nbTransferNotSent,
unTransferedReasons, transferredModalities, transferredSopClassUid);
}

public String toStringUnTransferredReasons() {
return String.join(Notification.COMMA_SEPARATOR, unTransferedReasons);
}

public String toStringTransferredModalities() {
return String.join(Notification.COMMA_SEPARATOR, transferredModalities);
}

public String toStringTransferredSopClassUid() {
return String.join(Notification.COMMA_SEPARATOR, transferredSopClassUid);
}
}
8 changes: 5 additions & 3 deletions src/main/java/org/karnak/backend/service/EchoService.java
Original file line number Diff line number Diff line change
@@ -77,8 +77,9 @@ private void fillDestinationsStatus(
destinations.forEach(
destination -> {
// Case DICOM
if (destination instanceof DicomForwardDestination d) {
DicomNode calledNode = d.getStreamSCU().getCalledNode();
if (destination instanceof DicomForwardDestination) {
DicomNode calledNode =
((DicomForwardDestination) destination).getStreamSCU().getCalledNode();
// Retrieve the status of the dicom node
DicomState dicomState =
Echo.process(buildEchoProcessParams(3000, 5000), sourceNode, calledNode);
@@ -87,7 +88,8 @@ private void fillDestinationsStatus(
new DestinationEcho(calledNode.getAet(), null, dicomState.getStatus()));
}
// Case Stow
else if (destination instanceof WebForwardDestination d) {
else if (destination instanceof WebForwardDestination) {
WebForwardDestination d = (WebForwardDestination) destination;
// Add the destination and its status
destinationEchos.add(new DestinationEcho(null, d.getRequestURL(), 0));
}
Loading