[java-shib-attribute] 02/02: IDP-2069, JSSH-30 Null handling task

Rod Widdowson rdw at steadingsoftware.com
Thu May 4 13:17:25 UTC 2023


This is an automated email from the git hooks/post-receive script.

rdw pushed a commit to branch main
in repository java-shib-attribute.

View the commit online:
http://git.shibboleth.net/view/?p=java-shib-attribute.git;a=commit;h=d8a6b3c4c5b423846bf18386e952ac6fbf102899

commit d8a6b3c4c5b423846bf18386e952ac6fbf102899
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Thu May 4 14:16:16 2023 +0100

    IDP-2069, JSSH-30 Null handling task
    
    https://shibboleth.atlassian.net/browse/IDP-2069
    https://shibboleth.atlassian.net/browse/JSSH-30
    
    More warning fixes and annotation adding.
---
 .../config/BeanConfigurationLookupStrategy.java    |  4 +-
 .../transcoding/AbstractAttributeTranscoder.java   |  1 +
 .../impl/AttributeTranscoderRegistryImpl.java      | 14 +++++--
 .../attribute/impl/JDBCPairwiseIdStoreTest.java    |  8 +++-
 .../impl/AttributeTranscoderRegistryImplTest.java  | 15 +++++++-
 .../attribute/transcoding/impl/PairTranscoder.java |  8 +++-
 .../dc/rdbms/FormatExecutableStatementBuilder.java |  4 +-
 .../ad/impl/DateTimeAttributeDefinition.java       | 11 ++++--
 .../dc/http/impl/AbstractHTTPSearchBuilder.java    |  4 +-
 .../resolver/dc/http/impl/HTTPDataConnector.java   |  7 +++-
 .../dc/http/impl/TemplatedBodyBuilder.java         |  6 +--
 .../impl/ScriptedStorageMappingStrategy.java       | 15 ++++++--
 .../ad/impl/DateTimeAttributeDefinitionTest.java   | 12 ++++--
 .../resolver/ad/impl/DecryptedAttributeTest.java   |  9 ++++-
 .../idp/attribute/resolver/ad/impl/LogicTest.java  |  5 +--
 .../resolver/ad/impl/RegexAtributeTest.java        |  4 +-
 .../resolver/ad/impl/ScopedAttributeTest.java      |  6 +--
 .../resolver/ad/impl/ScriptedAttributeTest.java    | 24 ++++++++----
 .../ad/mapped/impl/MappedAttributeTest.java        |  5 ++-
 .../dc/http/impl/HTTPDataConnectorTest.java        | 15 +++++---
 .../dc/impl/ScriptedDataConnectorTest.java         |  5 ++-
 .../dc/impl/StoredIDDataConnectorTest.java         | 10 +++--
 .../dc/ldap/impl/LDAPDataConnectorTest.java        |  8 ++--
 .../dc/rdbms/impl/RDBMSDataConnectorTest.java      | 25 ++++++++----
 .../impl/StorageServiceDataConnectorTest.java      | 18 +++++----
 .../tests/PluginDependencySupportTest.java         |  2 +-
 .../spring/MetadataDrivenConfigurationTest.java    | 44 ++++++++++++----------
 .../impl/testing/SAMLAttributeDataConnector.java   |  5 ++-
 .../attribute/resolver/testing/TestSources.java    |  5 +++
 29 files changed, 206 insertions(+), 93 deletions(-)

diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BeanConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BeanConfigurationLookupStrategy.java
index 11e64611d..493e1da55 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BeanConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BeanConfigurationLookupStrategy.java
@@ -109,7 +109,9 @@ public class BeanConfigurationLookupStrategy<T> extends AbstractMetadataDrivenCo
         final IdPAttributeValue value = values.get(0);
         if (value instanceof StringAttributeValue strval) {
             try {
-                return applicationContext.getBean(strval.getValue(), propertyType);
+                final Class<T> pt = propertyType; 
+                assert pt!=null;
+                return applicationContext.getBean(strval.getValue(), pt);
             } catch (final BeansException e) {
                 LOG.error("Error locating appropriately typed bean named {}", strval.getValue(), e);
                 return null;
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java
index bc19c7f52..5d1b22033 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java
@@ -142,6 +142,7 @@ public abstract class AbstractAttributeTranscoder<T> extends AbstractInitializab
             return false;
         }
 
+        @SuppressWarnings("unchecked")
         final Predicate<ProfileRequestContext> condition =
                 rule.get(AttributeTranscoderRegistry.PROP_CONDITION, Predicate.class);
         if (condition != null) {
diff --git a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
index fe6b0970b..f4572b4af 100644
--- a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
+++ b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
@@ -228,7 +228,9 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
         
         log.trace("Using rules for effective type {}", effectiveType.getName());
         
-        return CollectionSupport.copyToList(propertyCollections.get(effectiveType));
+        final Collection<TranscodingRule> result = propertyCollections.get(effectiveType);
+        assert result != null;
+        return CollectionSupport.copyToList(result);
     }
 
     /** {@inheritDoc} */
@@ -251,9 +253,13 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
         final String id = ((Function<? super T,String>) namingFunction).apply(from);
         if (id != null) {
             final Multimap<Class<?>,TranscodingRule> propertyCollections = transcodingRegistry.get(id);
-            
-            return propertyCollections != null ? CollectionSupport.copyToList(propertyCollections.get(effectiveType))
-                    : CollectionSupport.emptyList();
+
+            if (propertyCollections == null) {
+                return CollectionSupport.emptyList();
+            }
+            final Collection<TranscodingRule> result = propertyCollections.get(effectiveType);
+            assert result != null;
+            return CollectionSupport.copyToList(result);
         }
         log.warn("Object of type {} did not have a canonical name", from.getClass().getName());
         
diff --git a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStoreTest.java b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStoreTest.java
index 45d4da02e..527cebe83 100644
--- a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStoreTest.java
+++ b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStoreTest.java
@@ -83,7 +83,9 @@ public class JDBCPairwiseIdStoreTest {
         
         Assert.assertEquals(store.getDataSource(), testSource);
         Assert.assertEquals(store.getQueryTimeout(), Duration.ofSeconds(5));
-        store.setQueryTimeout(Duration.ofMillis(1));
+        final Duration oneMs=Duration.ofMillis(1);
+        assert oneMs!=null;
+        store.setQueryTimeout(oneMs);
         
         try {
             store.getBySourceValue(new PairwiseId(), true);
@@ -102,7 +104,9 @@ public class JDBCPairwiseIdStoreTest {
         }
         store.initialize();
         try {
-            store.setQueryTimeout(Duration.ZERO);
+            final Duration zero = Duration.ZERO;
+            assert zero!=null;
+            store.setQueryTimeout(zero);
             Assert.fail("work after initialize");
         } catch (final UnmodifiableComponentException e) {
             // OK
diff --git a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
index 2427090fb..d67144ea5 100644
--- a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
+++ b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
@@ -153,10 +153,10 @@ public class AttributeTranscoderRegistryImplTest {
 
         final Pair<?,?> p = new Pair<>("ban", "value");
         final Collection<TranscodingRule> rulesets = registry.getTranscodingRules(p);
-        assertEquals(rulesets.size(), 1);
+        assert rulesets != null && rulesets.size() == 1;
         
         final TranscodingRule ruleset = rulesets.iterator().next();
-        
+        assert ruleset!=null;
         final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
         assertNull(t.decode(null, p, ruleset));
     }
@@ -167,6 +167,7 @@ public class AttributeTranscoderRegistryImplTest {
         final List<Pair<?,?>> pairs = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(foo, Pair.class)) {
+            assert ruleset!=null;
             final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
             final Pair p = t.encode(null, foo, Pair.class, ruleset);
             if (p != null) {
@@ -190,6 +191,7 @@ public class AttributeTranscoderRegistryImplTest {
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(bar)) {
+            assert ruleset!=null;
             final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, bar, ruleset));
         }
@@ -208,6 +210,7 @@ public class AttributeTranscoderRegistryImplTest {
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(baz)) {
+            assert ruleset!=null;
             final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, baz, ruleset));
         }
@@ -228,7 +231,9 @@ public class AttributeTranscoderRegistryImplTest {
         final List<Pair<?,?>> pairs = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(foo, Pair.class)) {
+            assert ruleset!=null;
             final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
+            assert ruleset!=null;
             final Pair p = t.encode(null, foo, Pair.class, ruleset);
             if (p != null) {
                 pairs.add(p);
@@ -251,6 +256,7 @@ public class AttributeTranscoderRegistryImplTest {
         final List<MyPair> pairs = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(foo, MyPair.class)) {
+            assert ruleset!=null;
             final AttributeTranscoder<MyPair> t = TranscoderSupport.getTranscoder(ruleset);
             final MyPair p = t.encode(null, foo, MyPair.class, ruleset);
             if (p != null) {
@@ -274,6 +280,7 @@ public class AttributeTranscoderRegistryImplTest {
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(bar)) {
+            assert ruleset!=null;
             final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, bar, ruleset));
         }
@@ -291,6 +298,7 @@ public class AttributeTranscoderRegistryImplTest {
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(baz)) {
+            assert ruleset!=null;
             final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, baz, ruleset));
         }
@@ -311,6 +319,7 @@ public class AttributeTranscoderRegistryImplTest {
         final List<Pair<?,?>> pairs = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(foo, Pair.class)) {
+            assert ruleset!=null;
             final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
             final Pair p = t.encode(null, foo, Pair.class, ruleset);
             if (p != null) {
@@ -334,6 +343,7 @@ public class AttributeTranscoderRegistryImplTest {
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(bar)) {
+            assert ruleset!=null;
             final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, bar, ruleset));
         }
@@ -351,6 +361,7 @@ public class AttributeTranscoderRegistryImplTest {
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(baz)) {
+            assert ruleset!=null;
             final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, baz, ruleset));
         }
diff --git a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java
index 03239b624..621a36ce4 100644
--- a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java
+++ b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java
@@ -68,9 +68,13 @@ public class PairTranscoder extends AbstractAttributeTranscoder<Pair> {
 
         try {
             if (attribute.getValues().isEmpty() || !canEncodeValue(attribute, attribute.getValues().get(0))) {
-                return to.getDeclaredConstructor(Object.class, Object.class).newInstance(name, null);
+                final Pair result = to.getDeclaredConstructor(Object.class, Object.class).newInstance(name, null);
+                assert result != null;
+                return result;
             }
-            return to.getDeclaredConstructor(Object.class, Object.class).newInstance(name, attribute.getValues().get(0).getNativeValue());
+            final Pair result = to.getDeclaredConstructor(Object.class, Object.class).newInstance(name, attribute.getValues().get(0).getNativeValue());
+            assert result != null;
+            return result;
         } catch (final InstantiationException | IllegalAccessException | IllegalArgumentException
                 | InvocationTargetException | NoSuchMethodException | SecurityException e) {
             throw new AttributeEncodingException(e);
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/FormatExecutableStatementBuilder.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/FormatExecutableStatementBuilder.java
index c3808fe60..0203cdcec 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/FormatExecutableStatementBuilder.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/FormatExecutableStatementBuilder.java
@@ -81,7 +81,9 @@ public class FormatExecutableStatementBuilder extends AbstractExecutableStatemen
                 args.add(null);
             }
         }
-        return String.format(sqlQuery, args.toArray());
+        final String result = String.format(sqlQuery, args.toArray());
+        assert result != null;
+        return result;
     }
 
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinition.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinition.java
index 842a95dc3..29d0d1fd6 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinition.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinition.java
@@ -159,7 +159,7 @@ public class DateTimeAttributeDefinition extends AbstractAttributeDefinition {
                 ensureId());
 
         final List<? extends IdPAttributeValue> converted = values.stream()
-                .map(v -> convert(v))
+                .map(v -> {assert v != null; return convert(v);})
                 .filter(Predicates.notNull())
                 .collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList()))
                 .get();
@@ -167,8 +167,9 @@ public class DateTimeAttributeDefinition extends AbstractAttributeDefinition {
         if (!ignoreConversionErrors && converted.size() != values.size()) {
             throw new ResolutionException("Unable to convert all inputs to date/time values.");
         }
-
-        result.setValues((List<IdPAttributeValue>) converted);
+        @SuppressWarnings("unchecked")
+        final List<IdPAttributeValue> vals = (List<IdPAttributeValue>)converted;
+        result.setValues(vals);
         return result;
     }
     
@@ -209,7 +210,9 @@ public class DateTimeAttributeDefinition extends AbstractAttributeDefinition {
         
         try {
             assert formatter != null;
-            return new DateTimeAttributeValue(formatter.parse(stringValue, Instant::from));
+            final Instant parsedValue = formatter.parse(stringValue, Instant::from);
+            assert parsedValue != null;
+            return new DateTimeAttributeValue(parsedValue);
         } catch (final DateTimeException e) {
             log.info("{} Error converting input value '{}' into Instant", getLogPrefix(), stringValue, e);
             return null;
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
index 8a786cc81..7dbc4a42f 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
@@ -168,7 +168,9 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
                 HttpClientSecuritySupport.marshalSecurityParameters(clientContext, securityParameters, true);
                 HttpClientSecuritySupport.addDefaultTLSTrustEngineCriteria(clientContext, request);
                 final Map<String,IdPAttribute> results = client.execute(request, clientContext, mappingStrategy);
-                HttpClientSecuritySupport.checkTLSCredentialEvaluated(clientContext, request.getScheme());
+                final String scheme = request.getScheme();
+                assert scheme != null;
+                HttpClientSecuritySupport.checkTLSCredentialEvaluated(clientContext, scheme);
                 assert results != null;
                 return results;
             }
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
index 1696117f5..5233f7323 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
@@ -108,8 +108,11 @@ public class HTTPDataConnector extends AbstractSearchDataConnector<HTTPSearch,HT
             @Nonnull final HTTPSearch executable) throws ResolutionException {
 
         try {
-            return getMappingStrategy().map(
-                    executable.execute(httpClient, httpClientSecurityParameters, getMappingStrategy()));
+            final HTTPResponseMappingStrategy strategy = getMappingStrategy();
+            final HttpClient localClient = httpClient; 
+            assert strategy!=null && localClient!=null;
+            return strategy.map(
+                    executable.execute(localClient, httpClientSecurityParameters, strategy));
         } catch (final IOException e) {
             throw new ResolutionException(getLogPrefix() + " HTTP request failed", e);
         }
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java
index 8c8b44a73..2b666cf84 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java
@@ -389,7 +389,8 @@ public class TemplatedBodyBuilder extends AbstractHTTPSearchBuilder {
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final Map<String, List<IdPAttributeValue>> dependencyAttributes) {
         
-        if (cacheKeyTemplate == null) {
+        final Template ckt = cacheKeyTemplate; 
+        if (ckt== null) {
             return null;
         }
         
@@ -410,8 +411,7 @@ public class TemplatedBodyBuilder extends AbstractHTTPSearchBuilder {
                 context.put(entry.getKey(), values);
             }
         }
-
-        return merge(cacheKeyTemplate, context);
+        return merge(ckt, context);
     }
 
 }
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/ScriptedStorageMappingStrategy.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/ScriptedStorageMappingStrategy.java
index 1ffacea7a..4df20147e 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/ScriptedStorageMappingStrategy.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/ScriptedStorageMappingStrategy.java
@@ -41,6 +41,7 @@ import net.shibboleth.idp.attribute.resolver.dc.storage.StorageMappingStrategy;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resource.Resource;
 import net.shibboleth.shared.scripting.AbstractScriptEvaluator;
@@ -80,7 +81,9 @@ public final class ScriptedStorageMappingStrategy extends AbstractScriptEvaluato
         try {
             final Object map = evaluate(results);
             if (map instanceof Map) {
-                return (Map<String, IdPAttribute>) map;
+                @SuppressWarnings("unchecked")
+                final Map<String, IdPAttribute> mapApMap = (Map<String, IdPAttribute>) map;
+                return mapApMap;
             }
             throw new ResolutionException(getLogPrefix() + "Script finalization did not return a map");
         } catch (final RuntimeException e) {
@@ -170,8 +173,10 @@ public final class ScriptedStorageMappingStrategy extends AbstractScriptEvaluato
             final EvaluableScript script = new EvaluableScript();
             script.setEngineName(engineName);
             script.setScript(is);
-            script.initializeWithScriptException();
+            script.initialize();
             return new ScriptedStorageMappingStrategy(script);
+        } catch (final ComponentInitializationException e) {
+            throw new ScriptException(e);
         }
     }
 
@@ -201,7 +206,11 @@ public final class ScriptedStorageMappingStrategy extends AbstractScriptEvaluato
         final EvaluableScript script = new EvaluableScript();
         script.setEngineName(engineName);
         script.setScript(scriptSource);
-        script.initializeWithScriptException();
+        try {
+            script.initialize();
+        } catch (final ComponentInitializationException e) {
+            throw new ScriptException(e);
+        }
         return new ScriptedStorageMappingStrategy(script);
     }
 
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinitionTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinitionTest.java
index 24fb3a662..3ba32b3f2 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinitionTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinitionTest.java
@@ -177,7 +177,9 @@ public class DateTimeAttributeDefinitionTest {
 
         assertEquals(values.size(), 2);
         assertTrue(values.contains(new DateTimeAttributeValue(now)));
-        assertTrue(values.contains(new DateTimeAttributeValue(Instant.ofEpochSecond(Long.valueOf(STRING_SECS)))));
+        final Instant then = Instant.ofEpochSecond(Long.valueOf(STRING_SECS));
+        assert then != null;
+        assertTrue(values.contains(new DateTimeAttributeValue(then)));
     }
     
     /**
@@ -217,7 +219,9 @@ public class DateTimeAttributeDefinitionTest {
         final Collection<IdPAttributeValue> values = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
 
         assertEquals(values.size(), 1);
-        assertTrue(values.contains(new DateTimeAttributeValue(Instant.ofEpochMilli(Long.valueOf(STRING_MSECS)))));
+        final Instant then = Instant.ofEpochMilli(Long.valueOf(STRING_MSECS));
+        assert then != null;
+        assertTrue(values.contains(new DateTimeAttributeValue(then)));
     }
 
     /**
@@ -257,7 +261,9 @@ public class DateTimeAttributeDefinitionTest {
         final Collection<IdPAttributeValue> values = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
 
         assertEquals(values.size(), 1);
-        assertTrue(values.contains(new DateTimeAttributeValue(Instant.ofEpochMilli(Long.valueOf(STRING_MSECS)))));
+        final Instant then = Instant.ofEpochMilli(Long.valueOf(STRING_MSECS));
+        assert then != null;
+        assertTrue(values.contains(new DateTimeAttributeValue(then)));
     }
 
     /**
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DecryptedAttributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DecryptedAttributeTest.java
index d4a4f7ace..30c52882e 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DecryptedAttributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DecryptedAttributeTest.java
@@ -46,6 +46,7 @@ import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImpl;
 import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImplTest;
 import net.shibboleth.idp.attribute.resolver.testing.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeTest;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazySet;
@@ -62,7 +63,7 @@ public class DecryptedAttributeTest {
 
     @Nonnull @NotEmpty private static final String TEST_ATTRIBUTE_NAME = "decrypted";
 
-    private DataSealer dataSealer;
+    @NonnullBeforeTest private DataSealer dataSealer;
 
     @BeforeClass public void setUp() throws ComponentInitializationException {
         ClassPathResource resource =
@@ -112,7 +113,7 @@ public class DecryptedAttributeTest {
         } catch (final ComponentInitializationException e) {
             
         }
-        
+        assert dataSealer != null;
         decrypted.setDataSealer(dataSealer);
         decrypted.initialize();
 
@@ -130,6 +131,7 @@ public class DecryptedAttributeTest {
      * @throws ComponentInitializationException if initialization fails (which it shouldn't).
      * @throws DataSealerException if encryption fails
      */
+    @SuppressWarnings("null")
     @Test public void dataConnector() throws ComponentInitializationException, DataSealerException {
 
         // Set the dependency on the data connector
@@ -140,6 +142,7 @@ public class DecryptedAttributeTest {
         dependencySet.add(TestSources.makeDataConnectorDependency(TestSources.STATIC_CONNECTOR_NAME,
                 TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
         decrypted.setDataConnectorDependencies(dependencySet);
+        assert dataSealer != null;
         decrypted.setDataSealer(dataSealer);
         decrypted.initialize();
 
@@ -190,6 +193,7 @@ public class DecryptedAttributeTest {
         final Set<ResolverAttributeDefinitionDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeAttributeDefinitionDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
         decrypted.setAttributeDependencies(dependencySet);
+        assert dataSealer != null;
         decrypted.setDataSealer(dataSealer);
         decrypted.initialize();
 
@@ -240,6 +244,7 @@ public class DecryptedAttributeTest {
         final DecryptedAttributeDefinition decrypted = new DecryptedAttributeDefinition();
         decrypted.setId(TEST_ATTRIBUTE_NAME);
         decrypted.setDataConnectorDependencies(CollectionSupport.singleton(depend));
+        assert dataSealer != null;
         decrypted.setDataSealer(dataSealer);
         decrypted.initialize();
 
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/LogicTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/LogicTest.java
index cf4064cbb..2b6832313 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/LogicTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/LogicTest.java
@@ -20,11 +20,10 @@ package net.shibboleth.idp.attribute.resolver.ad.impl;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collections;
+import java.util.ArrayList;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.testng.annotations.Test;
-import org.testng.collections.Lists;
 
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.logic.AttributeIssuerIdPredicate;
@@ -39,7 +38,7 @@ import net.shibboleth.shared.collection.CollectionSupport;
 public class LogicTest {
 
     final private AttributeIssuerIdPredicate aiip = new AttributeIssuerIdPredicate(CollectionSupport.singleton("AII"));
-    final private AttributePrincipalPredicate app = new AttributePrincipalPredicate(Lists.newArrayList("AP", "Principal"));
+    final private AttributePrincipalPredicate app = new AttributePrincipalPredicate(new ArrayList<>(CollectionSupport.listOf("AP", "Principal")));
     final private AttributeRecipientIdPredicate arip = new AttributeRecipientIdPredicate(CollectionSupport.singleton("ARI"));
     
 
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
index 28bf6a743..4b801f309 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
@@ -157,7 +157,9 @@ public class RegexAtributeTest {
         final RegexSplitAttributeDefinition attrDef = new RegexSplitAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         // regex where the first group doesn't match
-        attrDef.setRegularExpression(Pattern.compile("([zZ]*)at1-(.+)or"));
+        final Pattern pat = Pattern.compile("([zZ]*)at1-(.+)or");
+        assert pat!=null;
+        attrDef.setRegularExpression(pat);
         attrDef.setDataConnectorDependencies(dependencySet);
         attrDef.initialize();
 
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
index a4edba191..0c7d163cf 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
@@ -71,7 +71,7 @@ public class ScopedAttributeTest {
     @Test public void scopes() throws ResolutionException, ComponentInitializationException {
 
         // Set the dependency on the data connector
-        final Set<ResolverDataConnectorDependency> dependencySet = Set.of(
+        final Set<ResolverDataConnectorDependency> dependencySet = CollectionSupport.setOf(
                 TestSources.makeDataConnectorDependency(TestSources.STATIC_CONNECTOR_NAME,
                                                         TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
 
@@ -114,7 +114,7 @@ public class ScopedAttributeTest {
     @Test public void scopeSource() throws ResolutionException, ComponentInitializationException {
 
         // Set the dependency on the data connector
-        final Set<ResolverDataConnectorDependency> dependencySet =Set.of(
+        final Set<ResolverDataConnectorDependency> dependencySet = CollectionSupport.setOf(
                 TestSources.makeDataConnectorDependency(TestSources.STATIC_CONNECTOR_NAME,
                                                         TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
 
@@ -122,7 +122,7 @@ public class ScopedAttributeTest {
         scoped.setScopeSource("ScopeSource");
         scoped.setId(TEST_ATTRIBUTE_NAME);
         scoped.setDataConnectorDependencies(dependencySet);
-        scoped.setAttributeDependencies(Set.of(TestSources.makeAttributeDefinitionDependency("ScopeSource")));
+        scoped.setAttributeDependencies(CollectionSupport.setOf(TestSources.makeAttributeDefinitionDependency("ScopeSource")));
         scoped.initialize();
 
         // And resolve
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
index 2508dcd1b..d76da3f53 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
@@ -24,6 +24,7 @@ import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -79,14 +80,16 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
 
     private static Logger log = LoggerFactory.getLogger(ScriptedAttributeTest.class);
 
-    private String fileNameToPath(final String fileName) {
+    @Nonnull private String fileNameToPath(final String fileName) {
         return "/net/shibboleth/idp/attribute/resolver/impl/ad/" + fileName;
     }
 
     @Nonnull private EvaluableScript getScript(String fileName) throws ComponentInitializationException, IOException {
         EvaluableScript es = new EvaluableScript ();
         es.setEngineName(SCRIPT_LANGUAGE);
-        es.setScript(getClass().getResourceAsStream(fileNameToPath(fileName)));
+        final InputStream is = getClass().getResourceAsStream(fileNameToPath(fileName));
+        assert is != null;
+        es.setScript(is);
         es.initialize();
         return es;
     }
@@ -439,7 +442,7 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
         assertTrue(values.contains(new StringAttributeValue(TestSources.SP_ENTITY_ID)));
     }
 
-    @Nonnull protected IdPAttribute runExample(final String exampleScript, final String exampleData, final String attributeName)
+    @Nullable protected IdPAttribute runExampleNullable(final String exampleScript, final String exampleData, @Nonnull final String attributeName)
             throws ScriptException, IOException, ComponentInitializationException {
         final SAMLAttributeDataConnector connector = new SAMLAttributeDataConnector();
         connector.setAttributesStrategy(new Locator(exampleData));
@@ -469,9 +472,15 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
         } catch (final ResolutionException e) {
             fail("resolution failed", e);
         }
-
         return context.getResolvedIdPAttributes().get(attributeName);
-
+    }
+    
+    @Nonnull protected IdPAttribute runExample(final String exampleScript, final String exampleData, @Nonnull final String attributeName)
+            throws ScriptException, IOException, ComponentInitializationException {
+        final IdPAttribute result = runExampleNullable(exampleScript, exampleData, attributeName);
+        assert result != null;
+        return result;
+        
     }
 
     @Test public void examples() throws ScriptException, IOException, ComponentInitializationException {
@@ -512,12 +521,13 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
         assertTrue(set.contains(new StringAttributeValue("urn:mace:dir:entitlement:common-lib-terms")));
         assertTrue(set.contains(new StringAttributeValue("LittleGreenMen")));
 
-        attribute = runExample("example4.script", "example4.attribute.3.xml", "eduPersonEntitlement");
+        attribute = runExampleNullable("example4.script", "example4.attribute.3.xml", "eduPersonEntitlement");
         assertNull(attribute);
 
+
     }
 
-    private static AttributeResolutionContext generateContext() {
+    @Nonnull private static AttributeResolutionContext generateContext() {
         final AttributeResolutionContext ctx = TestSources.createResolutionContext(TestSources.PRINCIPAL_ID, TestSources.IDP_ENTITY_ID,
                 TestSources.SP_ENTITY_ID);
         return ctx;
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java
index 865f8acc1..8a7351e14 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java
@@ -25,6 +25,8 @@ import static org.testng.Assert.fail;
 
 import java.util.Set;
 
+import javax.annotation.Nonnull;
+
 import org.testng.annotations.Test;
 
 import net.shibboleth.idp.attribute.ByteAttributeValue;
@@ -267,11 +269,12 @@ public class MappedAttributeTest {
         assertFalse(result.getValues().isEmpty());
         assertEquals(result.getValues().size(), ResolverTestSupport.EPA3_VALUES.length);
         for (final String val : ResolverTestSupport.EPA3_VALUES) {
+            assert val != null;
             assertTrue(result.getValues().contains(new StringAttributeValue(val)));
         }
     }
 
-    protected ValueMap substringValueMapping(final String targetValue, final boolean caseInsensitive, final String returnValue) throws ComponentInitializationException {
+    @Nonnull protected ValueMap substringValueMapping(final String targetValue, final boolean caseInsensitive, @Nonnull final String returnValue) throws ComponentInitializationException {
         final ValueMap retVal = new ValueMap();
         retVal.setReturnValue(returnValue);
         retVal.setSourceValues(CollectionSupport.singleton(SourceValueTest.newSourceValue(returnValue, caseInsensitive, true)));
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java
index 4bfc38fa8..732dcea5e 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java
@@ -28,6 +28,7 @@ import java.security.cert.X509Certificate;
 import java.util.Map;
 import java.util.Set;
 
+import javax.annotation.Nonnull;
 import javax.script.ScriptException;
 
 import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
@@ -373,10 +374,16 @@ public class HTTPDataConnectorTest {
         connector.resolve(context);
         assertTrue(cache.size() == 0);
     }
+    
+    @Nonnull final static byte[] getCertArray(final String cert) throws IOException {
+        final InputStream certStream = FileBackedHTTPMetadataResolver.class.getResourceAsStream((SCRIPT_PATH + cert));
+        final byte certArray[] = ByteStreams.toByteArray(certStream);
+        assert certArray!=null;
+        return certArray;
+    }
 
     public static TrustEngine<? super X509Credential> buildPKIXTrustEngine(String cert, String name, boolean nameCheckEnabled) throws URISyntaxException, CertificateException, IOException {
-        final InputStream certStream = FileBackedHTTPMetadataResolver.class.getResourceAsStream((SCRIPT_PATH + cert));
-        final X509Certificate rootCert = X509Support.decodeCertificate(ByteStreams.toByteArray(certStream));
+        final X509Certificate rootCert = X509Support.decodeCertificate(getCertArray(cert));
         final PKIXValidationInformation info = new BasicPKIXValidationInformation(CollectionSupport.singletonList(rootCert), null, 5);
         final Set<String> trustedNames = name != null ? CollectionSupport.singleton(name) : CollectionSupport.emptySet();
         final StaticPKIXValidationInformationResolver resolver = new StaticPKIXValidationInformationResolver(CollectionSupport.singletonList(info), trustedNames);
@@ -386,9 +393,7 @@ public class HTTPDataConnectorTest {
     }
 
     public static TrustEngine<? super X509Credential> buildExplicitKeyTrustEngine(String cert) throws URISyntaxException, CertificateException, IOException {
-        
-        final InputStream certStream = FileBackedHTTPMetadataResolver.class.getResourceAsStream(SCRIPT_PATH + cert);
-        final X509Certificate entityCert = X509Support.decodeCertificate(ByteStreams.toByteArray(certStream));
+        final X509Certificate entityCert = X509Support.decodeCertificate(getCertArray(cert));
         assert entityCert != null;
         final X509Credential entityCredential = new BasicX509Credential(entityCert);
         return new ExplicitKeyTrustEngine(new StaticCredentialResolver(entityCredential));
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnectorTest.java
index 35c007aa3..ba7f347fc 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnectorTest.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.resolver.dc.impl;
 import static org.testng.Assert.assertEquals;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
@@ -49,7 +50,9 @@ public class ScriptedDataConnectorTest {
         final String name = "/net/shibboleth/idp/attribute/resolver/impl/dc/" + fileName;
         final EvaluableScript es = new EvaluableScript();
         es.setEngineName("javascript");
-        es.setScript(getClass().getResourceAsStream(name));
+        final InputStream is = getClass().getResourceAsStream(name);
+        assert is != null;
+        es.setScript(is);
         es.initialize();
         return es;
     }
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/StoredIDDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/StoredIDDataConnectorTest.java
index aaf79a76e..9e91dc53e 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/StoredIDDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/StoredIDDataConnectorTest.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import java.sql.SQLException;
 import java.util.List;
 
+import javax.annotation.Nonnull;
 import javax.sql.DataSource;
 
 import org.opensaml.core.testing.OpenSAMLInitBaseTestCase;
@@ -40,6 +41,7 @@ import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImpl;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeTest;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.testing.DatabaseTestingSupport;
 
@@ -49,11 +51,11 @@ import net.shibboleth.shared.testing.DatabaseTestingSupport;
 @SuppressWarnings("javadoc")
 public class StoredIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
 
-    private static final String INIT_FILE = "/net/shibboleth/idp/attribute/resolver/impl/dc/StoredIdStore.sql";
+    @Nonnull private static final String INIT_FILE = "/net/shibboleth/idp/attribute/resolver/impl/dc/StoredIdStore.sql";
 
-    private static final String DELETE_FILE = "/net/shibboleth/idp/attribute/resolver/impl/dc/DeleteStore.sql";
+    @Nonnull private static final String DELETE_FILE = "/net/shibboleth/idp/attribute/resolver/impl/dc/DeleteStore.sql";
 
-    private DataSource testSource;
+    @NonnullBeforeTest private DataSource testSource;
 
     @BeforeClass public void setupSource() throws SQLException, IOException {
 
@@ -61,6 +63,7 @@ public class StoredIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
     }
 
     @AfterClass public void teardown() {
+        assert testSource!=null;
         DatabaseTestingSupport.InitializeDataSource(DELETE_FILE, testSource);
     }
 
@@ -71,6 +74,7 @@ public class StoredIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
     private AttributeResolverImpl constructResolver(final int values, final boolean noSalt) throws ComponentInitializationException {
         
         final JDBCPairwiseIdStore store = new JDBCPairwiseIdStore();
+        assert testSource!=null;
         store.setDataSource(testSource);
         
         final PairwiseIdDataConnector connector = new PairwiseIdDataConnector();
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
index bb1f025e7..981ba5b83 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
@@ -25,6 +25,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
+import javax.annotation.Nonnull;
+
 import org.apache.velocity.runtime.RuntimeConstants;
 import org.ldaptive.ConnectionFactory;
 import org.ldaptive.DefaultConnectionFactory;
@@ -540,20 +542,20 @@ public class LDAPDataConnectorTest {
         assertTrue(attrs.get("mail").getValues().contains(new StringAttributeValue(" philip.principal at shibboleth.net ")));
     }
     
-    public static ParameterizedExecutableSearchFilterBuilder newParameterizedExecutableSearchFilterBuilder(final String filter) throws ComponentInitializationException {
+    @Nonnull public static ParameterizedExecutableSearchFilterBuilder newParameterizedExecutableSearchFilterBuilder(@Nonnull final String filter) throws ComponentInitializationException {
         final ParameterizedExecutableSearchFilterBuilder builder = new ParameterizedExecutableSearchFilterBuilder();
         builder.setSearchFilter(filter);
         builder.initialize();
         return builder;
     }
     
-    public static ConnectionFactoryValidator newConnectionFactoryValidator(final ConnectionFactory connectionFactory, final boolean throwValidateError) throws ComponentInitializationException {
+    @Nonnull public static ConnectionFactoryValidator newConnectionFactoryValidator(final ConnectionFactory connectionFactory, final boolean throwValidateError) throws ComponentInitializationException {
         final ConnectionFactoryValidator validator = new ConnectionFactoryValidator();
         validator.setThrowValidateError(throwValidateError);
         return validator;
     }
 
-    public static ConnectionFactoryValidator newConnectionFactoryValidator(final ConnectionFactory connectionFactory) throws ComponentInitializationException {
+    @Nonnull public static ConnectionFactoryValidator newConnectionFactoryValidator(final ConnectionFactory connectionFactory) throws ComponentInitializationException {
         final ConnectionFactoryValidator validator = new ConnectionFactoryValidator();
         return validator;
     }
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
index 10d511e42..7922d4d45 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
@@ -47,6 +47,7 @@ import net.shibboleth.idp.attribute.resolver.dc.rdbms.ResultMappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.rdbms.StringResultMappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.rdbms.TemplatedExecutableStatementBuilder;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeTest;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.UnmodifiableComponentException;
@@ -70,7 +71,7 @@ public class RDBMSDataConnectorTest {
 
     private static final String GROUP_QUERY = "SELECT name FROM groups WHERE userid='%s'";
 
-    private DataSource datasource;
+    @NonnullBeforeTest private DataSource datasource;
 
     /**
      * Creates an HSQLDB database instance.
@@ -82,6 +83,14 @@ public class RDBMSDataConnectorTest {
         datasource = DatabaseTestingSupport.GetMockDataSource(INIT_FILE, "RDBMSDataConnectorStore");
         DatabaseTestingSupport.InitializeDataSourceFromFile(DATA_FILE, datasource);
     }
+    
+    /** Nonnull getter for {@link #datasource}.
+     * @return {@link #datasource}
+     */
+    @Nonnull private DataSource getDataSourceInTest() {
+        assert datasource!=null;
+        return datasource;
+    }
 
     /**
      * Creates a RDBMS data connector using the supplied builder and strategy. Sets defaults values if the parameters
@@ -91,11 +100,11 @@ public class RDBMSDataConnectorTest {
      * @param strategy to map results
      * @return rdbms data connector
      */
-    protected RDBMSDataConnector createUserRdbmsDataConnector(final ExecutableSearchBuilder<ExecutableStatement> builder,
+    @Nonnull protected RDBMSDataConnector createUserRdbmsDataConnector(final ExecutableSearchBuilder<ExecutableStatement> builder,
             final ResultMappingStrategy strategy) {
         final RDBMSDataConnector connector = new RDBMSDataConnector();
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setDataSource(datasource);
+        connector.setDataSource(getDataSourceInTest());
         connector.setExecutableSearchBuilder(builder == null ? newFormatExecutableStatementBuilder(USER_QUERY) : builder);
         connector.setMappingStrategy(strategy == null ? new StringResultMappingStrategy() : strategy);
         return connector;
@@ -109,11 +118,11 @@ public class RDBMSDataConnectorTest {
      * @param strategy to map results
      * @return rdbms data connector
      */
-    protected RDBMSDataConnector createGroupRdbmsDataConnector(final ExecutableSearchBuilder<ExecutableStatement> builder,
+    @Nonnull protected RDBMSDataConnector createGroupRdbmsDataConnector(final ExecutableSearchBuilder<ExecutableStatement> builder,
             final ResultMappingStrategy strategy) {
         final RDBMSDataConnector connector = new RDBMSDataConnector();
         connector.setId(TEST_CONNECTOR_NAME + "ForGroups");
-        connector.setDataSource(datasource);
+        connector.setDataSource(getDataSourceInTest());
         connector.setExecutableSearchBuilder(builder == null ? newFormatExecutableStatementBuilder(GROUP_QUERY) : builder);
         connector.setMappingStrategy(strategy == null ? new StringResultMappingStrategy() : strategy);
         return connector;
@@ -149,7 +158,7 @@ public class RDBMSDataConnectorTest {
             // OK
         }
 
-        connector.setDataSource(datasource);
+        connector.setDataSource(getDataSourceInTest());
 
         final StringResultMappingStrategy mappingStrategy = new StringResultMappingStrategy();
         connector.setMappingStrategy(mappingStrategy);
@@ -377,13 +386,13 @@ public class RDBMSDataConnectorTest {
         assertTrue(attrs.get("MAIL").getValues().contains(new StringAttributeValue(" phil.principal at shibboleth.net ")));
     }
     
-    static protected FormatExecutableStatementBuilder newFormatExecutableStatementBuilder(@Nonnull final String query) {
+    @Nonnull static protected FormatExecutableStatementBuilder newFormatExecutableStatementBuilder(@Nonnull final String query) {
       final FormatExecutableStatementBuilder builder = new FormatExecutableStatementBuilder();
       builder.setQuery(query);
       return builder;
     }
 
-    static protected FormatExecutableStatementBuilder newFormatExecutableStatementBuilder(@Nonnull final String query, @Nonnull final Duration timeout) {
+    @Nonnull static protected FormatExecutableStatementBuilder newFormatExecutableStatementBuilder(@Nonnull final String query, @Nonnull final Duration timeout) {
         final FormatExecutableStatementBuilder builder = new FormatExecutableStatementBuilder();
         builder.setQuery(query);
         builder.setQueryTimeout(timeout);
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnectorTest.java
index bea83117d..d851882d7 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnectorTest.java
@@ -39,6 +39,7 @@ import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.dc.impl.TestCache;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeTest;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.spring.resource.ResourceHelper;
 import net.shibboleth.shared.testing.VelocityEngine;
@@ -53,19 +54,21 @@ public class StorageServiceDataConnectorTest {
     
     private static final String SCRIPT_PATH = "/net/shibboleth/idp/attribute/resolver/impl/dc/storage/";
     
-    private MemoryStorageService storage;
-    private StorageServiceDataConnector connector;
+    @NonnullBeforeTest private MemoryStorageService storage;
+    @NonnullBeforeTest private StorageServiceDataConnector connector;
 
     @BeforeMethod public void setUp() throws Exception {
         
-        storage = new MemoryStorageService();
+        final MemoryStorageService mss = storage = new MemoryStorageService();
         storage.setId("ss");
-        storage.setCleanupInterval(Duration.ZERO);
+        final Duration dZero = Duration.ZERO;
+        assert dZero!=null;
+        storage.setCleanupInterval(dZero);
         storage.initialize();
         
         connector = new StorageServiceDataConnector();
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setStorageService(storage);
+        connector.setStorageService(mss);
     }
     
     @AfterMethod public void tearDown() {
@@ -182,8 +185,9 @@ public class StorageServiceDataConnectorTest {
         
         connector.setMappingStrategy(mapper);
         connector.initialize();
-        
-        storage.create("foo", "bar", Files.streamToString(getClass().getResourceAsStream(SCRIPT_PATH + "test.json")), null);
+        final String testJson = Files.streamToString(getClass().getResourceAsStream(SCRIPT_PATH + "test.json"));
+        assert testJson!=null;
+        storage.create("foo", "bar", testJson, null);
 
         final AttributeResolutionContext context =
                 TestSources.createResolutionContext(TestSources.PRINCIPAL_ID, TestSources.IDP_ENTITY_ID,
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/PluginDependencySupportTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/PluginDependencySupportTest.java
index 1a3de1473..c7bcb62ee 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/PluginDependencySupportTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/PluginDependencySupportTest.java
@@ -35,7 +35,7 @@ import net.shibboleth.shared.collection.CollectionSupport;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
- at SuppressWarnings("javadoc")
+ at SuppressWarnings({"null", "javadoc"})
 public class PluginDependencySupportTest {
 
     @Test public void getMergedAttributeValueWithAttributeDefinitionDependencyOld() {
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/MetadataDrivenConfigurationTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/MetadataDrivenConfigurationTest.java
index 06ce39e66..4a200a4d7 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/MetadataDrivenConfigurationTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/MetadataDrivenConfigurationTest.java
@@ -49,6 +49,7 @@ import net.shibboleth.idp.attribute.config.SetConfigurationLookupStrategy;
 import net.shibboleth.idp.attribute.config.StringConfigurationLookupStrategy;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.saml.attribute.impl.AttributeMappingNodeProcessor;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeTest;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.FunctionSupport;
@@ -63,15 +64,15 @@ import net.shibboleth.shared.spring.custom.SchemaTypeAwareXMLBeanDefinitionReade
 @SuppressWarnings("javadoc")
 public class MetadataDrivenConfigurationTest extends XMLObjectBaseTestCase {
 
-    private EntityDescriptor entityDescriptor;
+    @NonnullBeforeTest private EntityDescriptor entityDescriptor;
 
-    private ReloadableService<AttributeTranscoderRegistry> service;
+    @NonnullBeforeTest private ReloadableService<AttributeTranscoderRegistry> service;
 
-    private AttributeMappingNodeProcessor processor;
+    @NonnullBeforeTest private AttributeMappingNodeProcessor processor;
     
     private GenericApplicationContext pendingTeardownContext;
     
-    private ProfileRequestContext prc;
+    @NonnullBeforeTest private ProfileRequestContext prc;
     
     @AfterClass public void tearDownTestContext() {
         if (null != pendingTeardownContext ) {
@@ -101,6 +102,16 @@ public class MetadataDrivenConfigurationTest extends XMLObjectBaseTestCase {
         entityDescriptor = null;
         prc = null;
     }
+    
+    @Nonnull private EntityDescriptor getEntityDescriptorInTest() {
+        assert entityDescriptor!=null;
+        return entityDescriptor;
+    }
+    
+    @Nonnull private AttributeMappingNodeProcessor getProcessorInTest() {
+        assert processor!=null;
+        return processor;
+    }
 
     @Nonnull private ReloadableService<AttributeTranscoderRegistry> getService() {
         final GenericApplicationContext context = new GenericApplicationContext();
@@ -121,7 +132,9 @@ public class MetadataDrivenConfigurationTest extends XMLObjectBaseTestCase {
                 "/net/shibboleth/idp/saml/attribute/impl/service.xml");
         context.refresh();
 
-        return context.getBean(ReloadableService.class);
+        @SuppressWarnings("unchecked")
+        final ReloadableService<AttributeTranscoderRegistry> result = context.getBean(ReloadableService.class);
+        return result;
     }
 
     @Test public void testBooleanProfileTag() throws ComponentInitializationException, FilterException {
@@ -138,8 +151,7 @@ public class MetadataDrivenConfigurationTest extends XMLObjectBaseTestCase {
         // Unmapped.
         Assert.assertEquals(fn.apply(prc), true);
 
-        assert processor != null;
-        processor.process(entityDescriptor);
+        getProcessorInTest().process(getEntityDescriptorInTest());
 
         // Mapped.
         Assert.assertEquals(fn.apply(prc), true);
@@ -160,8 +172,7 @@ public class MetadataDrivenConfigurationTest extends XMLObjectBaseTestCase {
         // Unmapped.
         Assert.assertEquals(fn.apply(prc), true);
 
-        assert processor != null;
-        processor.process(entityDescriptor);
+        getProcessorInTest().process(getEntityDescriptorInTest());
 
         // Mapped.
         Assert.assertEquals(fn.apply(prc), true);
@@ -184,8 +195,7 @@ public class MetadataDrivenConfigurationTest extends XMLObjectBaseTestCase {
         
         DeprecationSupport.clearWarningState();
 
-        assert processor != null;
-        processor.process(entityDescriptor);
+        getProcessorInTest().process(getEntityDescriptorInTest());
 
         // Mapped.
         Assert.assertEquals(fn.apply(prc), true);
@@ -205,8 +215,7 @@ public class MetadataDrivenConfigurationTest extends XMLObjectBaseTestCase {
         // Unmapped.
         Assert.assertEquals(fn.apply(prc), "foo");
 
-        assert processor != null;
-        processor.process(entityDescriptor);
+        getProcessorInTest().process(getEntityDescriptorInTest());
 
         // Mapped.
         Assert.assertEquals(fn.apply(prc), "foo");
@@ -226,8 +235,7 @@ public class MetadataDrivenConfigurationTest extends XMLObjectBaseTestCase {
         // Unmapped.
         Assert.assertEquals(fn.apply(prc), 42);
 
-        assert processor != null;
-        processor.process(entityDescriptor);
+        getProcessorInTest().process(getEntityDescriptorInTest());
 
         // Mapped.
         Assert.assertEquals(fn.apply(prc), 42);
@@ -248,8 +256,7 @@ public class MetadataDrivenConfigurationTest extends XMLObjectBaseTestCase {
         // Unmapped.
         Assert.assertEquals(fn.apply(prc), CollectionSupport.listOf("foo", "bar"));
 
-        assert processor != null;
-        processor.process(entityDescriptor);
+        getProcessorInTest().process(getEntityDescriptorInTest());
 
         // Mapped.
         Assert.assertEquals(fn.apply(prc), CollectionSupport.listOf("foo", "bar"));
@@ -270,8 +277,7 @@ public class MetadataDrivenConfigurationTest extends XMLObjectBaseTestCase {
         // Unmapped.
         Assert.assertEquals(fn.apply(prc), CollectionSupport.setOf("foo", "bar"));
 
-        assert processor != null;
-        processor.process(entityDescriptor);
+        getProcessorInTest().process(getEntityDescriptorInTest());
 
         // Mapped.
         Assert.assertEquals(fn.apply(prc), CollectionSupport.setOf("foo", "bar"));
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/SAMLAttributeDataConnector.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/SAMLAttributeDataConnector.java
index 0ee8cc712..bd293ebe8 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/SAMLAttributeDataConnector.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/SAMLAttributeDataConnector.java
@@ -124,7 +124,10 @@ public class SAMLAttributeDataConnector extends AbstractDataConnector {
         if (separator < 0) {
             return new StringAttributeValue(value);
         }
-        return new ScopedStringAttributeValue(value.substring(0, separator), value.substring(separator + 1));
+        final String subString1 = value.substring(0, separator);
+        final String subString2 = value.substring(separator + 1);
+        assert subString1!=null && subString2!=null;
+        return new ScopedStringAttributeValue(subString1, subString2);
     }
 
     /**
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/TestSources.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/TestSources.java
index b03c9d9fc..de4d8e669 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/TestSources.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/TestSources.java
@@ -67,6 +67,7 @@ public final class TestSources {
     @Nonnull @NotEmpty public static final String[] SECOND_ATTRIBUTE_VALUE_STRINGS = {"at2-Val1", "at2-Val2"};
 
     /** Some test attributes. */
+    @SuppressWarnings("null")
     @Nonnull public static final StringAttributeValue[] SECOND_ATTRIBUTE_VALUE_RESULTS = {
             new StringAttributeValue(SECOND_ATTRIBUTE_VALUE_STRINGS[0]),
             new StringAttributeValue(SECOND_ATTRIBUTE_VALUE_STRINGS[0]),};
@@ -96,6 +97,7 @@ public final class TestSources {
     @Nonnull @NotEmpty public static final String CONNECTOR_ATTRIBUTE_VALUE_REGEXP = "at1-(.+)or";
 
     /** Regexp. for CONNECTOR_ATTRIBUTE_VALUE (for map and regexp testing). */
+    @SuppressWarnings("null")
     @Nonnull public static final Pattern CONNECTOR_ATTRIBUTE_VALUE_REGEXP_PATTERN =
             Pattern.compile(CONNECTOR_ATTRIBUTE_VALUE_REGEXP);
 
@@ -149,6 +151,7 @@ public final class TestSources {
      * @return The connector
      * @throws ComponentInitializationException if we cannot initialized (unlikely)
      */
+    @SuppressWarnings("null")
     @Nonnull public static DataConnector populatedStaticConnector() throws ComponentInitializationException {
         List<IdPAttribute> attributeSet = new ArrayList<>(2);
 
@@ -301,6 +304,7 @@ public final class TestSources {
                 @Nonnull final AttributeResolutionContext resolutionContext,
                 @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
             checkComponentActive();
+            assert value!=null;
             return value;
         }
     }
@@ -357,6 +361,7 @@ public final class TestSources {
                 @Nonnull final AttributeResolutionContext resolutionContext,
                 @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
             checkComponentActive();
+            assert attributes!=null;
             return attributes;
         }
     }

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list