[java-shib-attribute] branch main updated: Null checking

Rod Widdowson rdw at steadingsoftware.com
Mon Jan 30 09:57:45 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=ed01b2ecb1bace134b1b5e5eaae917bb84092895

The following commit(s) were added to refs/heads/main by this push:
     new ed01b2ecb Null checking
ed01b2ecb is described below

commit ed01b2ecb1bace134b1b5e5eaae917bb84092895
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Sun Jan 29 15:20:50 2023 +0000

    Null checking
    
    Use non-null methods where they are available.
    Pick off some more low hanging fruit.
---
 .../idp/attribute/AttributesMapContainer.java      |  4 +++-
 .../net/shibboleth/idp/attribute/IdPAttribute.java |  3 ++-
 .../idp/attribute/context/AttributeContext.java    |  9 ++++----
 .../attribute/filter/AttributeFilterPolicy.java    |  6 ++---
 .../shibboleth/idp/attribute/filter/Matcher.java   |  4 ++--
 .../idp/attribute/filter/MatcherFromPolicy.java    |  4 ++--
 .../filter/context/AttributeFilterContext.java     | 13 ++++++-----
 .../filter/matcher/impl/ScriptedMatcher.java       |  7 +++---
 .../logic/impl/AbstractComposedMatcher.java        |  5 ++--
 .../impl/AbstractMatchesShibMDScopeMatcher.java    |  9 ++++----
 .../saml/impl/AttributeInMetadataMatcher.java      | 24 ++++++++++---------
 .../impl/ProxiedRequesterPolicyRule.java           |  5 ----
 .../impl/ProxiedRequesterRegexpPolicyRule.java     |  5 ----
 .../filter/policyrule/impl/ScriptedPolicyRule.java | 16 ++++++-------
 .../AbstractRegistrationAuthorityPolicyRule.java   |  6 ++---
 .../policyrule/impl/ScriptedPolicyRuleTest.java    |  2 +-
 .../attribute/impl/ComputedPairwiseIdStore.java    |  5 ++--
 .../impl/AttributeTranscoderRegistryImpl.java      | 27 +++++++++++-----------
 .../transcoding/impl/TranscodingRuleLoader.java    |  4 +++-
 .../attribute/resolver/AbstractDataConnector.java  |  4 ++--
 .../attribute/resolver/AbstractResolverPlugin.java | 14 +++++------
 .../resolver/ResolverDataConnectorDependency.java  |  7 +++---
 .../context/AttributeResolutionContext.java        | 11 +++++----
 .../resolver/dc/AbstractMappingStrategy.java       |  6 ++---
 .../dc/rdbms/StringResultMappingStrategy.java      |  4 ++--
 .../ad/impl/DateTimeAttributeDefinition.java       |  8 ++++---
 .../ad/impl/PrincipalNameAttributeDefinition.java  |  5 ++--
 .../ad/impl/ScriptedAttributeDefinition.java       |  7 +++---
 .../ad/mapped/impl/MappedAttributeDefinition.java  |  9 ++++----
 .../resolver/ad/mapped/impl/ValueMap.java          |  5 ++--
 .../dc/http/impl/AbstractHTTPSearchBuilder.java    | 10 ++++----
 .../http/impl/ScriptedResponseMappingStrategy.java | 10 ++++----
 .../dc/impl/AbstractSearchDataConnector.java       |  4 ++--
 .../resolver/dc/impl/PairwiseIdDataConnector.java  |  3 ++-
 .../resolver/dc/impl/ScriptedDataConnector.java    |  8 +++----
 .../resolver/impl/AttributeResolverImpl.java       |  4 +++-
 .../dc/impl/StoredIdDataConnectorParserTest.java   |  1 +
 .../rdbms/impl/RDBMSDataConnectorParserTest.java   |  4 ++--
 .../resolver/testing/MockDataConnector.java        |  6 ++---
 .../attribute/resolver/testing/TestSources.java    |  4 ++--
 .../AbstractSAML1AttributeTranscoder.java          |  6 ++---
 .../AbstractSAML2AttributeTranscoder.java          | 22 +++++++++---------
 .../impl/AttributeMappingNodeProcessor.java        |  6 ++---
 43 files changed, 170 insertions(+), 156 deletions(-)

diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
index b0cd4e3de..1764c56d4 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
@@ -30,6 +30,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullElements;
 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.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 
 /**
@@ -74,7 +75,8 @@ public final class AttributesMapContainer implements Supplier<Multimap<String,Id
                 .filter(StringAttributeValue.class::isInstance)
                 .map(StringAttributeValue.class::cast)
                 .map(StringAttributeValue::getValue)
-                .collect(Collectors.toUnmodifiableList());
+                .collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList()))
+                .get();
     }
     
 }
\ No newline at end of file
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java
index 55308181b..80a44a7e6 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java
@@ -134,7 +134,8 @@ public class IdPAttribute implements Comparable<IdPAttribute>, Cloneable {
         if (newValues != null) {
             values = newValues.stream().
                      map(e -> e==null? new EmptyAttributeValue(EmptyType.NULL_VALUE) :e).
-                     collect(Collectors.toUnmodifiableList());
+                     collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).
+                     get();
         } else {
             values = CollectionSupport.emptyList();
         }
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/AttributeContext.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/AttributeContext.java
index 00fa841bb..74471e234 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/AttributeContext.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/AttributeContext.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.attribute.context;
 
 import java.util.Collection;
 import java.util.Map;
+import java.util.stream.Collector;
 import java.util.stream.Collectors;
 
 import javax.annotation.Nonnull;
@@ -77,9 +78,9 @@ public final class AttributeContext extends BaseContext {
         if (newAttributes != null) {
             attributes = newAttributes.
                     stream().
-                    collect(Collectors.toUnmodifiableMap(IdPAttribute::getId,
+                    collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableMap(IdPAttribute::getId,
                             a -> a,
-                            CollectionSupport.warningMergeFunction("AttrtibuteContext", true)));
+                            CollectionSupport.warningMergeFunction("AttrtibuteContext", true)))).get();
         } else {
             attributes = CollectionSupport.emptyMap();
         }
@@ -109,9 +110,9 @@ public final class AttributeContext extends BaseContext {
         if (null != newAttributes) {
             unfilteredAttributes = newAttributes.
                     stream().
-                    collect(Collectors.toUnmodifiableMap(IdPAttribute::getId,
+                    collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableMap(IdPAttribute::getId,
                             a -> a,
-                            CollectionSupport.warningMergeFunction("AttrtibuteContextUnfiltered", true)));
+                            CollectionSupport.warningMergeFunction("AttrtibuteContextUnfiltered", true)))).get();
         } else {
             unfilteredAttributes = CollectionSupport.emptyMap();
         }
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicy.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicy.java
index 31324c476..546117001 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicy.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicy.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -34,6 +33,7 @@ import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiedInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.UnmodifiableComponent;
@@ -79,9 +79,9 @@ public final class AttributeFilterPolicy extends AbstractIdentifiedInitializable
         rule = Constraint.isNotNull(requirementRule, "Attribute filter policy activiation criterion can not be null");
 
         if (null != attributeRules) {
-            valuePolicies = List.copyOf(attributeRules);
+            valuePolicies = CollectionSupport.copyToList(attributeRules);
         } else {
-            valuePolicies = Collections.emptyList();
+            valuePolicies = CollectionSupport.emptyList();
         }
     }
 
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java
index e23027955..a46b4cf55 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter;
 
-import java.util.Collections;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
@@ -29,6 +28,7 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.IdentifiedComponent;
 
 /** Java definition of MatchFunctorType as applied to value filtering. */
@@ -56,7 +56,7 @@ public interface Matcher extends IdentifiedComponent {
         /** {@inheritDoc} */
         @Override public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
                 @Nonnull final AttributeFilterContext filterContext) {
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
 
         @Override @Nullable public String getId() {
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicy.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicy.java
index 2c06fd8fa..d97f3aecd 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicy.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicy.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter;
 
-import java.util.Collections;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
@@ -30,6 +29,7 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule.Tristate;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.ParameterName;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.DestructableComponent;
 import net.shibboleth.shared.component.IdentifiedComponent;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -79,7 +79,7 @@ public final class MatcherFromPolicy extends BaseBridgingClass implements Matche
             return null;
         } else if (Tristate.FALSE == result) {
             log.debug("{} The rule returned FALSE, no values returned", getLogPrefix());
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         } else {
             log.debug("{} The rule returned TRUE, all values returned", getLogPrefix());
             return Set.copyOf(attribute.getValues());
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java
index 98245c2f5..cc9a34474 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java
@@ -208,10 +208,11 @@ public final class AttributeFilterContext extends BaseContext {
         if (attributes != null) {
             prefilteredAttributes = attributes.
                     stream().
-                    collect(Collectors.toUnmodifiableMap(IdPAttribute::getId, e -> e,
-                            CollectionSupport.warningMergeFunction("AttrtibuteFilterContextPrefiltered", true)));
+                    collect(CollectionSupport.nonnullCollector(
+                            Collectors.toUnmodifiableMap(IdPAttribute::getId, e -> e,
+                            CollectionSupport.warningMergeFunction("AttrtibuteFilterContextPrefiltered", true)))).get();
         } else {
-            prefilteredAttributes = Collections.emptyMap();
+            prefilteredAttributes = CollectionSupport.emptyMap();
         }
         
         return this;
@@ -239,11 +240,11 @@ public final class AttributeFilterContext extends BaseContext {
         if (attributes != null) {
             filteredAttributes = attributes.
                     stream().
-                    collect(Collectors.toUnmodifiableMap(IdPAttribute::getId,
+                    collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableMap(IdPAttribute::getId,
                             e -> e,
-                            CollectionSupport.warningMergeFunction("AttrtibuteFilterContextFiltered", true)));
+                            CollectionSupport.warningMergeFunction("AttrtibuteFilterContextFiltered", true)))).get();
         } else {
-            filteredAttributes = Collections.emptyMap();
+            filteredAttributes = CollectionSupport.emptyMap();
         }
         
         return this;
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
index f9836d73b..69ae01dc7 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
@@ -42,6 +42,7 @@ import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.UnmodifiableComponent;
@@ -75,7 +76,7 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
 
     /** Constructor. */
     public ScriptedMatcher() {
-        contextExtenders = Collections.emptyList();
+        contextExtenders = CollectionSupport.emptyList();
     }
 
     /**
@@ -130,9 +131,9 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
         checkSetterPreconditions();
 
         if (extenders != null) {
-            contextExtenders = List.copyOf(extenders);
+            contextExtenders = CollectionSupport.copyToList(extenders);
         } else {
-            contextExtenders = Collections.emptyList();
+            contextExtenders = CollectionSupport.emptyList();
         }
     }
     
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java
index d0d6b41ac..f01e40b53 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.logic.impl;
 
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -27,6 +26,7 @@ import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.UnmodifiableComponent;
@@ -51,7 +51,7 @@ public abstract class AbstractComposedMatcher extends AbstractIdentifiableInitia
         if (composedMatchers != null) {
             matchers = List.copyOf(composedMatchers);
         } else {
-            matchers = Collections.emptyList();
+            matchers = CollectionSupport.emptyList();
         }
     }
 
@@ -69,6 +69,7 @@ public abstract class AbstractComposedMatcher extends AbstractIdentifiableInitia
      * @return the composed matchers
      */
     @Nonnull @NonnullElements @Unmodifiable public List<Matcher> getComposedMatchers() {
+        assert matchers != null;
         return matchers;
     }
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java
index a270515bd..486a7ff9b 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java
@@ -38,6 +38,7 @@ import net.shibboleth.idp.saml.metadata.ScopesContainer;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -73,14 +74,14 @@ public abstract class AbstractMatchesShibMDScopeMatcher
         if (issuerContext == null) {
             LOG.warn("{} internal error: no IssueContext found",
                     getLogPrefix());
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
         final RoleDescriptor roleDescriptor = issuerContext.getRoleDescriptor();
         final EntityDescriptor entityDescriptor = issuerContext.getEntityDescriptor();
         final List<ScopesContainer> roleContainers;
         if (roleDescriptor == null) {
             LOG.debug("{} No Role Descriptor found");
-            roleContainers = Collections.emptyList();
+            roleContainers = CollectionSupport.emptyList();
         } else {
             roleContainers = roleDescriptor.getObjectMetadata().get(ScopesContainer.class);
         }
@@ -88,7 +89,7 @@ public abstract class AbstractMatchesShibMDScopeMatcher
         final List<ScopesContainer> entityContainers;
         if (entityDescriptor == null) {
             LOG.debug("{} No Entity Descriptor found");
-            entityContainers = Collections.emptyList(); 
+            entityContainers = CollectionSupport.emptyList(); 
         } else {
             entityContainers= entityDescriptor.getObjectMetadata().get(ScopesContainer.class);
         }
@@ -101,7 +102,7 @@ public abstract class AbstractMatchesShibMDScopeMatcher
             LOG.debug("{} No <shibmd:Scope> found for {}, no atributes matched",
                     getLogPrefix(),
                     entityDescriptor == null? "<unknown>" : entityDescriptor.getID());
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
         
         for (final IdPAttributeValue value : attribute.getValues()) {
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java
index f2af0e47c..6194d28bc 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java
@@ -56,6 +56,7 @@ import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
@@ -187,11 +188,11 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
             if (matchIfMetadataSilent) {
                 log.debug("{} The peer's metadata did not contain requested attribute information"
                         + ", returning all the input values", getLogPrefix());
-                return Set.copyOf(attribute.getValues());
+                return CollectionSupport.copyToSet(attribute.getValues());
             }
             log.debug("{} The peer's metadata did not contain requested attribute information"
                     + ", returning no values", getLogPrefix());
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
     
         if (attributeName != null) {
@@ -204,13 +205,13 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
 
             if (null == requestedAttribute) {
                 log.debug("{} Attribute {} not found in metadata", getLogPrefix(), attributeToLog);
-                return Collections.emptySet();
+                return CollectionSupport.emptySet();
             }
         
             if (onlyIfRequired && !requestedAttribute.isRequired()) {
                 log.debug("{} Attribute {} found in metadata, but was not required, values not matched",
                         getLogPrefix(), attributeToLog);
-                return Collections.emptySet();
+                return CollectionSupport.emptySet();
             }
             
             final Set<IdPAttributeValue> values = new LinkedHashSet<>();
@@ -228,17 +229,17 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
                 // TODO: not sure what the right answer is here
                 log.debug("{} The peer's metadata did not contain requested attribute information"
                         + ", returning all the input values", getLogPrefix());
-                return Set.copyOf(attribute.getValues());
+                return CollectionSupport.copyToSet(attribute.getValues());
             }
             log.debug("{} The peer's metadata did not contain requested attribute information"
                     + ", returning no values", getLogPrefix());
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
                 
         final Collection<IdPAttribute> requestedAttributeList = requestedAttributes.get(attribute.getId());
         if (null == requestedAttributeList) {
             log.debug("{} Decoded attribute {} not found in metadata", getLogPrefix(), attribute.getId());
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
 
         final Set<IdPAttributeValue> values = new LinkedHashSet<>();
@@ -342,11 +343,12 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
 
         if (null == requestedValues || requestedValues.isEmpty()) {
             log.debug("{} Attribute {} found in metadata and no values specified", getLogPrefix(), attribute.getId());
-            return Set.copyOf(attribute.getValues());
+            return CollectionSupport.copyToSet(attribute.getValues());
         }
         
         final Set<IdPAttributeValue> result = attribute.getValues().stream().
-                filter(v -> requestedValues.contains(v)).collect(Collectors.toUnmodifiableSet());
+                filter(v -> requestedValues.contains(v)).
+                collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableSet())).get();
 
         log.debug("{} Values matched with metadata for Attribute {} : {}", getLogPrefix(), attribute.getId(), result);
         return result;
@@ -368,7 +370,7 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
 
         if (requestedValues.isEmpty()) {
             log.debug("{} Attribute {} found in metadata and no values specified", getLogPrefix(), attributeToLog);
-            return Set.copyOf(attribute.getValues());
+            return CollectionSupport.copyToSet(attribute.getValues());
         }
 
         final Set<IdPAttributeValue> result = new LinkedHashSet<>(attribute.getValues().size());
@@ -387,7 +389,7 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
         }
         
         log.debug("{} Values matched with metadata for Attribute {} : {}", getLogPrefix(), attributeToLog, result);
-        return Set.copyOf(result);
+        return CollectionSupport.copyToSet(result);
     }
 
 // Checkstyle: CyclomaticComplexity OFF
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java
index 8bd2b3ce8..d1f0c3ba0 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java
@@ -20,11 +20,9 @@ package net.shibboleth.idp.attribute.filter.policyrule.filtercontext.impl;
 import javax.annotation.Nonnull;
 
 import org.opensaml.profile.context.ProxiedRequesterContext;
-import org.slf4j.Logger;
 
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.filter.policyrule.impl.AbstractStringPolicyRule;
-import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Compare a proxied attribute requester's entity ID for this resolution with the provided name.
@@ -33,9 +31,6 @@ import net.shibboleth.shared.primitive.LoggerFactory;
  */
 public class ProxiedRequesterPolicyRule extends AbstractStringPolicyRule {
 
-    /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(ProxiedRequesterPolicyRule.class);
-
     /**
      * Compare the requester from the context with the provided string.
      * 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRule.java
index 4477d43ff..7148e38a8 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRule.java
@@ -20,11 +20,9 @@ package net.shibboleth.idp.attribute.filter.policyrule.filtercontext.impl;
 import javax.annotation.Nonnull;
 
 import org.opensaml.profile.context.ProxiedRequesterContext;
-import org.slf4j.Logger;
 
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.filter.policyrule.impl.AbstractRegexpPolicyRule;
-import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Compare a proxied attribute requester's entity ID for this resolution with the provided regexp.
@@ -33,9 +31,6 @@ import net.shibboleth.shared.primitive.LoggerFactory;
  */
 public class ProxiedRequesterRegexpPolicyRule extends AbstractRegexpPolicyRule {
 
-    /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(ProxiedRequesterRegexpPolicyRule.class);
-
     /**
      * Compare the requester from the context with the provided regexp.
      * 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
index d6b68d24a..26aee03e4 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
@@ -18,8 +18,6 @@
 package net.shibboleth.idp.attribute.filter.policyrule.impl;
 
 import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
 import java.util.Objects;
 
 import javax.annotation.Nonnull;
@@ -37,6 +35,7 @@ import net.shibboleth.idp.attribute.filter.PolicyRequirementRule;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.UnmodifiableComponent;
@@ -71,7 +70,7 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
 
     /** Constructor. */
     public ScriptedPolicyRule() {
-        contextExtenders = Collections.emptyList();
+        contextExtenders = CollectionSupport.emptyList();
     }
     
     /**
@@ -98,7 +97,8 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
      * 
      * @return the script to be evaluated
      */
-    @NonnullAfterInit public EvaluableScript getScript() {
+    @Nonnull private EvaluableScript getScript() {
+        assert script != null;
         return script;
     }
 
@@ -123,9 +123,9 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
             @Nullable @NonnullElements final Collection<FilterScriptContextExtender> extenders) {
         checkSetterPreconditions();
         if (extenders != null) {
-            contextExtenders = List.copyOf(extenders);
+            contextExtenders = CollectionSupport.copyToList(extenders);
         } else {
-            contextExtenders = Collections.emptyList();
+            contextExtenders = CollectionSupport.emptyList();
         }
     }
     
@@ -162,7 +162,7 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
             throw new ComponentInitializationException("No script has been provided");
         }
 
-        scriptEvaluator = new PolicyRuleScriptEvaluator(script);
+        scriptEvaluator = new PolicyRuleScriptEvaluator(getScript());
         scriptEvaluator.setCustomObject(customObject);
         scriptEvaluator.setContextExtenders(contextExtenders);
         
@@ -186,7 +186,7 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
 
         final ScriptedPolicyRule other = (ScriptedPolicyRule) obj;
 
-        return script.equals(other.getScript());
+        return other.getScript().equals(script);
     }
 
     /** {@inheritDoc} */
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java
index ed776f324..272048ffb 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.attribute.filter.policyrule.saml.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
@@ -37,6 +36,7 @@ import net.shibboleth.idp.attribute.filter.policyrule.impl.AbstractPolicyRule;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
@@ -59,7 +59,7 @@ public abstract class AbstractRegistrationAuthorityPolicyRule extends AbstractPo
      * Constructor.
      */
     public AbstractRegistrationAuthorityPolicyRule() {
-        registrars = Collections.emptySet();
+        registrars = CollectionSupport.emptySet();
     }
     
     /**
@@ -68,7 +68,7 @@ public abstract class AbstractRegistrationAuthorityPolicyRule extends AbstractPo
      * @return the issuers
      */
     @Nonnull @NonnullElements @Unmodifiable @NotLive public Set<String> getRegistrars() {
-        return Set.copyOf(registrars);
+        return CollectionSupport.copyToSet(registrars);
     }
 
     /**
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRuleTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRuleTest.java
index 532597234..56e825eb7 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRuleTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRuleTest.java
@@ -160,7 +160,7 @@ public class ScriptedPolicyRuleTest extends AbstractMatcherPolicyRuleTest {
     }
 
     @SuppressWarnings("unlikely-arg-type")
-    @Test public void testEqualsHashToString() {
+    @Test public void testEqualsHashToString() throws ComponentInitializationException {
         final ScriptedPolicyRule rule = newScriptedPolicyRule(trueReturnScript);
 
         rule.toString();
diff --git a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStore.java b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStore.java
index bb52d1e8c..4db815c32 100644
--- a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStore.java
+++ b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStore.java
@@ -40,6 +40,7 @@ import net.shibboleth.shared.codec.Base32Support;
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.DecodingException;
 import net.shibboleth.shared.codec.EncodingException;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -96,7 +97,7 @@ public class ComputedPairwiseIdStore extends AbstractInitializableComponent impl
     public ComputedPairwiseIdStore() {
         algorithm = "SHA";
         encoding = Encoding.BASE64;
-        exceptionMap = Collections.emptyMap();
+        exceptionMap = CollectionSupport.emptyMap();
     }
     
     /**
@@ -212,7 +213,7 @@ public class ComputedPairwiseIdStore extends AbstractInitializableComponent impl
         checkSetterPreconditions();
         
         if (map == null) {
-            exceptionMap = Collections.emptyMap();
+            exceptionMap = CollectionSupport.emptyMap();
         } else {
             exceptionMap = new HashMap<>(map.size());
             for (final Map.Entry<String,Map<String,String>> entry : map.entrySet()) {
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 79a73a9ec..e54676673 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
@@ -47,6 +47,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullElements;
 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.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.DeprecationSupport;
@@ -161,7 +162,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
                 }
                 
                 final Collection<AttributeTranscoder<?>> transcoders = getAttributeTranscoders(mapping);
-                for (final AttributeTranscoder<?> transcoder : transcoders) {
+                for (@Nonnull final AttributeTranscoder<?> transcoder : transcoders) {
                     addMapping(internalId, transcoder, mapping.getMap());
                 }
             } else {
@@ -194,7 +195,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
         if (displayNameRegistry.containsKey(attribute.getId())) {
             return displayNameRegistry.get(attribute.getId());
         }
-        return Collections.emptyMap();
+        return CollectionSupport.emptyMap();
     }
 
     /** {@inheritDoc} */
@@ -206,7 +207,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
         if (descriptionRegistry.containsKey(attribute.getId())) {
             return descriptionRegistry.get(attribute.getId());
         }
-        return Collections.emptyMap();
+        return CollectionSupport.emptyMap();
     }
     
     /** {@inheritDoc} */
@@ -218,18 +219,18 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
         
         final Multimap<Class<?>,TranscodingRule> propertyCollections = transcodingRegistry.get(from.getId());
         if (propertyCollections == null) {
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
         
         final Class<?> effectiveType = getEffectiveType(to);
         if (effectiveType == null) {
             log.warn("Unsupported object type: {}", to.getClass().getName());
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
         
         log.trace("Using rules for effective type {}", effectiveType.getName());
         
-        return List.copyOf(propertyCollections.get(effectiveType));
+        return CollectionSupport.copyToList(propertyCollections.get(effectiveType));
     }
 
     /** {@inheritDoc} */
@@ -241,7 +242,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
         final Class<?> effectiveType = getEffectiveType(from.getClass());
         if (effectiveType == null) {
             log.warn("Unsupported object type: {}", from.getClass().getName());
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
         
         log.trace("Using rules for effective type {}", effectiveType.getName());
@@ -253,12 +254,12 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
         if (id != null) {
             final Multimap<Class<?>,TranscodingRule> propertyCollections = transcodingRegistry.get(id);
             
-            return propertyCollections != null ? List.copyOf(propertyCollections.get(effectiveType))
-                    : Collections.emptyList();
+            return propertyCollections != null ? CollectionSupport.copyToList(propertyCollections.get(effectiveType))
+                    : CollectionSupport.emptyList();
         }
         log.warn("Object of type {} did not have a canonical name", from.getClass().getName());
         
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
     
     /**
@@ -273,20 +274,20 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
         
         AttributeTranscoder<?> transcoder = rule.get(PROP_TRANSCODER, AttributeTranscoder.class);
         if (transcoder != null) {
-            return Collections.singletonList(transcoder);
+            return CollectionSupport.singletonList(transcoder);
         }
         
         final String beanNames = rule.get(PROP_TRANSCODER, String.class);
         if (beanNames == null) {
             log.error("{} property is missing or of incorrect type", PROP_TRANSCODER);
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
 
         final List<AttributeTranscoder<?>> transcoders = new ArrayList<>();
         
         final ApplicationContext appContext = getApplicationContext();
         if (appContext != null) {
-            for (final String id : StringSupport.stringToList(beanNames, " ")) {
+            for (@Nonnull final String id : StringSupport.stringToList(beanNames, " ")) {
                 try {
                     transcoder = appContext.getBean(id, AttributeTranscoder.class);
                     transcoder.initialize();
diff --git a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/TranscodingRuleLoader.java b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/TranscodingRuleLoader.java
index cabcec534..3c59c79e4 100644
--- a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/TranscodingRuleLoader.java
+++ b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/TranscodingRuleLoader.java
@@ -36,6 +36,7 @@ import org.springframework.core.io.FileSystemResource;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.PredicateSupport;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -131,7 +132,8 @@ public class TranscodingRuleLoader {
                 .map(m -> {
                     return new TranscodingRule(m);
                     })
-                .collect(Collectors.toList());
+                .collect(CollectionSupport.nonnullCollector(Collectors.toList()))
+                .get();
     }
 
     /**
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java
index 127f7ff1c..59c7a3053 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.attribute.resolver;
 import java.time.Duration;
 import java.time.Instant;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
 
@@ -36,6 +35,7 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContex
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
@@ -69,7 +69,7 @@ public abstract class AbstractDataConnector extends AbstractResolverPlugin<Map<S
     /** Constructor. */
     public AbstractDataConnector() {
         noRetryDelay = Duration.ZERO; 
-        exportAttributes = Collections.emptySet();
+        exportAttributes = CollectionSupport.emptySet();
     }
     
     /**
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
index 3d6c69539..4899e13d1 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.resolver;
 
-import java.util.Collections;
 import java.util.Objects;
 import java.util.Set;
 import java.util.function.Predicate;
@@ -39,6 +38,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -70,8 +70,8 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
 
     /** Constructor. */
     public AbstractResolverPlugin() {
-        attributeDependencies = Collections.emptySet();
-        dataConnectorDependencies = Collections.emptySet(); 
+        attributeDependencies = CollectionSupport.emptySet();
+        dataConnectorDependencies = CollectionSupport.emptySet(); 
     }
 
     /** {@inheritDoc} */
@@ -136,7 +136,7 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
         checkSetterPreconditions();
         Constraint.isNotNull(dependencies, "Attribute Dependencies cannot be null");
 
-        attributeDependencies = Set.copyOf(dependencies);
+        attributeDependencies = CollectionSupport.copyToSet(dependencies);
     }
     
     /**
@@ -149,7 +149,7 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
         checkSetterPreconditions();
         Constraint.isNotNull(dependencies, "DataConnector Dependencies cannot be null");
 
-        dataConnectorDependencies = Set.copyOf(dependencies);
+        dataConnectorDependencies = CollectionSupport.copyToSet(dependencies);
     }
 
 
@@ -227,8 +227,8 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
     /** {@inheritDoc} */
     @Override protected void doDestroy() {
         activationCondition = Predicates.alwaysFalse();
-        attributeDependencies = Collections.emptySet();
-        dataConnectorDependencies = Collections.emptySet();
+        attributeDependencies = CollectionSupport.emptySet();
+        dataConnectorDependencies = CollectionSupport.emptySet();
         super.doDestroy();
     }
 
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java
index b0da33305..e3e031128 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java
@@ -19,17 +19,16 @@ package net.shibboleth.idp.attribute.resolver;
 
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
+import java.util.Objects;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
 
-import java.util.Objects;
-
 import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.StringSupport;
 
@@ -56,7 +55,7 @@ public final class ResolverDataConnectorDependency  {
         dependencyPluginId = Constraint.isNotEmpty(
                 StringSupport.trimOrNull(pluginId), "Plugin ID cannot be null or empty");
         allAttributes = false;
-        attributeNames = Collections.emptySet();
+        attributeNames = CollectionSupport.emptySet();
     }
     
     /**
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolutionContext.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolutionContext.java
index d4bffa3ec..a2d65972c 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolutionContext.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolutionContext.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.attribute.resolver.context;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -87,7 +86,7 @@ public final class AttributeResolutionContext extends BaseContext {
         
         allowCachedResults = true;
         requestedAttributeNames = new HashSet<>();
-        resolvedAttributes = Collections.emptyMap();
+        resolvedAttributes = CollectionSupport.emptyMap();
     }
     
     /**
@@ -291,7 +290,8 @@ public final class AttributeResolutionContext extends BaseContext {
         requestedAttributeNames = Constraint.isNotNull(names, "Requested IdPAttribute collection cannot be null")
                 .stream()
                 .filter(n -> n != null)
-                .collect(Collectors.toCollection(HashSet::new));
+                .collect(CollectionSupport.nonnullCollector(Collectors.toCollection(HashSet::new)))
+                .get();
         
         return this;
     }
@@ -318,8 +318,9 @@ public final class AttributeResolutionContext extends BaseContext {
         Constraint.isNotNull(attributes, "Null attribute set cannot be inserted into a context");
         resolvedAttributes = attributes.
                 stream().
-                collect(Collectors.toUnmodifiableMap(IdPAttribute::getId, a -> a,
-                        CollectionSupport.warningMergeFunction("AttrtibuteResolutionContext", true)));
+                collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableMap(IdPAttribute::getId, a -> a,
+                        CollectionSupport.warningMergeFunction("AttrtibuteResolutionContext", true)))).
+                get();
         return this;
     }
 
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/AbstractMappingStrategy.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/AbstractMappingStrategy.java
index 967145e09..ac086d695 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/AbstractMappingStrategy.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/AbstractMappingStrategy.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.resolver.dc;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -26,6 +25,7 @@ import javax.annotation.Nonnull;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 
 /**
@@ -47,7 +47,7 @@ public abstract class AbstractMappingStrategy<T> implements MappingStrategy<T> {
 
     /** Constructor. */
     public AbstractMappingStrategy() {
-        resultRenamingMap = Collections.emptyMap();
+        resultRenamingMap = CollectionSupport.emptyMap();
     }
     
     /**
@@ -56,7 +56,7 @@ public abstract class AbstractMappingStrategy<T> implements MappingStrategy<T> {
      * @return a map of result field names to alternate field names
      */
     @Nonnull @NonnullElements @Unmodifiable @NotLive public Map<String,String> getResultRenamingMap() {
-        return Map.copyOf(resultRenamingMap);
+        return CollectionSupport.copyToMap(resultRenamingMap);
     }
     
     /**
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/StringResultMappingStrategy.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/StringResultMappingStrategy.java
index 443ee9ea1..44b553eee 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/StringResultMappingStrategy.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/StringResultMappingStrategy.java
@@ -21,7 +21,6 @@ import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -38,6 +37,7 @@ import net.shibboleth.idp.attribute.resolver.MultipleResultAnErrorResolutionExce
 import net.shibboleth.idp.attribute.resolver.NoResultAnErrorResolutionException;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.dc.AbstractMappingStrategy;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
@@ -95,7 +95,7 @@ public class StringResultMappingStrategy extends AbstractMappingStrategy<ResultS
 
                     if (attribute.getValues().isEmpty()) {
                         attribute.setValues(
-                            Collections.singletonList(StringAttributeValue.valueOf(results.getString(i))));
+                                CollectionSupport.singletonList(StringAttributeValue.valueOf(results.getString(i))));
                     } else {
                         final List<IdPAttributeValue> values = new ArrayList<>(attribute.getValues());
                         values.add(StringAttributeValue.valueOf(results.getString(i)));
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 2165c16a5..f04da659c 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
@@ -41,6 +41,7 @@ import net.shibboleth.idp.attribute.resolver.PluginDependencySupport;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -157,16 +158,17 @@ public class DateTimeAttributeDefinition extends AbstractAttributeDefinition {
                 getDataConnectorDependencies(), 
                 getId());
 
-        final List<IdPAttributeValue> converted = values.stream()
+        final List<? extends IdPAttributeValue> converted = values.stream()
                 .map(v -> convert(v))
                 .filter(Predicates.notNull())
-                .collect(Collectors.toUnmodifiableList());
+                .collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList()))
+                .get();
         
         if (!ignoreConversionErrors && converted.size() != values.size()) {
             throw new ResolutionException("Unable to convert all inputs to date/time values.");
         }
 
-        result.setValues(converted);
+        result.setValues((List<IdPAttributeValue>) converted);
         return result;
     }
     
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrincipalNameAttributeDefinition.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrincipalNameAttributeDefinition.java
index 9fae33fec..c8f83894a 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrincipalNameAttributeDefinition.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrincipalNameAttributeDefinition.java
@@ -17,8 +17,6 @@
 
 package net.shibboleth.idp.attribute.resolver.ad.impl;
 
-import java.util.Collections;
-
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -28,6 +26,7 @@ import net.shibboleth.idp.attribute.resolver.AbstractAttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -45,7 +44,7 @@ public class PrincipalNameAttributeDefinition extends AbstractAttributeDefinitio
         }
 
         final IdPAttribute attribute = new IdPAttribute(getId());
-        attribute.setValues(Collections.singletonList(new StringAttributeValue(principalName)));
+        attribute.setValues(CollectionSupport.singletonList(new StringAttributeValue(principalName)));
         return attribute;
     }
     
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
index 811f7908d..87049b8d4 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
@@ -42,6 +42,7 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContex
 import net.shibboleth.idp.attribute.resolver.scripted.ResolverScriptContextExtender;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -91,7 +92,7 @@ public class ScriptedAttributeDefinition extends AbstractAttributeDefinition {
 
     /** Constructor. */
     public ScriptedAttributeDefinition() {
-        contextExtenders = Collections.emptyList();
+        contextExtenders = CollectionSupport.emptyList();
     }
     
     /**
@@ -143,9 +144,9 @@ public class ScriptedAttributeDefinition extends AbstractAttributeDefinition {
             @Nullable @NonnullElements final Collection<ResolverScriptContextExtender> extenders) {
         checkSetterPreconditions();
         if (extenders != null) {
-            contextExtenders = List.copyOf(extenders);
+            contextExtenders = CollectionSupport.copyToList(extenders);
         } else {
-            contextExtenders = Collections.emptyList();
+            contextExtenders = CollectionSupport.emptyList();
         }
     }
     
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java
index c3375c14a..a81ff0736 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.attribute.resolver.ad.mapped.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -43,6 +42,7 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -65,7 +65,7 @@ public class MappedAttributeDefinition extends AbstractAttributeDefinition {
     @Nonnull private final Logger log = LoggerFactory.getLogger(MappedAttributeDefinition.class);
 
     /** Value maps. */
-    @Nonnull @NonnullElements private Set<ValueMap> valueMaps = Collections.emptySet();
+    @Nonnull @NonnullElements private Set<ValueMap> valueMaps = CollectionSupport.emptySet();
 
     /** Whether the definition passes thru unmatched values. */
     private boolean passThru;
@@ -90,7 +90,7 @@ public class MappedAttributeDefinition extends AbstractAttributeDefinition {
     public void setValueMaps(@Nullable @NonnullElements final Collection<ValueMap> mappings) {
         checkSetterPreconditions();
 
-        valueMaps = mappings != null ? Set.copyOf(mappings) : Collections.emptySet();
+        valueMaps = mappings != null ? CollectionSupport.copyToSet(mappings) : CollectionSupport.emptySet();
     }
 
     /**
@@ -207,7 +207,8 @@ public class MappedAttributeDefinition extends AbstractAttributeDefinition {
             if (null != defaultValue) {
                 log.debug("Attribute Definition {}: Default value of {} added as the value for this attribute",
                         getId(), defaultValue);
-                resultAttribute.setValues(Collections.singletonList(defaultValue));
+                assert defaultValue != null;
+                resultAttribute.setValues(CollectionSupport.singletonList(defaultValue));
             }
         } else {
 
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
index 3dc006e9a..fbcf3019c 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
@@ -35,6 +35,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
@@ -56,7 +57,7 @@ public class ValueMap implements Function<String, Set<StringAttributeValue>> {
 
     /** Constructor. */
     public ValueMap() {
-        sourceValues = Collections.emptySet();
+        sourceValues = CollectionSupport.emptySet();
     }
 
     /**
@@ -85,7 +86,7 @@ public class ValueMap implements Function<String, Set<StringAttributeValue>> {
      */
     public void setSourceValues(@Nullable @NonnullElements final Collection<SourceValue> newValues) {
 
-        sourceValues = newValues != null ? Set.copyOf(newValues) : Collections.emptySet();
+        sourceValues = newValues != null ? CollectionSupport.copyToSet(newValues) : CollectionSupport.emptySet();
     }
 
     /**
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 eb6747d4d..1af7ba1a5 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
@@ -45,6 +45,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullElements;
 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.collection.CollectionSupport;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.logic.Constraint;
@@ -72,7 +73,7 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
     
     /** Constructor. */
     public AbstractHTTPSearchBuilder() {
-        headerList = Collections.emptyList();
+        headerList = CollectionSupport.emptyList();
     }
     
     /**
@@ -102,7 +103,8 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
                 map(e-> new Pair<>(
                         Constraint.isNotNull(StringSupport.trimOrNull(e.getKey()), "header name  must be non null"),
                         Constraint.isNotNull(StringSupport.trimOrNull(e.getValue()), "header value must be non null"))).
-                collect(Collectors.toUnmodifiableList());
+                collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).
+                get();
     }
     
     /**
@@ -164,10 +166,10 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
                     @Nullable final HttpClientSecurityParameters securityParameters,
                     @Nonnull final HTTPResponseMappingStrategy mappingStrategy) throws IOException {
                 
-                final HttpClientContext clientContext = HttpClientContext.create();
+                @Nonnull HttpClientContext clientContext = HttpClientContext.create();
                 HttpClientSecuritySupport.marshalSecurityParameters(clientContext, securityParameters, true);
                 HttpClientSecuritySupport.addDefaultTLSTrustEngineCriteria(clientContext, request);
-                final Map<String,IdPAttribute> results = client.execute(request, mappingStrategy, clientContext);
+                @Nonnull final Map<String,IdPAttribute> results = client.execute(request, mappingStrategy, clientContext);
                 HttpClientSecuritySupport.checkTLSCredentialEvaluated(clientContext, request.getURI().getScheme());
                 return results;
             }
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
index 4a2dc02f2..b35c1e9d0 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
@@ -21,7 +21,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -45,6 +44,7 @@ import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.dc.http.HTTPResponseMappingStrategy;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -85,8 +85,8 @@ public final class ScriptedResponseMappingStrategy extends AbstractScriptEvaluat
     private ScriptedResponseMappingStrategy(@Nonnull final EvaluableScript theScript) {
         super(theScript);
         
-        acceptStatuses = Collections.singleton(HttpStatus.SC_OK);
-        acceptTypes = Collections.emptySet();
+        acceptStatuses = CollectionSupport.singleton(HttpStatus.SC_OK);
+        acceptTypes = CollectionSupport.emptySet();
     }
     
     /**
@@ -95,7 +95,7 @@ public final class ScriptedResponseMappingStrategy extends AbstractScriptEvaluat
      * @param statuses successful codes
      */
     public void setAcceptStatuses(@Nonnull @NonnullElements final Collection<Integer> statuses) {
-        acceptStatuses = Set.copyOf(Constraint.isNotNull(statuses, "Statuses cannot be null"));
+        acceptStatuses = CollectionSupport.copyToSet(Constraint.isNotNull(statuses, "Statuses cannot be null"));
     }
 
     /**
@@ -104,7 +104,7 @@ public final class ScriptedResponseMappingStrategy extends AbstractScriptEvaluat
      * @param types types to allow
      */
     public void setAcceptTypes(@Nonnull @NonnullElements final Collection<String> types) {
-        acceptTypes = Set.copyOf(StringSupport.normalizeStringCollection(
+        acceptTypes = CollectionSupport.copyToSet(StringSupport.normalizeStringCollection(
                 Constraint.isNotNull(types, "Types cannot be null")));
     }
     
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
index 8cb0cb6df..e8c708237 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.resolver.dc.impl;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -40,6 +39,7 @@ import net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder;
 import net.shibboleth.idp.attribute.resolver.dc.MappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.Validator;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -188,7 +188,7 @@ public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2
                     log.trace("{} Resolved attributes {}", getLogPrefix(), resolvedAttributes);
                     assert resultsCache != null;
                     resultsCache.put(cacheKey, resolvedAttributes != null ? resolvedAttributes
-                            : Collections.<String,IdPAttribute>emptyMap());
+                            : CollectionSupport.<String,IdPAttribute>emptyMap());
                 }
             } else {
                 log.trace("No cache key returned, will not check for cached results");
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
index 650bfb153..ed8c468a2 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
@@ -43,6 +43,7 @@ import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -297,7 +298,7 @@ public class PairwiseIdDataConnector extends AbstractDataConnector {
             return null;
         }
         final IdPAttribute attribute = new IdPAttribute(getGeneratedAttributeId());
-        attribute.setValues(Collections.singletonList(StringAttributeValue.valueOf(value)));
+        attribute.setValues(CollectionSupport.singletonList(StringAttributeValue.valueOf(value)));
         return Collections.singletonMap(getGeneratedAttributeId(), attribute);
     }
 
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
index 839a52411..63cc735be 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.attribute.resolver.dc.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -45,6 +44,7 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContex
 import net.shibboleth.idp.attribute.resolver.scripted.ResolverScriptContextExtender;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -76,7 +76,7 @@ public class ScriptedDataConnector extends AbstractDataConnector {
 
     /** Constructor. */
     public ScriptedDataConnector() {
-        contextExtenders = Collections.emptyList();
+        contextExtenders = CollectionSupport.emptyList();
     }
 
     /**
@@ -128,9 +128,9 @@ public class ScriptedDataConnector extends AbstractDataConnector {
             @Nullable @NonnullElements final Collection<ResolverScriptContextExtender> extenders) {
         checkSetterPreconditions();
         if (extenders != null) {
-            contextExtenders = List.copyOf(extenders);
+            contextExtenders = CollectionSupport.copyToList(extenders);
         } else {
-            contextExtenders = Collections.emptyList();
+            contextExtenders = CollectionSupport.emptyList();
         }
     }
 
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
index d8944f0aa..80ccb8056 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
@@ -56,6 +56,7 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContex
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazyList;
 import net.shibboleth.shared.collection.LazyMap;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
@@ -628,7 +629,8 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
         preRequestedAttributes = attributeDefinitions.entrySet().stream().
                 filter(e -> e.getValue().isPreRequested()).
                 map(Entry::getKey).
-                collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
+                collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).
+                get();
 
         final HashSet<String> dependencyVerifiedPlugins = new HashSet<>();
         for (final DataConnector plugin : dataConnectors.values()) {
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StoredIdDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StoredIdDataConnectorParserTest.java
index ca0764cfa..ba82de55c 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StoredIdDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StoredIdDataConnectorParserTest.java
@@ -35,6 +35,7 @@ import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependen
 import net.shibboleth.idp.attribute.resolver.dc.impl.PairwiseIdDataConnector;
 import net.shibboleth.idp.attribute.resolver.spring.dc.rdbms.impl.RDBMSDataConnectorParserTest;
 import net.shibboleth.idp.attribute.resolver.spring.testing.BaseAttributeDefinitionParserTest;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.spring.resource.PreferFileSystemResourceLoader;
 import net.shibboleth.shared.spring.util.ApplicationContextBuilder;
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParserTest.java
index a0241d602..9d3fbd95f 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParserTest.java
@@ -28,7 +28,6 @@ import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
 import java.util.stream.Collectors;
 
@@ -54,6 +53,7 @@ import net.shibboleth.idp.attribute.resolver.dc.rdbms.ExecutableStatement;
 import net.shibboleth.idp.attribute.resolver.dc.rdbms.StringResultMappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.rdbms.impl.DataSourceValidator;
 import net.shibboleth.idp.attribute.resolver.dc.rdbms.impl.RDBMSDataConnector;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.spring.resource.PreferFileSystemResourceLoader;
 import net.shibboleth.shared.spring.util.ApplicationContextBuilder;
 import net.shibboleth.shared.testing.DatabaseTestingSupport;
@@ -158,7 +158,7 @@ public class RDBMSDataConnectorParserTest {
         builder.setServiceConfigurations(defs.stream().map(s -> loader.getResource(s)).collect(Collectors.toList()));
 
         if (properties != null) {
-            builder.setPropertySources(Collections.singletonList(new ResourcePropertySource(properties)));
+            builder.setPropertySources(CollectionSupport.singletonList(new ResourcePropertySource(properties)));
         }
         
         final GenericApplicationContext context = builder.build();
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockDataConnector.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockDataConnector.java
index 93e16c8d2..85ff85bdd 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockDataConnector.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockDataConnector.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.resolver.testing;
 
-import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
 
@@ -34,6 +33,7 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** A data connector that just returns a static collection of attributes. */
@@ -81,8 +81,8 @@ public class MockDataConnector extends AbstractDataConnector {
             @Nullable @NonnullElements Set<ResolverAttributeDefinitionDependency> attrDepends, 
             @Nullable @NonnullElements Set<ResolverDataConnectorDependency> dcDepends
             ) throws ComponentInitializationException {
-        setAttributeDependencies(attrDepends == null? Collections.emptySet() : attrDepends);
-        setDataConnectorDependencies(dcDepends == null? Collections.emptySet() : dcDepends);
+        setAttributeDependencies(attrDepends == null? CollectionSupport.emptySet() : attrDepends);
+        setDataConnectorDependencies(dcDepends == null? CollectionSupport.emptySet() : dcDepends);
         setId(id);
         values = connectorValues;
         initialize();
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 f859eb5b6..4b55a742e 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
@@ -19,7 +19,6 @@ package net.shibboleth.idp.attribute.resolver.testing;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -46,6 +45,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NullableElements;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** Basic data sources for testing the attribute generators. */
@@ -255,7 +255,7 @@ public final class TestSources {
         if (null == attributeId) {
             retVal.setAllAttributes(true);
         } else {
-            retVal.setAttributeNames(Collections.singleton(attributeId));
+            retVal.setAttributeNames(CollectionSupport.singleton(attributeId));
         }
         return retVal; 
     }
diff --git a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML1AttributeTranscoder.java b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML1AttributeTranscoder.java
index 042b2cce3..827d09c7b 100644
--- a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML1AttributeTranscoder.java
+++ b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML1AttributeTranscoder.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.saml.attribute.transcoding;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.function.Function;
 
@@ -43,6 +42,7 @@ import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.xml.SAMLConstants;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
@@ -84,7 +84,7 @@ public abstract class AbstractSAML1AttributeTranscoder<EncodedType extends IdPAt
         try {
             // SAML 1 naming should be based on only what needs to be available from the properties alone.
             return new NamingFunction().apply(buildAttribute(null, null, AttributeDesignator.class, rule,
-                    Collections.emptyList()));
+                    CollectionSupport.emptyList()));
         } catch (final AttributeEncodingException e) {
             return null;
         }
@@ -164,7 +164,7 @@ public abstract class AbstractSAML1AttributeTranscoder<EncodedType extends IdPAt
     /** {@inheritDoc} */
     @Override
     @Nonnull protected Iterable<XMLObject> getValues(@Nonnull final AttributeDesignator input) {
-        return input instanceof Attribute ? ((Attribute) input).getAttributeValues() : Collections.emptyList();
+        return input instanceof Attribute ? ((Attribute) input).getAttributeValues() : CollectionSupport.emptyList();
     }
 
     /** A function to produce a "canonical" name for a SAML 1 {@link AttributeDesignator} for transcoding rules. */
diff --git a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML2AttributeTranscoder.java b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML2AttributeTranscoder.java
index 42d3067d3..5bd885757 100644
--- a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML2AttributeTranscoder.java
+++ b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML2AttributeTranscoder.java
@@ -17,22 +17,12 @@
 
 package net.shibboleth.idp.saml.attribute.transcoding;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import net.shibboleth.idp.attribute.AttributeDecodingException;
-import net.shibboleth.idp.attribute.AttributeEncodingException;
-import net.shibboleth.idp.attribute.IdPAttribute;
-import net.shibboleth.idp.attribute.IdPAttributeValue;
-import net.shibboleth.idp.attribute.IdPRequestedAttribute;
-import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
-import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
-
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -42,6 +32,16 @@ import org.opensaml.saml.saml2.metadata.RequestedAttribute;
 
 import com.google.common.base.Strings;
 
+import net.shibboleth.idp.attribute.AttributeDecodingException;
+import net.shibboleth.idp.attribute.AttributeEncodingException;
+import net.shibboleth.idp.attribute.IdPAttribute;
+import net.shibboleth.idp.attribute.IdPAttributeValue;
+import net.shibboleth.idp.attribute.IdPRequestedAttribute;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Base class for transcoders that operate on a SAML 2 {@link Attribute} or {@link RequestedAttribute}.
  * 
@@ -77,7 +77,7 @@ public abstract class AbstractSAML2AttributeTranscoder<EncodedType extends IdPAt
         try {
             // SAML 2 naming should be based on only what needs to be available from the properties alone.
             return new NamingFunction().apply(buildAttribute(null, null, Attribute.class, rule,
-                    Collections.emptyList()));
+                    CollectionSupport.emptyList()));
         } catch (final AttributeEncodingException e) {
             return null;
         }
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/AttributeMappingNodeProcessor.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/AttributeMappingNodeProcessor.java
index d6dc69f24..6e922fbe4 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/AttributeMappingNodeProcessor.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/AttributeMappingNodeProcessor.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.saml.attribute.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -54,6 +53,7 @@ import net.shibboleth.idp.saml.attribute.transcoding.SAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.impl.SAML2StringAttributeTranscoder;
 import net.shibboleth.shared.annotation.constraint.Live;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.ConstraintViolationException;
@@ -182,7 +182,7 @@ public class AttributeMappingNodeProcessor implements MetadataNodeProcessor {
                 for (final Attribute attr : ea.getAttributes()) {
                     try {
                         assert attr != null;
-                        Collection<TranscodingRule> rulesets = registry.getTranscodingRules(attr);
+                        @Nonnull Collection<TranscodingRule> rulesets = registry.getTranscodingRules(attr);
                         if (rulesets.isEmpty() && Attribute.URI_REFERENCE.equals(attr.getNameFormat())) {
                             log.trace("Applying default decoding rule for URI-named attribute {}", attr.getName());
                             final Map<String,Object> rulemap = new HashMap<>();
@@ -190,7 +190,7 @@ public class AttributeMappingNodeProcessor implements MetadataNodeProcessor {
                             rulemap.put(AttributeTranscoderRegistry.PROP_TRANSCODER, defaultTranscoder);
                             rulemap.put(SAML2AttributeTranscoder.PROP_NAME, attr.getName());
                             final TranscodingRule defaultRule = new TranscodingRule(rulemap);
-                            rulesets = Collections.singletonList(defaultRule);
+                            rulesets = CollectionSupport.singletonList(defaultRule);
                         }
 
                         assert rulesets != null;

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


More information about the commits mailing list