From 2a2737e03ce5c5cd0e30ec9eac3715f34180e1e4 Mon Sep 17 00:00:00 2001
From: Rick Herrick <jrherrick@wustl.edu>
Date: Thu, 21 Jul 2016 18:39:19 -0500
Subject: [PATCH] XNAT-2429 Workaround for weird error where
 XnatRestletExtensions beans aren't being loaded by
 ApplicationContext.getBeansOfType().

---
 build.gradle                                  |  2 +-
 .../xnat/configuration/ApplicationConfig.java |  2 +-
 .../org/nrg/xnat/configuration/OrmConfig.java |  5 +-
 .../tasks/SystemPathVerification.java         | 79 ++++++++++---------
 .../org/nrg/xnat/restlet/XNATApplication.java | 19 +++--
 5 files changed, 61 insertions(+), 46 deletions(-)

diff --git a/build.gradle b/build.gradle
index 4f42c9e0..ec3573df 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
 def vXnat = '1.7.0-SNAPSHOT'
 def vXnatPipeline = vXnat
 def vXImgView = '1.0.0-SNAPSHOT'
-def vSpring = '4.2.5.RELEASE'
+def vSpring = '4.2.7.RELEASE'
 def vSpringSecurity = '4.0.4.RELEASE'
 def vSwagger = '2.4.0'
 def vHibernate = '4.3.11.Final'
diff --git a/src/main/java/org/nrg/xnat/configuration/ApplicationConfig.java b/src/main/java/org/nrg/xnat/configuration/ApplicationConfig.java
index 01aaf589..f618b49c 100644
--- a/src/main/java/org/nrg/xnat/configuration/ApplicationConfig.java
+++ b/src/main/java/org/nrg/xnat/configuration/ApplicationConfig.java
@@ -98,7 +98,7 @@ public class ApplicationConfig {
     }
 
     @Bean
-    public XnatRestletExtensions xnatRestletExtensions() {
+    public XnatRestletExtensions defaultXnatRestletExtensions() {
         return new XnatRestletExtensions(new HashSet<>(Arrays.asList(new String[] {"org.nrg.xnat.restlet.extensions"})));
     }
 
diff --git a/src/main/java/org/nrg/xnat/configuration/OrmConfig.java b/src/main/java/org/nrg/xnat/configuration/OrmConfig.java
index a8025ac3..fd4aa23e 100644
--- a/src/main/java/org/nrg/xnat/configuration/OrmConfig.java
+++ b/src/main/java/org/nrg/xnat/configuration/OrmConfig.java
@@ -26,6 +26,9 @@ import java.util.Properties;
 @Configuration
 @EnableTransactionManagement(proxyTargetClass = true)
 public class OrmConfig {
+
+    public static final String XNAT_ENTITIES_PACKAGES = "META-INF/xnat/entities/**/*-entity-packages.txt";
+
     @Bean
     public ImprovedNamingStrategy namingStrategy() {
         return new PrefixedTableNamingStrategy("xhbm");
@@ -61,7 +64,7 @@ public class OrmConfig {
     @Bean
     public LocalSessionFactoryBean sessionFactory(final Environment environment, final DataSource dataSource) throws NrgServiceException {
         try {
-            final AggregatedAnnotationSessionFactoryBean bean = new AggregatedAnnotationSessionFactoryBean();
+            final AggregatedAnnotationSessionFactoryBean bean = new AggregatedAnnotationSessionFactoryBean(XNAT_ENTITIES_PACKAGES);
             bean.setDataSource(dataSource);
             bean.setCacheRegionFactory(regionFactory(environment));
             bean.setHibernateProperties(hibernateProperties(environment).getObject());
diff --git a/src/main/java/org/nrg/xnat/initialization/tasks/SystemPathVerification.java b/src/main/java/org/nrg/xnat/initialization/tasks/SystemPathVerification.java
index 1048f2b6..ecdf887e 100644
--- a/src/main/java/org/nrg/xnat/initialization/tasks/SystemPathVerification.java
+++ b/src/main/java/org/nrg/xnat/initialization/tasks/SystemPathVerification.java
@@ -13,16 +13,15 @@ package org.nrg.xnat.initialization.tasks;
 
 import org.nrg.mail.services.MailService;
 import org.nrg.xdat.preferences.SiteConfigPreferences;
+import org.nrg.xnat.services.XnatAppInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.dao.DataAccessException;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.ResultSetExtractor;
 import org.springframework.stereotype.Component;
 
-import javax.inject.Inject;
 import javax.mail.MessagingException;
 import java.io.File;
 import java.sql.ResultSet;
@@ -33,52 +32,62 @@ import java.util.Map;
 
 @Component
 public class SystemPathVerification extends AbstractInitializingTask {
+    @Autowired
+    public SystemPathVerification(final JdbcTemplate template, final MailService mailService, final SiteConfigPreferences config, final XnatAppInfo appInfo) {
+        _template = template;
+        _mailService = mailService;
+        _config = config;
+        _appInfo = appInfo;
+    }
+
     @Override
     public String getTaskName() {
         return "System Path Verification";
     }
 
-    private final static ArrayList<String> pathErrors = new ArrayList<>();
-    public static String pathErrorWarning = null;
+    private final static ArrayList<String> pathErrors       = new ArrayList<>();
+    public static        String            pathErrorWarning = null;
 
     @Override
     public void run() {
-        try {
-            validatePath(_config.getArchivePath(), "Archive", true);
-            validatePath(_config.getCachePath(), "Archive", false);
-            validatePath(_config.getPipelinePath(), "Archive", false);
-            validatePath(_config.getPrearchivePath(), "Archive", false);
+        if (_appInfo.isInitialized()) {
+            try {
+                validatePath(_config.getArchivePath(), "Archive", true);
+                validatePath(_config.getCachePath(), "Archive", false);
+                validatePath(_config.getPipelinePath(), "Archive", false);
+                validatePath(_config.getPrearchivePath(), "Archive", false);
 
-            final ProjectExtractor pe = new ProjectExtractor();
-            final Map<String, String> projects = _template.query("SELECT id, name FROM xnat_projectdata", pe);
-            if(pathErrors.size() > 0) {
-                // Send warning email to admin and issue browser notification
-                notifyOfPathErrors(projects.size());
-            } else {
-                _config.setPathErrorWarning("");
+                final ProjectExtractor pe = new ProjectExtractor();
+                final Map<String, String> projects = _template.query("SELECT id, name FROM xnat_projectdata", pe);
+                if (pathErrors.size() > 0) {
+                    // Send warning email to admin and issue browser notification
+                    notifyOfPathErrors(projects.size());
+                } else {
+                    _config.setPathErrorWarning("");
+                }
+                complete();
+            } catch (SQLException e) {
+                logger.error("An error occurred trying to retrieve the values for the system paths.", e);
             }
-            complete();
-        } catch (Exception e) {
-            logger.error("", e);
         }
     }
 
     private boolean validatePath(final String path, final String displayName, final boolean checkForFiles) throws SQLException {
         File filePath = new File(path);
         if (!filePath.exists()) {
-            pathErrors.add(displayName+" path \""+path+"\" does not exist.");
+            pathErrors.add(displayName + " path \"" + path + "\" does not exist.");
             return false;
-        } else if (!filePath.isDirectory()){
-            pathErrors.add(displayName+" path \""+path+"\" is not a directory.");
+        } else if (!filePath.isDirectory()) {
+            pathErrors.add(displayName + " path \"" + path + "\" is not a directory.");
             return false;
         } else if (checkForFiles) {
             File[] files = filePath.listFiles();
             final String noFiles = displayName + " files do not exist under \"" + path + "\".";
-            if(files == null) {
+            if (files == null) {
                 pathErrors.add(noFiles);
                 return false;
             }
-            if(files.length < 1) {
+            if (files.length < 1) {
                 pathErrors.add(noFiles);
                 return false;
             }
@@ -98,12 +107,12 @@ public class SystemPathVerification extends AbstractInitializingTask {
     }
 
     private void notifyOfPathErrors(int numProjects) {
-        if(numProjects > 0) {
+        if (numProjects > 0) {
             int i = 1;
             String adminEmail = _config.getAdminEmail();
             String sysName = _config.getSiteId();
             String emailSubj = sysName + " " + this.getTaskName() + " Failure";
-            StringBuffer sb = new StringBuffer();
+            StringBuilder sb = new StringBuilder();
             String singPlurl = " has";
             if (numProjects > 1) {
                 singPlurl = "s have";
@@ -117,8 +126,8 @@ public class SystemPathVerification extends AbstractInitializingTask {
                 sb.append(". ");
                 sb.append(err);
             }
-            _config.setPathErrorWarning(sb.toString().replace("\n","<br>"));
-            pathErrorWarning = sb.insert(0, emailSubj+": ").toString();
+            _config.setPathErrorWarning(sb.toString().replace("\n", "<br>"));
+            pathErrorWarning = sb.insert(0, emailSubj + ": ").toString();
             logger.error(pathErrorWarning);
             try {
                 _mailService.sendHtmlMessage(adminEmail, adminEmail, emailSubj, pathErrorWarning);
@@ -130,14 +139,8 @@ public class SystemPathVerification extends AbstractInitializingTask {
 
     private static Logger logger = LoggerFactory.getLogger(SystemPathVerification.class);
 
-    @Autowired
-    @Lazy
-    private JdbcTemplate _template;
-
-    @Inject
-    private MailService _mailService;
-
-    @Autowired
-    @Lazy
-    private SiteConfigPreferences _config;
+    private final JdbcTemplate          _template;
+    private final MailService           _mailService;
+    private final SiteConfigPreferences _config;
+    private final XnatAppInfo           _appInfo;
 }
diff --git a/src/main/java/org/nrg/xnat/restlet/XNATApplication.java b/src/main/java/org/nrg/xnat/restlet/XNATApplication.java
index f297f018..fc54abf4 100755
--- a/src/main/java/org/nrg/xnat/restlet/XNATApplication.java
+++ b/src/main/java/org/nrg/xnat/restlet/XNATApplication.java
@@ -366,22 +366,31 @@ public class XNATApplication extends Application {
      */
     @SuppressWarnings("unchecked")
     private List<Class<? extends Resource>> addExtensionRoutes(Router router) {
-        Set<String> packages = new HashSet<>();
+        final Set<String> packages = new HashSet<>();
         final Map<String, XnatRestletExtensions> pkgLists = XDAT.getContextService().getBeansOfType(XnatRestletExtensions.class);
+        if (pkgLists.size() == 0) {
+            final XnatRestletExtensions extensions = XDAT.getContextService().getBean("defaultXnatRestletExtensions", XnatRestletExtensions.class);
+            if (extensions != null) {
+                pkgLists.put("defaultXnatRestletExtensions", extensions);
+            }
+        }
         for (XnatRestletExtensions pkgList : pkgLists.values()) {
             packages.addAll(pkgList);
         }
+        if (packages.size() == 0) {
+            packages.add("org.nrg.xnat.restlet.extensions");
+        }
 
-        List<Class<? extends Resource>> classes = new ArrayList<>();
-        List<Class<? extends Resource>> publicClasses = new ArrayList<>();
+        final List<Class<? extends Resource>> classes = new ArrayList<>();
+        final List<Class<? extends Resource>> publicClasses = new ArrayList<>();
 
-        for (String pkg : packages) {
+        for (final String pkg : packages) {
             try {
                 final List<Class<?>> classesForPackage = Reflection.getClassesForPackage(pkg);
                 if (_log.isDebugEnabled()) {
                     _log.debug("Found " + classesForPackage.size() + " classes for package: " + pkg);
                 }
-                for (Class<?> clazz : classesForPackage) {
+                for (final Class<?> clazz : classesForPackage) {
                     if (Resource.class.isAssignableFrom(clazz)) {
                         if (_log.isDebugEnabled()) {
                             _log.debug("Found resource class: " + clazz.getName());
-- 
GitLab