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