From f93dd33e20ec054016a2b065deefb05a287d786a Mon Sep 17 00:00:00 2001
From: Mike McKay <mfmckay@wustl.edu>
Date: Fri, 3 Jun 2016 16:05:00 -0500
Subject: [PATCH] XNAT-4255 Added PET Tracers to AdminUI.

---
 .../xnat/configuration/SchedulerConfig.java   |  1 +
 .../methods/PetTracerHandlerMethod.java       | 63 +++++++++++++++++++
 .../xnat/spawner/site-admin-elements.yaml     | 21 ++++++-
 3 files changed, 84 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/org/nrg/xnat/event/listeners/methods/PetTracerHandlerMethod.java

diff --git a/src/main/java/org/nrg/xnat/configuration/SchedulerConfig.java b/src/main/java/org/nrg/xnat/configuration/SchedulerConfig.java
index 35f8b20e..991f1ab6 100644
--- a/src/main/java/org/nrg/xnat/configuration/SchedulerConfig.java
+++ b/src/main/java/org/nrg/xnat/configuration/SchedulerConfig.java
@@ -52,6 +52,7 @@ public class SchedulerConfig implements SchedulingConfigurer {
         _eventService.triggerEvent(new PreferenceEvent("archivePath", String.valueOf(XDAT.getSiteConfigPreferences().getArchivePath())));
         _eventService.triggerEvent(new PreferenceEvent("security.services.role.default", String.valueOf(XDAT.getSiteConfigPreferences().getRoleService())));
         _eventService.triggerEvent(new PreferenceEvent("checksums", String.valueOf(XDAT.getSiteConfigPreferences().getChecksums())));
+        _eventService.triggerEvent(new PreferenceEvent("sitewidePetTracers", String.valueOf(XDAT.getSiteConfigPreferences().getSitewidePetTracers())));
         for (final TriggerTask triggerTask : _triggerTasks) {
             taskRegistrar.addTriggerTask(triggerTask);
         }
diff --git a/src/main/java/org/nrg/xnat/event/listeners/methods/PetTracerHandlerMethod.java b/src/main/java/org/nrg/xnat/event/listeners/methods/PetTracerHandlerMethod.java
new file mode 100644
index 00000000..6e2c5d23
--- /dev/null
+++ b/src/main/java/org/nrg/xnat/event/listeners/methods/PetTracerHandlerMethod.java
@@ -0,0 +1,63 @@
+package org.nrg.xnat.event.listeners.methods;
+
+import com.google.common.collect.ImmutableList;
+import org.nrg.xdat.XDAT;
+import org.nrg.xdat.security.helpers.Users;
+import org.nrg.xdat.security.services.RoleHolder;
+import org.nrg.xft.security.UserI;
+import org.nrg.xnat.services.PETTracerUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class PetTracerHandlerMethod extends AbstractSiteConfigPreferenceHandlerMethod {
+    @Override
+    public List<String> getHandledPreferences() {
+        return PREFERENCES;
+    }
+
+    @Override
+    public void handlePreferences(final Map<String, String> values) {
+        if (!Collections.disjoint(PREFERENCES, values.keySet())) {
+            updatePetTracer();
+        }
+    }
+
+    @Override
+    public void handlePreference(final String preference, final String value) {
+        if(PREFERENCES.contains(preference)){
+            updatePetTracer();
+        }
+    }
+
+	private void updatePetTracer(){
+        try {
+            PETTracerUtils.getService().setSiteWideTracerList(getAdminUser().getLogin(), PETTracerUtils.buildScriptPath(PETTracerUtils.ResourceScope.SITE_WIDE, ""), XDAT.getSiteConfigPreferences().getSitewidePetTracers());
+        }
+        catch(Exception e){
+            _log.error("Failed to set sitewide anon script.",e);
+        }
+    }
+
+    private static final Logger       _log        = LoggerFactory.getLogger(PetTracerHandlerMethod.class);
+    private static final List<String> PREFERENCES = ImmutableList.copyOf(Arrays.asList("sitewidePetTracers"));
+
+    private UserI getAdminUser() throws Exception {
+        for (String login : Users.getAllLogins()) {
+            final UserI user = Users.getUser(login);
+            if (_roleHolder.isSiteAdmin(user)) {
+                return user;
+            }
+        }
+        return null;
+    }
+    @Autowired
+    private RoleHolder _roleHolder;
+}
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 50f11c17..20dd472d 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
@@ -945,7 +945,7 @@ anonymization:
 seriesImportFilter:
     kind: panel.form
     name: seriesImportFilter
-    label: "Series Import Filter"
+    label: "Series Import Filter (Site Wide)"
     method: POST
     contentType: json
     action: /xapi/siteConfig/batch
@@ -984,6 +984,24 @@ seriesImportFilter:
                 <a href="http://docs.oracle.com/javase/tutorial/essential/regex/" target="_blank">Java regular expression syntax</a>. These expressions are case-insensitive, 
                 i.e. the string "SAG LOCALIZER" will also match "Sag Localizer".
 
+petTracers:
+    kind: panel.form
+    name: petTracers
+    label: "Pet Tracers (Site Wide)"
+    method: POST
+    contentType: json
+    action: /xapi/siteConfig/batch
+    load: XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
+    contents:
+        sitewidePetTracers:
+            kind: panel.textarea
+            id: sitewidePetTracers
+            name: sitewidePetTracers
+            label: "Pet Tracers"
+            description: >
+                This is the site-wide list of PET tracers. List entries should be separated by whitespace. This list can also be replaced at the project level.
+
 sessionUploadMethod:
     kind: panel.form
     name: sessionUploadMethod
@@ -1312,6 +1330,7 @@ adminPage:
             contents:
                 ${anonymization}
                 ${seriesImportFilter}
+                ${petTracers}
                 ${sessionUploadMethod}
         dicomScpReceivers:
             kind: tab
-- 
GitLab