From 995133dc407c4e167bea37b0a8030e25fe6a97ce Mon Sep 17 00:00:00 2001 From: Noah Levitt Date: Thu, 27 Oct 2011 10:40:30 -0700 Subject: [PATCH] Fix for HER-1962 NPE from missing sheet * SheetOverlaysManager.java getOverlayMap(String) - return null if sheet missing instead of triggering npe * KeyedProperties.java get(String) - check for null return value from getOverlayMap() and log warning --- .../java/org/archive/spring/KeyedProperties.java | 16 ++++++++++++---- .../crawler/spring/SheetOverlaysManager.java | 7 ++++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/commons/src/main/java/org/archive/spring/KeyedProperties.java b/commons/src/main/java/org/archive/spring/KeyedProperties.java index a6e5adbf..0a5b562b 100644 --- a/commons/src/main/java/org/archive/spring/KeyedProperties.java +++ b/commons/src/main/java/org/archive/spring/KeyedProperties.java @@ -24,6 +24,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Logger; /** * Map for storing overridable properties. @@ -36,6 +37,9 @@ import java.util.concurrent.ConcurrentHashMap; */ public class KeyedProperties extends ConcurrentHashMap { private static final long serialVersionUID = 3403222335436162778L; + + private static final Logger logger = Logger.getLogger(KeyedProperties.class.getName()); + /** the alternate global property-paths leading to this map * TODO: consider if deterministic ordered list is important */ HashSet externalPaths = new HashSet(); @@ -61,11 +65,15 @@ public class KeyedProperties extends ConcurrentHashMap { for(int j = ocontext.getOverlayNames().size()-1; j>=0; j--) { String name = ocontext.getOverlayNames().get(j); Map m = ocontext.getOverlayMap(name); - for(String ok : getOverrideKeys(key)) { - Object val = m.get(ok); - if(val!=null) { - return val; + if (m != null) { + for(String ok : getOverrideKeys(key)) { + Object val = m.get(ok); + if(val!=null) { + return val; + } } + } else { + logger.warning("sheet '" + name + "' should apply but there is no such sheet!"); } } } diff --git a/engine/src/main/java/org/archive/crawler/spring/SheetOverlaysManager.java b/engine/src/main/java/org/archive/crawler/spring/SheetOverlaysManager.java index 276f17a6..fee9e81c 100644 --- a/engine/src/main/java/org/archive/crawler/spring/SheetOverlaysManager.java +++ b/engine/src/main/java/org/archive/crawler/spring/SheetOverlaysManager.java @@ -169,7 +169,12 @@ BeanFactoryAware, OverlayMapsSource, ApplicationListener { * @see org.archive.spring.OverlayMapsSource#getOverlayMap(java.lang.String) */ public Map getOverlayMap(String name) { - return sheetsByName.get(name).getMap(); + Sheet sheet = sheetsByName.get(name); + if (sheet != null) { + return sheet.getMap(); + } else { + return null; + } } /**