From a967220ac1ee8b7ba6d83b342230c0db802d3561 Mon Sep 17 00:00:00 2001
From: Mike McKay <mfmckay@wustl.edu>
Date: Wed, 1 Jun 2016 16:34:28 -0500
Subject: [PATCH] XNAT-4271 Fix for Site Series Import Filter. Everything seems
 to be working now. Still needs some more testing though.

---
 .../methods/AnonymizationHandlerMethod.java   |  6 +-
 .../SeriesImportFilterHandlerMethod.java      | 92 +++++++++++++++++++
 .../xnat/spawner/site-admin-elements.yaml     |  3 +
 3 files changed, 98 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/org/nrg/xnat/event/listeners/methods/SeriesImportFilterHandlerMethod.java

diff --git a/src/main/java/org/nrg/xnat/event/listeners/methods/AnonymizationHandlerMethod.java b/src/main/java/org/nrg/xnat/event/listeners/methods/AnonymizationHandlerMethod.java
index 3b3fe215..720513b9 100644
--- a/src/main/java/org/nrg/xnat/event/listeners/methods/AnonymizationHandlerMethod.java
+++ b/src/main/java/org/nrg/xnat/event/listeners/methods/AnonymizationHandlerMethod.java
@@ -29,18 +29,18 @@ public class AnonymizationHandlerMethod extends AbstractSiteConfigPreferenceHand
     @Override
     public void handlePreferences(final Map<String, String> values) {
         if (!Collections.disjoint(PREFERENCES, values.keySet())) {
-            updateInactivityBeforeLockout();
+            updateAnon();
         }
     }
 
     @Override
     public void handlePreference(final String preference, final String value) {
         if(PREFERENCES.contains(preference)){
-            updateInactivityBeforeLockout();
+            updateAnon();
         }
     }
 
-	private void updateInactivityBeforeLockout(){
+	private void updateAnon(){
         try {
             if (XDAT.getSiteConfigPreferences().getEnableSitewideAnonymizationScript()) {
                 AnonUtils.getService().enableSiteWide(getAdminUser().getLogin(), DicomEdit.buildScriptPath(DicomEdit.ResourceScope.SITE_WIDE, null));
diff --git a/src/main/java/org/nrg/xnat/event/listeners/methods/SeriesImportFilterHandlerMethod.java b/src/main/java/org/nrg/xnat/event/listeners/methods/SeriesImportFilterHandlerMethod.java
new file mode 100644
index 00000000..2b35c2d2
--- /dev/null
+++ b/src/main/java/org/nrg/xnat/event/listeners/methods/SeriesImportFilterHandlerMethod.java
@@ -0,0 +1,92 @@
+package org.nrg.xnat.event.listeners.methods;
+
+import com.google.common.collect.ImmutableList;
+import org.nrg.dicomtools.filters.*;
+import org.nrg.xdat.XDAT;
+import org.nrg.xdat.security.helpers.Roles;
+import org.nrg.xdat.security.helpers.Users;
+import org.nrg.xft.security.UserI;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class SeriesImportFilterHandlerMethod extends AbstractSiteConfigPreferenceHandlerMethod {
+    @Override
+    public List<String> getHandledPreferences() {
+        return PREFERENCES;
+    }
+
+    @Override
+    public void handlePreferences(final Map<String, String> values) {
+        if (!Collections.disjoint(PREFERENCES, values.keySet())) {
+            updateSeriesImportFilter();
+        }
+    }
+
+    @Override
+    public void handlePreference(final String preference, final String value) {
+        if(PREFERENCES.contains(preference)){
+            updateSeriesImportFilter();
+        }
+    }
+
+	private void updateSeriesImportFilter(){
+        try {
+            final boolean enabled = XDAT.getSiteConfigPreferences().getEnableSitewideSeriesImportFilter();
+            final SeriesImportFilterMode mode = SeriesImportFilterMode.mode(XDAT.getSiteConfigPreferences().getSitewideSeriesImportFilterMode());
+            final String filterContents = XDAT.getSiteConfigPreferences().getSitewideSeriesImportFilter();
+            final SeriesImportFilter seriesImportFilter;
+            if (mode == SeriesImportFilterMode.ModalityMap) {
+                seriesImportFilter = new ModalityMapSeriesImportFilter(filterContents, enabled);
+            } else {
+                seriesImportFilter = new RegExBasedSeriesImportFilter(filterContents, mode, enabled);
+            }
+            if (!seriesImportFilter.equals(getSeriesImportFilter())) {
+                getDicomFilterService().commit(seriesImportFilter, getAdminUser().getLogin(), "Updated site-wide series import filter from administrator UI.");
+            }
+        }
+        catch(Exception e){
+            _log.error("Failed to update Series Import Filter.",e);
+        }
+    }
+
+    private static final Logger       _log        = LoggerFactory.getLogger(SeriesImportFilterHandlerMethod.class);
+    private static final List<String> PREFERENCES = ImmutableList.copyOf(Arrays.asList("enableSitewideSeriesImportFilter", "sitewideSeriesImportFilterMode", "sitewideSeriesImportFilter"));
+
+    private UserI getAdminUser() throws Exception {
+        for (String login : Users.getAllLogins()) {
+            final UserI user = Users.getUser(login);
+            if (Roles.isSiteAdmin(user)) {
+                return user;
+            }
+        }
+        return null;
+    }
+
+    private DicomFilterService getDicomFilterService() {
+        return XDAT.getContextService().getBean(DicomFilterService.class);
+    }
+
+    private SeriesImportFilter getSeriesImportFilter() {
+        DicomFilterService service = getDicomFilterService();
+        if (service != null) {
+            return service.getSeriesImportFilter();
+        }
+        else{
+            return null;
+        }
+    }
+
+    @Autowired
+    @Lazy
+    private JdbcTemplate _template;
+}
diff --git a/src/main/resources/META-INF/xnat/spawner/site-admin-elements.yaml b/src/main/resources/META-INF/xnat/spawner/site-admin-elements.yaml
index c3971c66..d6b7ecbe 100644
--- a/src/main/resources/META-INF/xnat/spawner/site-admin-elements.yaml
+++ b/src/main/resources/META-INF/xnat/spawner/site-admin-elements.yaml
@@ -971,6 +971,9 @@ seriesImportFilter:
                 blacklist:
                     label: Blacklist
                     value: blacklist
+                modalityMap:
+                    label: Modality Map
+                    value: modalityMap
         sitewideSeriesImportFilter:
             kind: panel.textarea
             id: sitewideSeriesImportFilter
-- 
GitLab