From 1bb51538574203de20f188958b3207a0fcc90305 Mon Sep 17 00:00:00 2001 From: Jim Blake Date: Tue, 22 Apr 2014 15:11:31 -0400 Subject: [PATCH] VIVO-742 Setup the Application properly, and guard against NPEs --- .../webapp/application/ApplicationImpl.java | 43 ++++++++++++++++--- .../webapp/application/ApplicationUtils.java | 4 ++ .../solr/SolrConversionUtils.java | 15 ++++--- .../solr/SolrSearchResultDocumentList.java | 10 ++++- .../WEB-INF/resources/startup_listeners.txt | 2 + 5 files changed, 63 insertions(+), 11 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/application/ApplicationImpl.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/application/ApplicationImpl.java index 0d33ad0e9..2ab3ef319 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/application/ApplicationImpl.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/application/ApplicationImpl.java @@ -3,22 +3,28 @@ package edu.cornell.mannlib.vitro.webapp.application; import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; import edu.cornell.mannlib.vitro.webapp.modules.Application; import edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchEngine; import edu.cornell.mannlib.vitro.webapp.searchengine.SearchEngineWrapper; import edu.cornell.mannlib.vitro.webapp.searchengine.solr.SolrSearchEngine; +import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; /** * The basic implementation of the Application interface. */ public class ApplicationImpl implements Application { + // ---------------------------------------------------------------------- + // The instance + // ---------------------------------------------------------------------- + private final ServletContext ctx; private SearchEngine searchEngine; public ApplicationImpl(ServletContext ctx) { this.ctx = ctx; - setSearchEngine(new SolrSearchEngine()); } @Override @@ -32,10 +38,37 @@ public class ApplicationImpl implements Application { } public void setSearchEngine(SearchEngine searchEngine) { - if (searchEngine instanceof SearchEngineWrapper) { - this.searchEngine = searchEngine; - } else { - this.searchEngine = new SearchEngineWrapper(searchEngine); + this.searchEngine = searchEngine; + } + + // ---------------------------------------------------------------------- + // The Setup class. + // ---------------------------------------------------------------------- + + public static class Setup implements ServletContextListener { + + @Override + public void contextInitialized(ServletContextEvent sce) { + ServletContext ctx = sce.getServletContext(); + StartupStatus ss = StartupStatus.getBean(ctx); + + try { + SearchEngine searchEngine = new SearchEngineWrapper( + new SolrSearchEngine()); + + ApplicationImpl application = new ApplicationImpl(ctx); + application.setSearchEngine(searchEngine); + ApplicationUtils.setInstance(application); + ss.info(this, "Appliation is configured."); + } catch (Exception e) { + ss.fatal(this, "Failed to initialize the Application.", e); + } } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + // Nothing to tear down. + } + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/application/ApplicationUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/application/ApplicationUtils.java index 1aeb7c500..01097e579 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/application/ApplicationUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/application/ApplicationUtils.java @@ -25,5 +25,9 @@ public class ApplicationUtils { "Called for Application before it was available", e); } } + + static void setInstance(Application application) { + instance = application; + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/searchengine/solr/SolrConversionUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/searchengine/solr/SolrConversionUtils.java index 752c81b94..98f9f3f2d 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/searchengine/solr/SolrConversionUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/searchengine/solr/SolrConversionUtils.java @@ -148,8 +148,11 @@ public class SolrConversionUtils { private static Map convertToSearchFacetFieldMap( List facetFields) { Map map = new HashMap<>(); - for (FacetField facetField : facetFields) { - map.put(facetField.getName(), convertToSearchFacetField(facetField)); + if (facetFields != null) { + for (FacetField facetField : facetFields) { + map.put(facetField.getName(), + convertToSearchFacetField(facetField)); + } } return map; } @@ -163,9 +166,11 @@ public class SolrConversionUtils { private static List convertToSearchFacetFieldCounts( List solrCounts) { List searchCounts = new ArrayList<>(); - for (FacetField.Count solrCount : solrCounts) { - searchCounts.add(new BaseCount(solrCount.getName(), solrCount - .getCount())); + if (solrCounts != null) { + for (FacetField.Count solrCount : solrCounts) { + searchCounts.add(new BaseCount(solrCount.getName(), solrCount + .getCount())); + } } return searchCounts; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/searchengine/solr/SolrSearchResultDocumentList.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/searchengine/solr/SolrSearchResultDocumentList.java index 196b87217..5656438ce 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/searchengine/solr/SolrSearchResultDocumentList.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/searchengine/solr/SolrSearchResultDocumentList.java @@ -21,7 +21,15 @@ public class SolrSearchResultDocumentList implements SearchResultDocumentList { private SolrDocumentList solrDocs; public SolrSearchResultDocumentList(SolrDocumentList solrDocs) { - this.solrDocs = solrDocs; + if (solrDocs == null) { + SolrDocumentList list = new SolrDocumentList(); + list.setStart(0L); + list.setNumFound(0L); + list.setMaxScore(0.0F); + this.solrDocs = list; + } else { + this.solrDocs = solrDocs; + } } @Override diff --git a/webapp/web/WEB-INF/resources/startup_listeners.txt b/webapp/web/WEB-INF/resources/startup_listeners.txt index 8899f7187..78e2e230d 100644 --- a/webapp/web/WEB-INF/resources/startup_listeners.txt +++ b/webapp/web/WEB-INF/resources/startup_listeners.txt @@ -13,6 +13,8 @@ edu.cornell.mannlib.vitro.webapp.config.ConfigurationPropertiesSmokeTests edu.cornell.mannlib.vitro.webapp.utils.developer.DeveloperSettings$Setup +edu.cornell.mannlib.vitro.webapp.application.ApplicationImpl$Setup + edu.cornell.mannlib.vitro.webapp.config.RevisionInfoSetup edu.cornell.mannlib.vitro.webapp.email.FreemarkerEmailFactory$Setup