Skip to content

Commit

Permalink
Emit Audit Message "Data Export" on Verification of the Access State…
Browse files Browse the repository at this point in the history
… of objects stored on QStar Tape File System for each Series #4271
  • Loading branch information
gunterze committed Nov 2, 2023
1 parent a019447 commit 9889d66
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
query = "select l from Location l where l.storageID=?1 and l.status=?2"),
@NamedQuery(name = Location.FIND_BY_STATUS_CREATED_BEFORE,
query = "select new org.dcm4chee.arc.entity.Location$LocationWithUIDs(" +
"l, l.instance.sopClassUID, l.instance.sopInstanceUID, l.instance.series.study.studyInstanceUID) " +
"l, l.instance.sopClassUID, l.instance.sopInstanceUID, l.instance.series.seriesInstanceUID, l.instance.series.study.studyInstanceUID) " +
"from Location l where l.status=?1 and l.createdTime<?2"),
@NamedQuery(name = Location.FIND_BY_STUDY_PK,
query = "select l from Location l join fetch l.instance inst " +
Expand Down Expand Up @@ -184,12 +184,14 @@ public static class LocationWithUIDs {
public final Location location;
public final String sopClassUID;
public final String sopInstanceUID;
public final String seriesInstanceUID;
public final String studyInstanceUID;

public LocationWithUIDs(Location location, String sopClassUID, String sopInstanceUID, String studyInstanceUID) {
public LocationWithUIDs(Location location, String sopClassUID, String sopInstanceUID, String seriesInstanceUID, String studyInstanceUID) {
this.location = location;
this.sopClassUID = sopClassUID;
this.sopInstanceUID = sopInstanceUID;
this.seriesInstanceUID = seriesInstanceUID;
this.studyInstanceUID = studyInstanceUID;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,15 @@ public class QStarVerification {

public final LocationStatus status;
public final String studyInstanceUID;
public final String seriesInstanceUID;
public final String filePath;
public final List<SOPRef> sopRefs = new ArrayList<>();

public QStarVerification(LocationStatus status, String studyInstanceUID) {
public QStarVerification(LocationStatus status, String studyInstanceUID, String seriesInstanceUID, String filePath) {
this.status = status;
this.studyInstanceUID = studyInstanceUID;
this.seriesInstanceUID = seriesInstanceUID;
this.filePath = filePath;
}

public static final class SOPRef {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ protected void execute() {
storageDescriptor.getProperty("mountPath",
storageDescriptor.getStorageURI().getPath()));
String storagePath = mountPath + l.location.getStoragePath();
int tarPathEnd;
int tarPathEnd = -1;
LocationStatus status;
if (!storageDescriptor.isArchiveSeriesAsTAR() || (tarPathEnd = storagePath.indexOf('!')) < 0) {
status = conn.nextLocationStatus(l.location, storagePath);
Expand All @@ -124,8 +124,8 @@ protected void execute() {
verifiedTars.put(l.location.getMultiReference(), status);
}
}
qStarVerifications.get(status, l.studyInstanceUID).sopRefs.add(
new QStarVerification.SOPRef(l.sopClassUID, l.sopInstanceUID));
qStarVerifications.get(status, l.studyInstanceUID, l.seriesInstanceUID, storagePath, tarPathEnd).sopRefs
.add(new QStarVerification.SOPRef(l.sopClassUID, l.sopInstanceUID));
}
qStarVerifications.logAndFireEvents();
} while (locations.size() != fetchSize && arcDev.getQStarVerificationPollingInterval() != null);
Expand Down Expand Up @@ -215,34 +215,45 @@ public void close() {
}

private final class QStarVerifications {
final EnumMap<LocationStatus, Map<String, QStarVerification>> byStatus =
final EnumMap<LocationStatus, Map<String, Map<String, QStarVerification>>> byStatus =
new EnumMap<>(LocationStatus.class);

QStarVerification get(LocationStatus status, String studyInstanceUID) {
Map<String, QStarVerification> withStatus = byStatus.get(status);
QStarVerification get(LocationStatus status, String studyInstanceUID, String seriesInstanceUID,
String storagePath, int tarPathEnd) {
Map<String, Map<String, QStarVerification>> withStatus = byStatus.get(status);
if (withStatus == null) {
byStatus.put(status,
withStatus = new HashMap<>());
}
QStarVerification qStarVerification = withStatus.get(studyInstanceUID);
Map<String, QStarVerification> bySeriesUID = withStatus.get(studyInstanceUID);
if (bySeriesUID == null) {
withStatus.put(studyInstanceUID,
bySeriesUID = new HashMap<>());
}
QStarVerification qStarVerification = bySeriesUID.get(seriesInstanceUID);
if (qStarVerification == null) {
withStatus.put(studyInstanceUID, qStarVerification =
new QStarVerification(status, studyInstanceUID));
bySeriesUID.put(studyInstanceUID, qStarVerification =
new QStarVerification(status, studyInstanceUID, seriesInstanceUID,
tarPathEnd < 0 ? storagePath : storagePath.substring(0, tarPathEnd)));
}
return qStarVerification;
}

void logAndFireEvents() {
for (Map<String, QStarVerification> withStatus : byStatus.values()) {
for (QStarVerification qStarVerification : withStatus.values()) {
LOG.info("Update status of {} objects of Study[uid={}] to {}",
qStarVerification.sopRefs.size(),
qStarVerification.studyInstanceUID,
qStarVerification.status);
try {
event.fire(qStarVerification);
} catch (Exception e) {
LOG.warn("Processing of notification about {} failed:\n", qStarVerification, e);
for (Map<String, Map<String, QStarVerification>> withStatus : byStatus.values()) {
for (Map<String, QStarVerification> bySeriesUID : withStatus.values()) {
for (QStarVerification qStarVerification : bySeriesUID.values()) {
LOG.info("Update status of {} objects of Series[uid={}] of Study[uid={}] stored in {} to {}",
qStarVerification.sopRefs.size(),
qStarVerification.seriesInstanceUID,
qStarVerification.studyInstanceUID,
qStarVerification.filePath,
qStarVerification.status);
try {
event.fire(qStarVerification);
} catch (Exception e) {
LOG.warn("Processing of notification about {} failed:\n", qStarVerification, e);
}
}
}
}
Expand Down

0 comments on commit 9889d66

Please sign in to comment.