[java-oidc-common] branch main updated: Null cleanup in metadata layer.

Scott Cantor cantor.2 at osu.edu
Tue Nov 7 21:11:32 UTC 2023


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

scantor pushed a commit to branch main
in repository java-oidc-common.

View the commit online:
http://git.shibboleth.net/view/?p=java-oidc-common.git;a=commit;h=258007b7a3ee93aa10aa76c091f61269930b514d

The following commit(s) were added to refs/heads/main by this push:
     new 258007b  Null cleanup in metadata layer.
258007b is described below

commit 258007b7a3ee93aa10aa76c091f61269930b514d
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Tue Nov 7 16:11:29 2023 -0500

    Null cleanup in metadata layer.
---
 .../oidc/metadata/DynamicBackingStore.java         |  6 ++--
 .../ProviderMetadataProviderContainer.java         | 28 ++++++++-------
 .../RelyingPartyClientInformationProvider.java     | 16 +++++----
 .../metadata/cache/impl/AbstractMetadataCache.java | 15 ++++----
 .../cache/impl/BaseMetadataCacheBuilderSpec.java   | 12 +++----
 .../metadata/cache/impl/BatchMetadataCache.java    | 12 +++----
 .../cache/impl/BatchMetadataCacheBuilderSpec.java  |  5 ++-
 .../cache/impl/DefaultFileLoadingStrategy.java     | 25 ++++++++------
 .../cache/impl/DefaultJSONMapParsingStrategy.java  |  2 +-
 ...oviderMetadataCriteriaToIdentifierStrategy.java |  7 ++--
 ...OIDCProviderMetadataExpirationTimeStrategy.java | 11 +++---
 ...oviderMetadataIdentifierExtractionStrategy.java |  6 ++--
 ...DefaultOIDCProviderMetadataParsingStrategy.java | 17 ++++-----
 ...efaultSourceMetadataExpirationTimeStrategy.java |  6 ++--
 .../metadata/cache/impl/DynamicMetadataCache.java  |  7 ++--
 .../impl/DynamicMetadataCacheBuilderSpec.java      |  4 +--
 .../cache/impl/FetchThroughMetadataCache.java      | 20 ++++++-----
 .../impl/FetchThroughMetadataCacheBuilderSpec.java |  1 -
 .../metadata/cache/impl/MetadataCacheBuilder.java  |  2 +-
 .../impl/MetadataPolicyLookupStrategyFactory.java  |  5 ++-
 .../impl/AbstractDynamicHTTPFetchingStrategy.java  | 18 +++++-----
 .../impl/AbstractFileOIDCEntityResolver.java       | 21 ++++--------
 .../metadata/impl/AbstractOIDCEntityResolver.java  | 18 +++++-----
 .../impl/AbstractOIDCMetadataResolver.java         | 21 ++++++------
 .../impl/AbstractReloadingOIDCEntityResolver.java  | 15 ++++----
 .../impl/ChainingClientInformationResolver.java    | 31 +++++++----------
 .../impl/ChainingProviderMetadataResolver.java     | 31 +++++++----------
 .../impl/ClientInformationNodeProcessor.java       | 32 +++++++++--------
 .../metadata/impl/DefaultDynamicBackingStore.java  | 30 ++++++++--------
 .../impl/FilesystemClientInformationResolver.java  | 19 +++++-----
 .../impl/FilesystemProviderMetadataResolver.java   | 40 ++++------------------
 .../HTTPProviderConfigurationFetchingStrategy.java | 15 +++++---
 .../impl/PropertiesClientSecretValueResolver.java  | 25 ++++++++------
 .../impl/ReloadingProviderMetadataProvider.java    | 19 +++++-----
 ...adingRelyingPartyClientInformationProvider.java | 14 ++++----
 .../ResolverServiceClientSecretValueResolver.java  | 33 ++++++++++--------
 .../StorageServiceClientInformationManager.java    |  4 +--
 .../StorageServiceClientInformationResolver.java   | 21 ++++--------
 .../ext/impl/provider/ClientSecretProvider.java    |  7 ++--
 .../provider/ClientSecretReferenceProvider.java    |  9 +++--
 .../ext/impl/provider/InlineJwksProvider.java      |  4 +--
 .../policy/impl/DefaultMetadataPolicyEnforcer.java |  5 +--
 .../impl/DefaultMetadataPolicyResponseHandler.java |  2 +-
 .../impl/DefaultMetadataPolicyValidator.java       |  2 +-
 .../MetadataPolicyViaLocationFetchingStrategy.java | 12 +++----
 .../filter/impl/ClientInformationParser.java       | 21 +++++++-----
 .../ClientInformationResolverServiceStrategy.java  | 11 +++---
 .../ProviderMetadataResolverServiceStrategy.java   |  7 ++--
 48 files changed, 340 insertions(+), 354 deletions(-)

diff --git a/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/DynamicBackingStore.java b/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/DynamicBackingStore.java
index 8d5db97..a35f504 100644
--- a/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/DynamicBackingStore.java
+++ b/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/DynamicBackingStore.java
@@ -45,7 +45,7 @@ public interface DynamicBackingStore<I, T> extends BackingStore<I, T> {
      * 
      * @return a new or previously cache metadata management data.
      */
-    @Nonnull public MetadataManagementData<I> computeManagementDataIfAbsent(@Nonnull final I identifier,
+    @Nonnull MetadataManagementData<I> computeManagementDataIfAbsent(@Nonnull final I identifier,
             @Nonnull final Function<I, MetadataManagementData<I>> mappingFunction);
     
     /**
@@ -56,7 +56,7 @@ public interface DynamicBackingStore<I, T> extends BackingStore<I, T> {
      * 
      * @return the corresponding management data, or {@literal null} if not found.
      */
-    @Nullable public MetadataManagementData<I> getManagementData(@Nonnull final I identifier);
+    @Nullable MetadataManagementData<I> getManagementData(@Nonnull final I identifier);
     
     /**
      * Remove the management data for the specified entityID.
@@ -73,4 +73,4 @@ public interface DynamicBackingStore<I, T> extends BackingStore<I, T> {
     @Nonnull @NonnullElements @Unmodifiable @NotLive
     Set<I> getManagementDataIdentifiers();
 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/ProviderMetadataProviderContainer.java b/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/ProviderMetadataProviderContainer.java
index d798afc..168147a 100644
--- a/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/ProviderMetadataProviderContainer.java
+++ b/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/ProviderMetadataProviderContainer.java
@@ -17,13 +17,13 @@ package net.shibboleth.oidc.metadata;
 import javax.annotation.Nonnull;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Objects;
 
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.spring.service.AbstractServiceableComponent;
 
 /**
@@ -37,15 +37,13 @@ public class ProviderMetadataProviderContainer extends AbstractServiceableCompon
     private static int sortKeyValue;
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(ProviderMetadataProviderContainer.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(ProviderMetadataProviderContainer.class);
 
     /** The embedded resolver. */
-    @NonnullAfterInit
-    private ProviderMetadataResolver resolver;
+    @NonnullAfterInit private ProviderMetadataResolver resolver;
 
     /** The key by which we sort the provider. */
-    @NonnullAfterInit
-    private Integer sortKey;
+    @NonnullAfterInit private Integer sortKey;
 
     /**
      * Set the sort key.
@@ -72,15 +70,19 @@ public class ProviderMetadataProviderContainer extends AbstractServiceableCompon
      * 
      * @return the parameter we got as a constructor
      */
-    @Nonnull
-    public ProviderMetadataResolver getEmbeddedResolver() {
+    @Nonnull public ProviderMetadataResolver getEmbeddedResolver() {
         return resolver;
     }
 
 
+    /** {@inheritDoc} */
     @Override
     protected void doInitialize() throws ComponentInitializationException {
-        setId(resolver.getId());
+        final String embeddedId = resolver.getId();
+        if (embeddedId == null) {
+            throw new ComponentInitializationException("Embedded resolver ID cannot be null");
+        }
+        setId(embeddedId);
         super.doInitialize();
         if (null == resolver) {
             throw new ComponentInitializationException("ProviderMetadataResolver cannot be null");
@@ -96,13 +98,13 @@ public class ProviderMetadataProviderContainer extends AbstractServiceableCompon
         }
     }
     
-
+    /** {@inheritDoc} */
     @Override
-    @Nonnull
-    public ProviderMetadataResolver getComponent() {
+    @Nonnull public ProviderMetadataResolver getComponent() {
         return getEmbeddedResolver();
     }
 
+    /** {@inheritDoc} */
     @Override
     public int compareTo(final ProviderMetadataProviderContainer other) {
         ifNotInitializedThrowUninitializedComponentException();
@@ -133,8 +135,10 @@ public class ProviderMetadataProviderContainer extends AbstractServiceableCompon
         return Objects.equal(otherRp.sortKey, sortKey) && Objects.equal(getId(), otherRp.getId());
     }
 
+    /** {@inheritDoc} */
     @Override
     public int hashCode() {
         return Objects.hashCode(sortKey, getId());
     }
+
 }
\ No newline at end of file
diff --git a/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/RelyingPartyClientInformationProvider.java b/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/RelyingPartyClientInformationProvider.java
index bb8b4bf..56afb32 100644
--- a/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/RelyingPartyClientInformationProvider.java
+++ b/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/RelyingPartyClientInformationProvider.java
@@ -20,7 +20,6 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Objects;
 import com.nimbusds.openid.connect.sdk.rp.OIDCClientInformation;
@@ -28,6 +27,7 @@ import com.nimbusds.openid.connect.sdk.rp.OIDCClientInformation;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
 import net.shibboleth.shared.spring.service.AbstractServiceableComponent;
@@ -44,15 +44,13 @@ public class RelyingPartyClientInformationProvider extends AbstractServiceableCo
     private static int sortKeyValue;
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(RelyingPartyClientInformationProvider.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(RelyingPartyClientInformationProvider.class);
 
     /** The embedded resolver. */
-    @NonnullAfterInit
-    private ClientInformationResolver resolver;
+    @NonnullAfterInit private ClientInformationResolver resolver;
 
     /** The key by which we sort the provider. */
-    @NonnullAfterInit
-    private Integer sortKey;
+    @NonnullAfterInit private Integer sortKey;
 
     /** Constructor. */
     public RelyingPartyClientInformationProvider() {
@@ -107,7 +105,11 @@ public class RelyingPartyClientInformationProvider extends AbstractServiceableCo
     /** {@inheritDoc} */
     @Override
     protected void doInitialize() throws ComponentInitializationException {
-        setId(resolver.getId());
+        final String embeddedId = resolver.getId();
+        if (embeddedId == null) {
+            throw new ComponentInitializationException("Embedded resolver ID cannot be null");
+        }
+        setId(embeddedId);
         super.doInitialize();
         if (null == resolver) {
             throw new ComponentInitializationException("ClientInformationResolver cannot be null");
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/AbstractMetadataCache.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/AbstractMetadataCache.java
index f353f4b..79e07e9 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/AbstractMetadataCache.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/AbstractMetadataCache.java
@@ -16,7 +16,6 @@ package net.shibboleth.oidc.metadata.cache.impl;
 
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -31,7 +30,6 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 
@@ -45,10 +43,12 @@ 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.Positive;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.ConstraintViolationException;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.TimerSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
@@ -68,7 +68,7 @@ public abstract class AbstractMetadataCache<IdentifierType, MetadataType>
                 extends AbstractIdentifiableInitializableComponent implements MetadataCache<MetadataType> {
     
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(AbstractMetadataCache.class);    
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractMetadataCache.class);    
     
     /** Cached log prefix. */
     @Nullable private String logPrefix;
@@ -143,13 +143,13 @@ public abstract class AbstractMetadataCache<IdentifierType, MetadataType>
         if (logPrefix == null) {
             logPrefix = "Metadata Cache " + (getId() != null ? getId() : "(unknown)") + ":";
         }
+        assert logPrefix != null;
         return logPrefix;
     }
 
     @Override
     protected void doInitialize() throws ComponentInitializationException {
-        super.doInitialize();    
-       
+        super.doInitialize();
         
         if (identifierExtractionStrategy == null) {
             throw new ComponentInitializationException("Identifier extraction strategy can not be null");
@@ -376,7 +376,7 @@ public abstract class AbstractMetadataCache<IdentifierType, MetadataType>
         if (metadata != null) {
             return new ArrayList<>(metadata);
         }
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
     
     /**
@@ -528,5 +528,4 @@ public abstract class AbstractMetadataCache<IdentifierType, MetadataType>
     }
     
     
-}
-
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BaseMetadataCacheBuilderSpec.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BaseMetadataCacheBuilderSpec.java
index 894236c..67207de 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BaseMetadataCacheBuilderSpec.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BaseMetadataCacheBuilderSpec.java
@@ -24,13 +24,12 @@ import java.util.function.Predicate;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Predicates;
-
 import net.shibboleth.oidc.metadata.filter.MetadataFilterContext;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.Positive;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.ConstraintViolationException;
+import net.shibboleth.shared.logic.PredicateSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
 /**
@@ -42,12 +41,11 @@ import net.shibboleth.shared.resolver.CriteriaSet;
 public abstract class BaseMetadataCacheBuilderSpec<IdentifierType, MetadataType> {
         
     /** Factor used to compute when the next refresh interval will occur. Default value: 0.75 */
-    @Positive private Float refreshDelayFactor;   
+    @Positive @Nonnull private Float refreshDelayFactor;   
           
     /** Strategy used to extract an identifier from the given metadata.*/
     @Nullable private Function<MetadataType, IdentifierType> identifierExtractionStrategy;
     
-    
     /** Map criteria to identifiers to use as keys to the backing store.*/
     @Nullable private Function<CriteriaSet, IdentifierType> criteriaToIdentifierStrategy;
     
@@ -74,7 +72,7 @@ public abstract class BaseMetadataCacheBuilderSpec<IdentifierType, MetadataType>
         // create a default direct in/out filter
         metadataFilterStrategy = (metadata, context) -> metadata;  
         // create default TRUE is metadata valid predicate
-        metadataValidPredicate = Predicates.alwaysTrue();
+        metadataValidPredicate = PredicateSupport.alwaysTrue();
 
     }
     
@@ -216,7 +214,7 @@ public abstract class BaseMetadataCacheBuilderSpec<IdentifierType, MetadataType>
      * 
      * @param factor delay factor used to compute the next refresh time
      */
-    public void setRefreshDelayFactor(@Nonnull final Float factor) {
+    public void setRefreshDelayFactor(@Nonnull @Positive final Float factor) {
 
         if (factor <= 0 || factor >= 1) {
             throw new 
@@ -226,4 +224,4 @@ public abstract class BaseMetadataCacheBuilderSpec<IdentifierType, MetadataType>
         refreshDelayFactor = factor;
     }
 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCache.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCache.java
index f1be922..2b16f83 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCache.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCache.java
@@ -17,7 +17,6 @@ package net.shibboleth.oidc.metadata.cache.impl;
 import java.time.Duration;
 import java.time.Instant;
 import java.time.ZoneId;
-import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -31,7 +30,6 @@ import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.oidc.metadata.BatchBackingStore;
 import net.shibboleth.oidc.metadata.cache.CacheLoadingContext;
@@ -41,8 +39,10 @@ import net.shibboleth.oidc.metadata.cache.MetadataCacheException;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.Positive;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
 /**
@@ -79,7 +79,7 @@ public class BatchMetadataCache<IdentifierType, MetadataType>
                                 extends AbstractMetadataCache<IdentifierType, MetadataType> {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(BatchMetadataCache.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(BatchMetadataCache.class);
 
     /**
      * Refresh interval used when metadata does not contain any validUntil or cacheDuration information.
@@ -347,7 +347,7 @@ public class BatchMetadataCache<IdentifierType, MetadataType>
                 if (allMetadata.isEmpty()) {
                     log.debug("{} No metadata candidates for '{}' found, returning empty result", 
                             getLogPrefix(), identifier);
-                    return Collections.emptyList();
+                    return CollectionSupport.emptyList();
                 } else {
                     log.debug("{} There are {} metadata candidates for '{}' found in cache", 
                             getLogPrefix(), allMetadata.size(), identifier);
@@ -356,10 +356,10 @@ public class BatchMetadataCache<IdentifierType, MetadataType>
             } else if (!matchOnIdentifierRequired) { 
                 log.debug("{} No identifier found to lookup, identifier match is not required, returning all known "
                         + "metadata",getLogPrefix());
-                return Collections.unmodifiableList(getBackingStore().getOrderedValues());
+                return CollectionSupport.copyToList(getBackingStore().getOrderedValues());
             } else {            
                 log.debug("{} No identifier found to lookup, returning empty result", getLogPrefix());
-                return Collections.emptyList();
+                return CollectionSupport.emptyList();
             }
         } finally {
             readWriteLock.readLock().unlock();
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCacheBuilderSpec.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCacheBuilderSpec.java
index a935dd0..649cea8 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCacheBuilderSpec.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCacheBuilderSpec.java
@@ -24,11 +24,10 @@ import java.util.function.Predicate;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Predicates;
-
 import net.shibboleth.oidc.metadata.cache.LoadingStrategy;
 import net.shibboleth.shared.annotation.constraint.Positive;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.logic.PredicateSupport;
 
 /**
  * A specification for building a batch read-ahead metadata cache.
@@ -76,7 +75,7 @@ public class BatchMetadataCacheBuilderSpec<IdentifierType, MetadataType>
         maxRefreshDelay = Duration.ofHours(4);
         minRefreshDelay = Duration.ofMinutes(5);    
         matchOnIdentifierRequired = false;
-        sourceMetadataValidPredicate = Predicates.alwaysTrue();
+        sourceMetadataValidPredicate = PredicateSupport.alwaysTrue();
     }
     
     /**
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultFileLoadingStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultFileLoadingStrategy.java
index 83fa404..4771fac 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultFileLoadingStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultFileLoadingStrategy.java
@@ -25,7 +25,6 @@ import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.core.io.Resource;
 
 import net.shibboleth.oidc.metadata.cache.CacheLoadingContext;
@@ -33,6 +32,7 @@ import net.shibboleth.oidc.metadata.cache.CacheLoadingException;
 import net.shibboleth.oidc.metadata.cache.LoadingStrategy;
 import net.shibboleth.oidc.metadata.impl.ResolverHelper;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /** Default strategy for loading information from a file.*/
 @ThreadSafe
@@ -70,21 +70,24 @@ public class DefaultFileLoadingStrategy implements LoadingStrategy {
      * Get the time for the last update/modification of the metadata file.
      * @return The last update time.
      */
-    private Instant getMetadataUpdateTime() {
-        return Instant.ofEpochMilli(metadataFile.lastModified());
+    @Nullable private Instant getMetadataUpdateTime() {
+        return metadataFile != null ? Instant.ofEpochMilli(metadataFile.lastModified()) : null;
     }
 
-    @Override
+    /** {@inheritDoc} */
     @Nullable public byte[] load(@Nonnull final CacheLoadingContext context) throws CacheLoadingException {
-        if (metadataFile == null) {
+        
+        final File mfile = metadataFile;
+        if (mfile == null) {
             return null;
         }
+        
         try {
-            ResolverHelper.validateMetadataFile(metadataFile);
+            ResolverHelper.validateMetadataFile(mfile);
             final Instant metadataUpdateTime = getMetadataUpdateTime();
-            if (context.getLastRefresh() == null || context.getLastUpdate() == null || 
+            if (context.getLastRefresh() == null || context.getLastUpdate() == null || metadataUpdateTime == null ||
                     metadataUpdateTime.isAfter(context.getLastRefresh())) {
-                log.debug("Returning the contents of {} as byte array", metadataFile.toPath());
+                log.debug("Returning the contents of {} as byte array", mfile.toPath());
                 try (FileInputStream fileInput = new FileInputStream(metadataFile)){
                     return ResolverHelper.inputstreamToByteArray(fileInput);
                 } catch (final Exception e) {
@@ -93,15 +96,15 @@ public class DefaultFileLoadingStrategy implements LoadingStrategy {
             }
             return null;
         } catch (final Exception e) {
-            final String errMsg = "Unable to read metadata file " + metadataFile.getAbsolutePath();
+            final String errMsg = "Unable to read metadata file " + mfile.getAbsolutePath();
             log.error(errMsg, e.getMessage());
             throw new CacheLoadingException(errMsg, e);
         }
     }
 
-    @Override
+    /** {@inheritDoc} */
     @Nonnull public String getSourceIdentifier() {
        return metadataFileFriendlyName;
     }
 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultJSONMapParsingStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultJSONMapParsingStrategy.java
index 546b22c..db6e0a4 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultJSONMapParsingStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultJSONMapParsingStrategy.java
@@ -24,13 +24,13 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.type.MapType;
 
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /** 
  * Deserializes a UTF-8 JSON string into a Map.
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataCriteriaToIdentifierStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataCriteriaToIdentifierStrategy.java
index 2c0464f..1b8439d 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataCriteriaToIdentifierStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataCriteriaToIdentifierStrategy.java
@@ -26,9 +26,8 @@ import net.shibboleth.shared.resolver.CriteriaSet;
 /** Strategy for extracting the {@link IssuerIDCriterion} from a {@link CriteriaSet}. */
 public class DefaultOIDCProviderMetadataCriteriaToIdentifierStrategy implements Function<CriteriaSet, Issuer> {
 
-    @Override
-    @Nullable
-    public Issuer apply(@Nullable final CriteriaSet criteria) {
+    /** {@inheritDoc} */
+    @Nullable public Issuer apply(@Nullable final CriteriaSet criteria) {
         if (criteria == null) {
             return null;
         }
@@ -39,4 +38,4 @@ public class DefaultOIDCProviderMetadataCriteriaToIdentifierStrategy implements
         return null;
     }
 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataExpirationTimeStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataExpirationTimeStrategy.java
index cb1c3bb..fb17261 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataExpirationTimeStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataExpirationTimeStrategy.java
@@ -17,7 +17,7 @@ package net.shibboleth.oidc.metadata.cache.impl;
 import java.time.Instant;
 import java.util.function.Function;
 
-import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata;
 
@@ -31,9 +31,12 @@ public class DefaultOIDCProviderMetadataExpirationTimeStrategy
                         implements Function<ExpirationTimeContext<OIDCProviderMetadata>, Instant> {
     
 
-    @Override
-    public Instant apply(@Nonnull final ExpirationTimeContext<OIDCProviderMetadata> context) {
+    /** {@inheritDoc} */
+    @Nullable public Instant apply(@Nullable final ExpirationTimeContext<OIDCProviderMetadata> context) {
+        if (context == null) {
+            return null;
+        }
         return context.getNow().plus(context.getMaxCacheDuration());
     }
 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataIdentifierExtractionStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataIdentifierExtractionStrategy.java
index 5ef1935..2a69646 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataIdentifierExtractionStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataIdentifierExtractionStrategy.java
@@ -24,12 +24,12 @@ import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata;
 /** Strategy for finding the Issuer of the given OIDCProviderMetadata.*/
 public class DefaultOIDCProviderMetadataIdentifierExtractionStrategy implements Function<OIDCProviderMetadata, Issuer>{
 
-    @Override
-    public Issuer apply(@Nullable final OIDCProviderMetadata metadata) {
+    /** {@inheritDoc} */
+    @Nullable public Issuer apply(@Nullable final OIDCProviderMetadata metadata) {
         if (metadata == null) {
             return null;
         }
         return metadata.getIssuer();
     }
 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataParsingStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataParsingStrategy.java
index c1a490e..6244846 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataParsingStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultOIDCProviderMetadataParsingStrategy.java
@@ -15,7 +15,6 @@
 package net.shibboleth.oidc.metadata.cache.impl;
 
 import java.nio.charset.StandardCharsets;
-import java.util.Collections;
 import java.util.List;
 import java.util.function.Function;
 
@@ -23,22 +22,24 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.oauth2.sdk.ParseException;
 import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
+
 /** Parse a raw byte array into a *single* OIDCProviderMetadata object.*/
 public class DefaultOIDCProviderMetadataParsingStrategy implements Function<byte[], List<OIDCProviderMetadata>> {
     
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(DefaultOIDCProviderMetadataParsingStrategy.class);
 
-    @Override
-    @Nonnull public List<OIDCProviderMetadata> apply(@Nullable final byte[] rawMetdata) {
+    /** {@inheritDoc} */
+    @Nullable public List<OIDCProviderMetadata> apply(@Nullable final byte[] rawMetdata) {
         if (rawMetdata == null) {
             log.warn("Raw metadata is null, unable to parse OIDC Provider Metadata");
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
         try {
             final OIDCProviderMetadata metadata =
@@ -46,11 +47,11 @@ public class DefaultOIDCProviderMetadataParsingStrategy implements Function<byte
             if (metadata != null) {
                 return List.of(metadata);
             }
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         } catch (final ParseException e) {
             log.error("Error parsing bytes to metadata", e);
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
     }
 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultSourceMetadataExpirationTimeStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultSourceMetadataExpirationTimeStrategy.java
index 02a3a72..b289cdf 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultSourceMetadataExpirationTimeStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultSourceMetadataExpirationTimeStrategy.java
@@ -42,9 +42,9 @@ public class DefaultSourceMetadataExpirationTimeStrategy
         expiryDuration = Constraint.isNotNull(duration, "Expiry duration can not be null");
     }
 
-    @Override
-    public Instant apply(@Nullable final byte[] sourceMetadata) {
+    /** {@inheritDoc} */
+    @Nullable public Instant apply(@Nullable final byte[] sourceMetadata) {
         return Instant.now().plus(expiryDuration);
     }
 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DynamicMetadataCache.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DynamicMetadataCache.java
index 5dcb77b..88d7612 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DynamicMetadataCache.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DynamicMetadataCache.java
@@ -32,7 +32,6 @@ import javax.annotation.Nullable;
 
 import org.opensaml.core.metrics.MetricsSupport;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.codahale.metrics.Gauge;
 import com.codahale.metrics.MetricRegistry;
@@ -49,6 +48,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
@@ -85,7 +85,7 @@ public class DynamicMetadataCache<IdentifierType, MetadataType>
     public static final String METRIC_RATIOGAUGE_FETCH_TO_GET = "ratioGauge.fetchToGet";
     
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(DynamicMetadataCache.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(DynamicMetadataCache.class);
     
     /** The interval at which the cleanup task should run. */
     @NonnullAfterInit private Duration cleanupTaskInterval;
@@ -708,5 +708,4 @@ public class DynamicMetadataCache<IdentifierType, MetadataType>
         
     }
 
-
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DynamicMetadataCacheBuilderSpec.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DynamicMetadataCacheBuilderSpec.java
index 000c796..4fcbce7 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DynamicMetadataCacheBuilderSpec.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DynamicMetadataCacheBuilderSpec.java
@@ -47,7 +47,7 @@ public class DynamicMetadataCacheBuilderSpec <IdentifierType, MetadataType>
     @Nonnull private Duration minCacheDuration;
     
     /** The maximum idle time for which the cache will keep data for before it is removed. */
-    @Nullable private Duration maxIdleEntityData;
+    @Nonnull private Duration maxIdleEntityData;
     
     /** The interval at which the cleanup task should run. */
     @Nonnull private Duration cleanupTaskInterval;
@@ -61,10 +61,8 @@ public class DynamicMetadataCacheBuilderSpec <IdentifierType, MetadataType>
     /** Strategy used to compute an expiration time. */
     @Nullable private Function<ExpirationTimeContext<MetadataType>, Instant> metadataExpirationTimeStrategy;
     
-    
     /** Constructor. */
     protected DynamicMetadataCacheBuilderSpec() {
-        super();
         maxCacheDuration = Duration.ofHours(8);
         minCacheDuration = Duration.ofMinutes(10); 
         maxIdleEntityData = Duration.ofHours(8);
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/FetchThroughMetadataCache.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/FetchThroughMetadataCache.java
index c6e0f2e..7133c59 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/FetchThroughMetadataCache.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/FetchThroughMetadataCache.java
@@ -15,7 +15,6 @@
 
 package net.shibboleth.oidc.metadata.cache.impl;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.function.Function;
@@ -24,7 +23,6 @@ import javax.annotation.Nonnull;
 import javax.annotation.concurrent.ThreadSafe;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.oidc.metadata.cache.MetadataCache;
 import net.shibboleth.oidc.metadata.cache.MetadataCacheException;
@@ -32,8 +30,10 @@ 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.NotLive;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
 /**
@@ -51,7 +51,7 @@ public class FetchThroughMetadataCache <IdentifierType, MetadataType>
                             extends AbstractMetadataCache<IdentifierType, MetadataType> {    
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(FetchThroughMetadataCache.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(FetchThroughMetadataCache.class);
     
     /** The function to use to fetch/load metadata entries.*/
     @NonnullAfterInit private Function<CriteriaSet, MetadataType> fetchStrategy;
@@ -62,6 +62,7 @@ public class FetchThroughMetadataCache <IdentifierType, MetadataType>
         super(null);
     }
     
+    /** {@inheritDoc} */
     @Override
     protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();  
@@ -84,6 +85,7 @@ public class FetchThroughMetadataCache <IdentifierType, MetadataType>
         fetchStrategy = Constraint.isNotNull(strategy, "Dynamic Metadata fetch strategy can not be null");
     }
 
+    /** {@inheritDoc} */
     @Override
     @Nonnull @NonnullElements @NotLive public List<MetadataType> get(
             @Nonnull @NotEmpty final CriteriaSet criteria) throws MetadataCacheException {
@@ -105,7 +107,7 @@ public class FetchThroughMetadataCache <IdentifierType, MetadataType>
                 
                 if (filteredMetadata == null) {
                     log.warn("{} Filtered metadata is null, no further processing performed", getLogPrefix());
-                    return Collections.emptyList();
+                    return CollectionSupport.emptyList();
                 }
                 
                 final IdentifierType extractedIdentifier = getIdentifierExtractionStrategy().apply(filteredMetadata);
@@ -113,27 +115,27 @@ public class FetchThroughMetadataCache <IdentifierType, MetadataType>
                 if (extractedIdentifier == null) {
                     log.warn("{} Metadata identifier could not be extracted, no further processing performed", 
                             getLogPrefix());
-                    return Collections.emptyList();
+                    return CollectionSupport.emptyList();
                 }
                 
                 // equality method of the identifier is required to be implemented correctly.
                 if (!Objects.equals(identifier, extractedIdentifier)) {
                     log.warn("{} New metadata's identifer '{}' does not match expected identifier '{}', "
                             + "will not process", getLogPrefix(), extractedIdentifier, identifier); 
-                    return Collections.emptyList();
+                    return CollectionSupport.emptyList();
                 }                   
                 
                 log.debug("{} Resolved metadata with identifier '{}'",getLogPrefix(), extractedIdentifier);
                 
-                return List.of(filteredMetadata);
+                return CollectionSupport.singletonList(filteredMetadata);
             } else {
                 log.trace("{} Metadata for '{}' could not be resolved or is not valid",getLogPrefix(), identifier);
             }
         } else {
             log.debug("Identifier not resolvable from criteria, can not fetch metadata");            
         }
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
  
     }
     
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/FetchThroughMetadataCacheBuilderSpec.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/FetchThroughMetadataCacheBuilderSpec.java
index 3434bd0..2689d7e 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/FetchThroughMetadataCacheBuilderSpec.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/FetchThroughMetadataCacheBuilderSpec.java
@@ -36,7 +36,6 @@ public class FetchThroughMetadataCacheBuilderSpec <IdentifierType, MetadataType>
     
     /** The function to use to fetch metadata if either none exists, or the existing is stale.*/
     @Nullable private Function<CriteriaSet, MetadataType> fetchStrategy;
- 
     
     /** Constructor. */
     protected FetchThroughMetadataCacheBuilderSpec() {
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/MetadataCacheBuilder.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/MetadataCacheBuilder.java
index 7917207..007544b 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/MetadataCacheBuilder.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/MetadataCacheBuilder.java
@@ -17,12 +17,12 @@ package net.shibboleth.oidc.metadata.cache.impl;
 import javax.annotation.Nonnull;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.oidc.metadata.cache.MetadataCache;
 import net.shibboleth.oidc.metadata.impl.DefaultBatchBackingStore;
 import net.shibboleth.oidc.metadata.impl.DefaultDynamicBackingStore;
 import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * A builder that creates, initializes, and safely publishes the correct {@link MetadataCache metadata cache} 
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/MetadataPolicyLookupStrategyFactory.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/MetadataPolicyLookupStrategyFactory.java
index 8ba42d6..49a7909 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/MetadataPolicyLookupStrategyFactory.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/MetadataPolicyLookupStrategyFactory.java
@@ -61,7 +61,7 @@ public class MetadataPolicyLookupStrategyFactory {
      * @throws ComponentInitializationException on error.
      * @throws IOException on error.
      */
-    public Function<ProfileRequestContext,Map<String,MetadataPolicy>> buildFileLoadingMetadataPolicyResolver(
+    @Nonnull public Function<ProfileRequestContext,Map<String,MetadataPolicy>> buildFileLoadingMetadataPolicyResolver(
             @ParameterName(name="resource") @Nullable final String resource,
             @ParameterName(name="cacheSpec") @Nonnull 
             final BatchMetadataCacheBuilderSpec<String, Map<String, MetadataPolicy>> cacheSpec,
@@ -97,5 +97,4 @@ public class MetadataPolicyLookupStrategyFactory {
         
     }
     
-
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractDynamicHTTPFetchingStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractDynamicHTTPFetchingStrategy.java
index b5062e3..d869f09 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractDynamicHTTPFetchingStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractDynamicHTTPFetchingStrategy.java
@@ -34,7 +34,6 @@ import org.apache.hc.core5.http.io.HttpClientResponseHandler;
 import org.opensaml.security.httpclient.HttpClientSecurityParameters;
 import org.opensaml.security.httpclient.HttpClientSecuritySupport;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.slf4j.MDC;
 
 import com.google.common.base.Strings;
@@ -47,6 +46,7 @@ import net.shibboleth.shared.collection.LazySet;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
@@ -174,8 +174,7 @@ public abstract class AbstractDynamicHTTPFetchingStrategy<MetadataType>
      * 
      * @return the supported content types
      */
-    @NonnullAfterInit @NotLive @Unmodifiable
-    public List<String> getSupportedContentTypes() {
+    @NonnullAfterInit @NotLive @Unmodifiable public List<String> getSupportedContentTypes() {
         return supportedContentTypes;
     }
     
@@ -199,8 +198,8 @@ public abstract class AbstractDynamicHTTPFetchingStrategy<MetadataType>
         }
     }
 
-    @Override
-    @Nullable public MetadataType apply(@Nonnull final CriteriaSet criteria) {
+    /** {@inheritDoc} */
+    @Nullable public MetadataType apply(@Nullable final CriteriaSet criteria) {
         log.debug("{} fetching metadata based on criteria: {}", getId(), criteria);
         final ClassicHttpRequest request = buildHttpRequest(criteria);
         if (request == null) {
@@ -230,8 +229,9 @@ public abstract class AbstractDynamicHTTPFetchingStrategy<MetadataType>
     * 
     * @return a new instance of {@link HttpClientContext}
     */
-   private HttpClientContext buildHttpClientContext(@Nonnull final ClassicHttpRequest request) {
+   @Nonnull private HttpClientContext buildHttpClientContext(@Nonnull final ClassicHttpRequest request) {
        final HttpClientContext context = HttpClientContext.create();
+       assert context != null;
        
        HttpClientSecuritySupport.marshalSecurityParameters(context, httpClientSecurityParameters, true);
        HttpClientSecuritySupport.addDefaultTLSTrustEngineCriteria(context, request);
@@ -245,7 +245,7 @@ public abstract class AbstractDynamicHTTPFetchingStrategy<MetadataType>
     * @param criteria the input criteria set
     * @return the newly constructed request, or null if it can not be built from the supplied criteria
     */
-   @Nullable private ClassicHttpRequest buildHttpRequest(@Nonnull final CriteriaSet criteria) {
+   @Nullable private ClassicHttpRequest buildHttpRequest(@Nullable final CriteriaSet criteria) {
        final String url = buildRequestURL(criteria);
        log.debug("Built request URL of: {}", url);
        
@@ -269,6 +269,6 @@ public abstract class AbstractDynamicHTTPFetchingStrategy<MetadataType>
      * @param criteria the input criteria set
      * @return the request URL, or null if it can not be built based on the supplied criteria
      */
-    @Nullable protected abstract String buildRequestURL(@Nonnull final CriteriaSet criteria);
+    @Nullable protected abstract String buildRequestURL(@Nullable final CriteriaSet criteria);
 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractFileOIDCEntityResolver.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractFileOIDCEntityResolver.java
index 33cfc58..9c52851 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractFileOIDCEntityResolver.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractFileOIDCEntityResolver.java
@@ -24,12 +24,12 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.core.io.Resource;
 
 import com.nimbusds.oauth2.sdk.id.Identifier;
 
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.ResolverException;
 
 
@@ -56,7 +56,7 @@ public abstract class AbstractFileOIDCEntityResolver<Key extends Identifier, Val
      * @throws IOException If the metedata cannot be loaded.
      */
     protected AbstractFileOIDCEntityResolver(@Nonnull final Resource metadata) throws IOException {
-        setMetadataFile(metadata.getFile());
+        metadataFile = Constraint.isNotNull(metadata.getFile(), "Metadata file cannot be null");
     }
 
     /**
@@ -67,10 +67,10 @@ public abstract class AbstractFileOIDCEntityResolver<Key extends Identifier, Val
      * 
      * @throws IOException If the metedata cannot be loaded.
      */
-    protected AbstractFileOIDCEntityResolver(@Nullable final Timer backgroundTaskTimer, @Nonnull final Resource metadata)
-            throws IOException {
+    protected AbstractFileOIDCEntityResolver(@Nullable final Timer backgroundTaskTimer,
+            @Nonnull final Resource metadata) throws IOException {
         super(backgroundTaskTimer);
-        setMetadataFile(metadata.getFile());
+        metadataFile = Constraint.isNotNull(metadata.getFile(), "Metadata file cannot be null");
     }
 
     /**
@@ -84,14 +84,6 @@ public abstract class AbstractFileOIDCEntityResolver<Key extends Identifier, Val
 
         metadataFile = Constraint.isNotNull(file, "Metadata file cannot be null");
     }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void doDestroy() {
-        metadataFile = null;
-          
-        super.doDestroy();
-    }
     
     /** {@inheritDoc} */
     @Override
@@ -126,4 +118,5 @@ public abstract class AbstractFileOIDCEntityResolver<Key extends Identifier, Val
             throw new ResolverException(errMsg, e);
         }
     }
-}
+
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractOIDCEntityResolver.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractOIDCEntityResolver.java
index 165f695..6707cfa 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractOIDCEntityResolver.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractOIDCEntityResolver.java
@@ -15,7 +15,6 @@
 package net.shibboleth.oidc.metadata.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -23,16 +22,17 @@ import java.util.concurrent.ConcurrentHashMap;
 import javax.annotation.Nonnull;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
 import com.nimbusds.oauth2.sdk.id.Identifier;
 
 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.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.Resolver;
 import net.shibboleth.shared.resolver.ResolverException;
 
@@ -46,7 +46,7 @@ public abstract class AbstractOIDCEntityResolver<Key extends Identifier, Value>
     extends AbstractIdentifiableInitializableComponent {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(AbstractOIDCEntityResolver.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractOIDCEntityResolver.class);
     
     /** Backing store for runtime JSON data. */
     private JsonBackingStore jsonBackingStore;
@@ -76,6 +76,7 @@ public abstract class AbstractOIDCEntityResolver<Key extends Identifier, Value>
         if (logPrefix == null) {
             logPrefix = String.format("Metadata Resolver %s %s:", getClass().getSimpleName(), getId());
         }
+        assert logPrefix != null;
         return logPrefix;
     }
 
@@ -142,7 +143,7 @@ public abstract class AbstractOIDCEntityResolver<Key extends Identifier, Value>
 
         if (identifier == null || Strings.isNullOrEmpty(identifier.getValue())) {
             log.debug("Identifier was null or empty, skipping search for it");
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
 
         final List<Value> allInformation = lookupIndexedIdentifier(identifier);
@@ -167,7 +168,7 @@ public abstract class AbstractOIDCEntityResolver<Key extends Identifier, Value>
         if (allInformation != null) {
             return new ArrayList<>(allInformation);
         } else {
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
     }
 
@@ -258,10 +259,10 @@ public abstract class AbstractOIDCEntityResolver<Key extends Identifier, Value>
     protected class JsonBackingStore {
 
         /** Index of identifiers to their entity information. */
-        private final Map<Key, List<Value>> indexedEntities;
+        @Nonnull private final Map<Key, List<Value>> indexedEntities;
 
         /** Ordered list of entity information. */
-        private final List<Value> orderedEntitiess;
+        @Nonnull private final List<Value> orderedEntitiess;
 
         /** Constructor. */
         protected JsonBackingStore() {
@@ -288,4 +289,5 @@ public abstract class AbstractOIDCEntityResolver<Key extends Identifier, Value>
         }
 
     }
-}
+
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractOIDCMetadataResolver.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractOIDCMetadataResolver.java
index 472ea34..56fe456 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractOIDCMetadataResolver.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractOIDCMetadataResolver.java
@@ -25,7 +25,6 @@ import javax.annotation.Nullable;
 
 import org.opensaml.core.criterion.SatisfyAnyCriterion;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.Iterables;
 
@@ -39,6 +38,7 @@ import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponen
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.DestructableComponent;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.CriterionPredicateRegistry;
 import net.shibboleth.shared.resolver.ResolverException;
@@ -54,12 +54,11 @@ import net.shibboleth.shared.resolver.ResolverSupport;
 public abstract class AbstractOIDCMetadataResolver<MetadataIdentifier, MetadataType> 
         extends AbstractIdentifiableInitializableComponent implements OIDCMetadataResolver<MetadataType> {
     
-    
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(AbstractOIDCMetadataResolver.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractOIDCMetadataResolver.class);
     
     /** Logging prefix. */
-    private String logPrefix;
+    @Nullable private String logPrefix;
     
     /** The metadata cache.*/
     @Nonnull private final MetadataCache<MetadataType> cache;   
@@ -98,11 +97,13 @@ public abstract class AbstractOIDCMetadataResolver<MetadataIdentifier, MetadataT
         if (logPrefix == null) {
             logPrefix = String.format("Metadata Resolver %s %s:", getClass().getSimpleName(), getId());
         }
+        assert logPrefix != null;
         return logPrefix;
     }
     
     /** {@inheritDoc} */
-    @Override @Nullable public MetadataType resolveSingle(final CriteriaSet criteria) throws ResolverException {
+    @Override
+    @Nullable public MetadataType resolveSingle(@Nullable final CriteriaSet criteria) throws ResolverException {
         ifNotInitializedThrowUninitializedComponentException();
         ifDestroyedThrowDestroyedComponentException();
 
@@ -118,7 +119,7 @@ public abstract class AbstractOIDCMetadataResolver<MetadataIdentifier, MetadataT
     
     /** {@inheritDoc} */
     @Override
-    @Nonnull public Iterable<MetadataType> resolve(@Nonnull final CriteriaSet criteria) throws ResolverException {
+    @Nonnull public Iterable<MetadataType> resolve(@Nullable final CriteriaSet criteria) throws ResolverException {
         ifNotInitializedThrowUninitializedComponentException();
         ifDestroyedThrowDestroyedComponentException();
                
@@ -145,7 +146,7 @@ public abstract class AbstractOIDCMetadataResolver<MetadataIdentifier, MetadataT
      * @throws ResolverException if there is a fatal error during resolution
      */
     protected Iterable<MetadataType> predicateFilterCandidates(@Nonnull final Iterable<MetadataType> candidates,
-            @Nonnull final CriteriaSet criteria, final boolean onEmptyPredicatesReturnEmpty)
+            @Nullable final CriteriaSet criteria, final boolean onEmptyPredicatesReturnEmpty)
                     throws ResolverException {
         
         if (!candidates.iterator().hasNext()) {
@@ -291,7 +292,5 @@ public abstract class AbstractOIDCMetadataResolver<MetadataIdentifier, MetadataT
      * @throws ComponentInitializationException if initialization fails.
      */
     protected abstract void initMetadataResolver() throws ComponentInitializationException;
-    
-
-    
-}
+       
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractReloadingOIDCEntityResolver.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractReloadingOIDCEntityResolver.java
index 1747868..f372571 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractReloadingOIDCEntityResolver.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/AbstractReloadingOIDCEntityResolver.java
@@ -26,7 +26,6 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.oauth2.sdk.ParseException;
 import com.nimbusds.oauth2.sdk.id.Identifier;
@@ -34,6 +33,7 @@ import com.nimbusds.oauth2.sdk.id.Identifier;
 import net.shibboleth.shared.annotation.constraint.Positive;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.ResolverException;
 
 /**
@@ -47,16 +47,16 @@ public abstract class AbstractReloadingOIDCEntityResolver<Key extends Identifier
     extends AbstractOIDCEntityResolver<Key, Value> {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(AbstractReloadingOIDCEntityResolver.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractReloadingOIDCEntityResolver.class);
     
     /** Timer used to schedule background metadata update tasks. */
-    private final Timer taskTimer;
+    @Nonnull private final Timer taskTimer;
     
     /** Whether we created our own task timer during object construction. */
     private final boolean createdOwnTaskTimer;
         
     /** Current task to refresh metadata. */
-    private RefreshMetadataTask refreshMetadataTask;
+    @Nullable private RefreshMetadataTask refreshMetadataTask;
     
     /**
      * Refresh interval used when metadata does not contain any validUntil or cacheDuration information. Default value:
@@ -172,6 +172,7 @@ public abstract class AbstractReloadingOIDCEntityResolver<Key extends Identifier
                 final List<Value> resolvedInformation = parse(mdBytes);
                 final JsonBackingStore newBackingStore = new JsonBackingStore();
                 for (final Value information : resolvedInformation) {
+                    assert information != null;
                     final Key id = getKey(information);
                     log.info("Parsed entity information for {}", id);
                     newBackingStore.getIndexedInformation().put(id, Arrays.asList(information));
@@ -221,7 +222,7 @@ public abstract class AbstractReloadingOIDCEntityResolver<Key extends Identifier
      * 
      * @throws ParseException if parse fails
      */
-    protected abstract List<Value> parse(final byte[] bytes) throws ParseException;
+    @Nonnull protected abstract List<Value> parse(@Nonnull final byte[] bytes) throws ParseException;
     
     /**
      * Gets the identifier for the given entity.
@@ -229,14 +230,14 @@ public abstract class AbstractReloadingOIDCEntityResolver<Key extends Identifier
      * @param value The entity whose identifier will be returned.
      * @return The identifier for the given entity.
      */
-    protected abstract Key getKey(final Value value);
+    @Nonnull protected abstract Key getKey(@Nonnull final Value value);
     
     /**
      * Gets an identifier which may be used to distinguish this metadata in logging statements.
      * 
      * @return identifier which may be used to distinguish this metadata in logging statements
      */
-    protected abstract String getMetadataIdentifier();
+    @Nonnull protected abstract String getMetadataIdentifier();
 
     /**
      * Fetches metadata from a source.
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ChainingClientInformationResolver.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ChainingClientInformationResolver.java
index 6ddb5ce..4f88a27 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ChainingClientInformationResolver.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ChainingClientInformationResolver.java
@@ -16,7 +16,6 @@ package net.shibboleth.oidc.metadata.impl;
 
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
@@ -24,7 +23,6 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.openid.connect.sdk.rp.OIDCClientInformation;
 
@@ -33,8 +31,10 @@ import net.shibboleth.oidc.metadata.RefreshableClientInformationResolver;
 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.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
 
@@ -55,7 +55,7 @@ public class ChainingClientInformationResolver extends AbstractIdentifiableIniti
 
     /** Constructor. */
     public ChainingClientInformationResolver() {
-        resolvers = Collections.emptyList();
+        resolvers = CollectionSupport.emptyList();
     }
     
     /**
@@ -80,9 +80,9 @@ public class ChainingClientInformationResolver extends AbstractIdentifiableIniti
         ifDestroyedThrowDestroyedComponentException();
 
         if (newResolvers == null || newResolvers.isEmpty()) {
-            resolvers = Collections.emptyList();
+            resolvers = CollectionSupport.emptyList();
         } else {
-            resolvers = List.copyOf(newResolvers);
+            resolvers = CollectionSupport.copyToList(newResolvers);
         }
     }
 
@@ -121,7 +121,7 @@ public class ChainingClientInformationResolver extends AbstractIdentifiableIniti
             }
         }
 
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
 
     /** {@inheritDoc} */
@@ -168,24 +168,19 @@ public class ChainingClientInformationResolver extends AbstractIdentifiableIniti
     /** {@inheritDoc} */
     @Override protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
-        if (resolvers == null) {
-            log.warn("ChainingClientInformationResolver was not configured with any member " + 
-                    "ClientInformationResolvers");
-            resolvers = Collections.emptyList();
-        } else {
-            final List<String> resolverDetails = new ArrayList<>();
-            for (final ClientInformationResolver resolver : resolvers) {
-                resolverDetails.add(resolver.getId() + ": " + countClients(resolver) + " clients");
-            }
-            log.info("ChainingClientInformationResolver was configured with the following resolvers: {}",
-                    resolverDetails);
+        
+        final List<String> resolverDetails = new ArrayList<>();
+        for (final ClientInformationResolver resolver : resolvers) {
+            resolverDetails.add(resolver.getId() + ": " + countClients(resolver) + " clients");
         }
+        log.info("ChainingClientInformationResolver was configured with the following resolvers: {}",
+                resolverDetails);
     }
 
     /** {@inheritDoc} */
     @Override protected void doDestroy() {
         super.doDestroy();
-        resolvers = Collections.emptyList();
+        resolvers = CollectionSupport.emptyList();
     }
     
     /**
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ChainingProviderMetadataResolver.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ChainingProviderMetadataResolver.java
index 43c9642..19614e8 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ChainingProviderMetadataResolver.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ChainingProviderMetadataResolver.java
@@ -16,7 +16,6 @@ package net.shibboleth.oidc.metadata.impl;
 
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
@@ -24,7 +23,6 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata;
 
@@ -33,8 +31,10 @@ import net.shibboleth.oidc.metadata.RefreshableProviderMetadataResolver;
 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.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
 
@@ -55,7 +55,7 @@ public class ChainingProviderMetadataResolver extends AbstractIdentifiableInitia
     
     /** Constructor. */
     public ChainingProviderMetadataResolver() {
-        resolvers = Collections.emptyList();
+        resolvers = CollectionSupport.emptyList();
     }
     
     /**
@@ -80,9 +80,9 @@ public class ChainingProviderMetadataResolver extends AbstractIdentifiableInitia
         ifDestroyedThrowDestroyedComponentException();
 
         if (newResolvers == null || newResolvers.isEmpty()) {
-            resolvers = Collections.emptyList();
+            resolvers = CollectionSupport.emptyList();
         } else {
-            resolvers = List.copyOf(newResolvers);
+            resolvers = CollectionSupport.copyToList(newResolvers);
         }
     }
     
@@ -121,7 +121,7 @@ public class ChainingProviderMetadataResolver extends AbstractIdentifiableInitia
             }
         }
 
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
 
     /** {@inheritDoc} */
@@ -168,24 +168,19 @@ public class ChainingProviderMetadataResolver extends AbstractIdentifiableInitia
     /** {@inheritDoc} */
     @Override protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
-        if (resolvers == null) {
-            log.warn("ProviderMetadataResolver was not configured with any member " + 
-                    "ProviderMetadataResolvers");
-            resolvers = Collections.emptyList();
-        } else {
-            final List<String> resolverDetails = new ArrayList<>();
-            for (final ProviderMetadataResolver resolver : resolvers) {
-                resolverDetails.add(resolver.getId() + ": " + countClients(resolver) + " clients");
-            }
-            log.info("ChainingProviderMetadataResolver was configured with the following resolvers: {}",
-                    resolverDetails);
+        
+        final List<String> resolverDetails = new ArrayList<>();
+        for (final ProviderMetadataResolver resolver : resolvers) {
+            resolverDetails.add(resolver.getId() + ": " + countClients(resolver) + " clients");
         }
+        log.info("ChainingProviderMetadataResolver was configured with the following resolvers: {}",
+                resolverDetails);
     }
 
     /** {@inheritDoc} */
     @Override protected void doDestroy() {
         super.doDestroy();
-        resolvers = Collections.emptyList();
+        resolvers = CollectionSupport.emptyList();
     }
     
     /**
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ClientInformationNodeProcessor.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ClientInformationNodeProcessor.java
index 528eaaa..f381543 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ClientInformationNodeProcessor.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ClientInformationNodeProcessor.java
@@ -17,9 +17,7 @@ package net.shibboleth.oidc.metadata.impl;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -46,7 +44,6 @@ import org.opensaml.xmlsec.keyinfo.KeyInfoCredentialResolver;
 import org.opensaml.xmlsec.keyinfo.impl.BasicProviderKeyInfoCredentialResolver;
 import org.opensaml.xmlsec.keyinfo.impl.KeyInfoProvider;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.jose.EncryptionMethod;
 import com.nimbusds.jose.JWEAlgorithm;
@@ -75,7 +72,9 @@ import net.shibboleth.oidc.security.CredentialConversionUtil;
 import net.shibboleth.oidc.security.credential.JWKReferenceCredential;
 import net.shibboleth.oidc.security.credential.NimbusSecretCredential;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
@@ -88,21 +87,21 @@ import net.shibboleth.shared.resolver.ResolverException;
 public class ClientInformationNodeProcessor implements MetadataNodeProcessor {
 
     /** The ACS binding identifier matching to the redirect_uri. */
-    public static final String BINDING_ID_REDIRECT_URI = "https://tools.ietf.org/html/rfc6749#section-3.1.2";
+    @Nonnull public static final String BINDING_ID_REDIRECT_URI = "https://tools.ietf.org/html/rfc6749#section-3.1.2";
     
     /** The SLO binding identifier matching to the front-channel uri. */
-    public static final String BINDING_ID_FRONT_SLO_URI =
+    @Nonnull public static final String BINDING_ID_FRONT_SLO_URI =
             "https://openid.net/specs/openid-connect-frontchannel-1_0.html";
 
     /** The SLO binding identifier matching to the back-channel uri. */
-    public static final String BINDING_ID_BACK_SLO_URI =
+    @Nonnull public static final String BINDING_ID_BACK_SLO_URI =
             "https://openid.net/specs/openid-connect-backchannel-1_0.html";
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(ClientInformationNodeProcessor.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(ClientInformationNodeProcessor.class);
     
     /** The {@link KeyInfoCredentialResolver} to be used for the resolution. */
-    private final @Nonnull KeyInfoCredentialResolver keyInfoCredentialResolver;
+    @Nonnull private final KeyInfoCredentialResolver keyInfoCredentialResolver;
     
     /**
      * Constructor.
@@ -141,12 +140,13 @@ public class ClientInformationNodeProcessor implements MetadataNodeProcessor {
      * @param roleDescriptor The {@link SPSSODescriptor} to be used as a source.
      * @return The entityID value as {@link ClientID}.
      */
-    protected @Nullable ClientID parseClientID(final @Nonnull SPSSODescriptor roleDescriptor) {
+    protected @Nullable ClientID parseClientID(@Nonnull final SPSSODescriptor roleDescriptor) {
         if (!roleDescriptor.hasParent() || !(roleDescriptor.getParent() instanceof EntityDescriptor)) {
             log.warn("Unexpected structure, EntityDescriptor not as a parent for OAuthRPRoleDescriptor");
             return null;
         }
         final EntityDescriptor entityDescriptor = (EntityDescriptor) roleDescriptor.getParent();
+        assert entityDescriptor != null;
         return new ClientID(entityDescriptor.getEntityID());
     }
     
@@ -178,8 +178,8 @@ public class ClientInformationNodeProcessor implements MetadataNodeProcessor {
      * @param clientId The client ID.
      * @return The {@link OIDCClientMetadata} parsed from the given parameters.
      */
-    protected @Nonnull OIDCClientMetadata populateMetadata(final @Nonnull SPSSODescriptor roleDescriptor,
-            final @Nonnull Iterable<Credential> credentials, final @Nonnull String clientId) {
+    protected @Nonnull OIDCClientMetadata populateMetadata(@Nonnull final SPSSODescriptor roleDescriptor,
+            @Nonnull final Iterable<Credential> credentials, @Nonnull final String clientId) {
         final OIDCClientMetadata metadata = new OIDCClientMetadata();
         final OAuthRPExtensions extensions = getOAuthRPExtensions(roleDescriptor);
         if (extensions != null) {
@@ -286,7 +286,8 @@ public class ClientInformationNodeProcessor implements MetadataNodeProcessor {
         credentialResolver.setRoleDescriptorResolver(new SkeletonEchoingRoleDescriptorResolver() {
 
             /** {@inheritDoc} */
-            @Override public RoleDescriptor resolveSingle(final CriteriaSet criteria) throws ResolverException {
+            @Nullable public RoleDescriptor resolveSingle(@Nullable final CriteriaSet criteria)
+                    throws ResolverException {
                 return roleDescriptor;
             }
 
@@ -305,7 +306,7 @@ public class ClientInformationNodeProcessor implements MetadataNodeProcessor {
         } catch (final ResolverException e) {
             log.warn("Could not resolve credentials", e);
         }
-        return Collections.emptySet();
+        return CollectionSupport.emptySet();
     }
     
     /**
@@ -602,7 +603,7 @@ public class ClientInformationNodeProcessor implements MetadataNodeProcessor {
         if (metadataValue != null) {
             return StringSupport.stringToList(metadataValue, " \t\n\r");
         }
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
     
     /**
@@ -641,7 +642,8 @@ public class ClientInformationNodeProcessor implements MetadataNodeProcessor {
         @Override
         @Nonnull public Iterable<RoleDescriptor> resolve(@Nullable final CriteriaSet criteria)
                 throws ResolverException {
-            return Arrays.asList(resolveSingle(criteria));
+            final RoleDescriptor role = resolveSingle(criteria); 
+            return role != null ? CollectionSupport.singletonList(role) : CollectionSupport.emptyList();
         }
 
         /** {@inheritDoc} */
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/DefaultDynamicBackingStore.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/DefaultDynamicBackingStore.java
index 3a12b63..6d5e682 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/DefaultDynamicBackingStore.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/DefaultDynamicBackingStore.java
@@ -21,6 +21,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 
 import net.shibboleth.oidc.metadata.DynamicBackingStore;
@@ -28,6 +29,7 @@ import net.shibboleth.oidc.metadata.MetadataManagementData;
 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;
 
 /**
@@ -39,47 +41,43 @@ import net.shibboleth.shared.logic.Constraint;
 @ThreadSafe
 public class DefaultDynamicBackingStore<I,T> extends AbstractBackingStore<I,T> implements DynamicBackingStore<I, T>{
     
-    
     /** Map holding management data for each entityID. */
-    private final Map<I, MetadataManagementData<I>> mgmtDataMap;    
+    @Nonnull private final Map<I, MetadataManagementData<I>> mgmtDataMap;    
     
     /**
      * Constructor.
      */
     public DefaultDynamicBackingStore() {
-        super();        
         mgmtDataMap = new ConcurrentHashMap<>();
     }
     
-    @Override
-    public MetadataManagementData<I> computeManagementDataIfAbsent(@Nonnull final I identifier,
+    /** {@inheritDoc} */
+    @Nonnull public MetadataManagementData<I> computeManagementDataIfAbsent(@Nonnull final I identifier,
             @Nonnull final Function<I, MetadataManagementData<I>> mappingFunction) {
         Constraint.isNotNull(identifier, "identifier may not be null");
         
         return mgmtDataMap.computeIfAbsent(identifier, mappingFunction);  
     }
     
-    @Override
-    public MetadataManagementData<I> getManagementData(@Nonnull final I identifier) {
+    /** {@inheritDoc} */
+    @Nullable public MetadataManagementData<I> getManagementData(@Nonnull final I identifier) {
         Constraint.isNotNull(identifier, "identifier may not be null");
         return mgmtDataMap.get(identifier);
     }
 
     
-    @Override
-    //TODO is concurrent hashmap threadsafe for remove and get - do we need the synchronized
+    /** {@inheritDoc} */
     public synchronized void removeManagementData(@Nonnull final I identifier) {
-        Constraint.isNotNull(identifier, "Identifier may not be null");
+        //TODO is concurrent hashmap threadsafe for remove and get - do we need the synchronized
+     Constraint.isNotNull(identifier, "Identifier may not be null");
         mgmtDataMap.remove(identifier);
         
     }
-   
-    
-    @Override
+       
+    /** {@inheritDoc} */
     @Nonnull @NonnullElements @Unmodifiable @NotLive
     public synchronized Set<I> getManagementDataIdentifiers() {
-        return Set.copyOf(mgmtDataMap.keySet());        
+        return CollectionSupport.copyToSet(mgmtDataMap.keySet());        
     }
 
- 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/FilesystemClientInformationResolver.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/FilesystemClientInformationResolver.java
index 2508927..c2490a7 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/FilesystemClientInformationResolver.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/FilesystemClientInformationResolver.java
@@ -16,7 +16,6 @@ package net.shibboleth.oidc.metadata.impl;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Timer;
@@ -38,6 +37,7 @@ import net.minidev.json.JSONArray;
 import net.minidev.json.JSONObject;
 import net.shibboleth.oidc.metadata.RefreshableClientInformationResolver;
 import net.shibboleth.oidc.metadata.criterion.ClientIDCriterion;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
@@ -83,11 +83,12 @@ public class FilesystemClientInformationResolver extends AbstractFileOIDCEntityR
 
     /** {@inheritDoc} */
     @Override
-    public Iterable<OIDCClientInformation> resolve(final CriteriaSet criteria) throws ResolverException {
+    @Nonnull public Iterable<OIDCClientInformation> resolve(@Nullable final CriteriaSet criteria)
+            throws ResolverException {
         ifNotInitializedThrowUninitializedComponentException();
         ifDestroyedThrowDestroyedComponentException();
 
-        final ClientIDCriterion clientIdCriterion = criteria.get(ClientIDCriterion.class);
+        final ClientIDCriterion clientIdCriterion = criteria != null ? criteria.get(ClientIDCriterion.class) : null;
         if (clientIdCriterion == null || clientIdCriterion.getClientID() == null) {
             log.trace("No client ID criteria found, returning all");
             return updateKeys(getBackingStore().getOrderedInformation());
@@ -114,7 +115,8 @@ public class FilesystemClientInformationResolver extends AbstractFileOIDCEntityR
 
     /** {@inheritDoc} */
     @Override
-    public OIDCClientInformation resolveSingle(@Nullable final CriteriaSet criteria) throws ResolverException {
+    @Nullable public OIDCClientInformation resolveSingle(@Nullable final CriteriaSet criteria)
+            throws ResolverException {
         final Iterable<OIDCClientInformation> iterable = resolve(criteria);
         if (iterable != null) {
             final Iterator<OIDCClientInformation> iterator = iterable.iterator();
@@ -128,12 +130,12 @@ public class FilesystemClientInformationResolver extends AbstractFileOIDCEntityR
 
     /** {@inheritDoc} */
     @Override
-    protected List<OIDCClientInformation> parse(@Nonnull final byte[] bytes) throws ParseException {
+    @Nonnull protected List<OIDCClientInformation> parse(@Nonnull final byte[] bytes) throws ParseException {
         final String rawString = new String(bytes);
         try {
             final OIDCClientInformation single = OIDCClientInformation.parse(JSONObjectUtils.parse(rawString));
             log.debug("Found single client information from the file");
-            return Arrays.asList(single);
+            return CollectionSupport.singletonList(single);
         } catch (final ParseException e) {
             log.debug("Could not parse single client information from the file, checking for array");
         }
@@ -152,7 +154,8 @@ public class FilesystemClientInformationResolver extends AbstractFileOIDCEntityR
 
     /** {@inheritDoc} */
     @Override
-    protected ClientID getKey(@Nonnull final OIDCClientInformation value) {
+    @Nonnull protected ClientID getKey(@Nonnull final OIDCClientInformation value) {
         return value.getID();
     }
-}
+
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/FilesystemProviderMetadataResolver.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/FilesystemProviderMetadataResolver.java
index 8c2138d..68391be 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/FilesystemProviderMetadataResolver.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/FilesystemProviderMetadataResolver.java
@@ -19,15 +19,11 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Timer;
-import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import org.opensaml.messaging.context.navigate.ChildContextLookup;
-import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.core.io.Resource;
 
 import com.nimbusds.oauth2.sdk.ParseException;
@@ -37,8 +33,8 @@ import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata;
 
 import net.shibboleth.oidc.metadata.RefreshableProviderMetadataResolver;
 import net.shibboleth.oidc.metadata.criterion.IssuerIDCriterion;
-import net.shibboleth.profile.context.RelyingPartyContext;
-import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.collection.CollectionSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
 
@@ -52,11 +48,6 @@ public class FilesystemProviderMetadataResolver extends AbstractFileOIDCEntityRe
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(FilesystemProviderMetadataResolver.class);
 
-    /**
-     * Strategy used to locate the {@link RelyingPartyContext} associated with a given {@link ProfileRequestContext}.
-     */
-    @Nonnull private Function<ProfileRequestContext, RelyingPartyContext> relyingPartyContextLookupStrategy;
-
     /**
      * Constructor.
      * 
@@ -66,7 +57,6 @@ public class FilesystemProviderMetadataResolver extends AbstractFileOIDCEntityRe
      */
     public FilesystemProviderMetadataResolver(@Nonnull final Resource metadata) throws IOException {
         super(metadata);
-        relyingPartyContextLookupStrategy = new ChildContextLookup<>(RelyingPartyContext.class);
     }
 
     /**
@@ -80,32 +70,16 @@ public class FilesystemProviderMetadataResolver extends AbstractFileOIDCEntityRe
     public FilesystemProviderMetadataResolver(@Nullable final Timer backgroundTaskTimer,
             @Nonnull final Resource metadata) throws IOException {
         super(backgroundTaskTimer, metadata);
-        relyingPartyContextLookupStrategy = new ChildContextLookup<>(RelyingPartyContext.class);
-    }
-
-    /**
-     * Set the strategy used to locate the {@link RelyingPartyContext} associated with a given
-     * {@link ProfileRequestContext}.
-     * 
-     * @param strategy strategy used to locate the {@link RelyingPartyContext} associated with a given
-     *            {@link ProfileRequestContext}
-     */
-    public void setRelyingPartyContextLookupStrategy(
-            @Nonnull final Function<ProfileRequestContext, RelyingPartyContext> strategy) {
-        ifInitializedThrowUnmodifiabledComponentException();
-
-        relyingPartyContextLookupStrategy =
-                Constraint.isNotNull(strategy, "RelyingPartyContext lookup strategy cannot be null");
     }
 
     /** {@inheritDoc} */
     @Override
-    @Nullable public Iterable<OIDCProviderMetadata> resolve(@Nullable final CriteriaSet criteria)
+    @Nonnull public Iterable<OIDCProviderMetadata> resolve(@Nullable final CriteriaSet criteria)
             throws ResolverException {
         ifNotInitializedThrowUninitializedComponentException();
         ifDestroyedThrowDestroyedComponentException();
 
-        final IssuerIDCriterion issuerIdCriterion = criteria.get(IssuerIDCriterion.class);
+        final IssuerIDCriterion issuerIdCriterion = criteria != null ? criteria.get(IssuerIDCriterion.class) : null;
         if (issuerIdCriterion == null) {
             log.trace("No issuer ID criteria found, returning all");
             return new ArrayList<>(getBackingStore().getOrderedInformation());
@@ -131,13 +105,13 @@ public class FilesystemProviderMetadataResolver extends AbstractFileOIDCEntityRe
 
     /** {@inheritDoc} */
     @Override
-    protected List<OIDCProviderMetadata> parse(final byte[] bytes) throws ParseException {
-        return List.of(OIDCProviderMetadata.parse(JSONObjectUtils.parse(new String(bytes))));
+    @Nonnull protected List<OIDCProviderMetadata> parse(@Nonnull final byte[] bytes) throws ParseException {
+        return CollectionSupport.singletonList(OIDCProviderMetadata.parse(JSONObjectUtils.parse(new String(bytes))));
     }
 
     /** {@inheritDoc} */
     @Override
-    protected Issuer getKey(@Nonnull final OIDCProviderMetadata value) {
+    @Nonnull protected Issuer getKey(@Nonnull final OIDCProviderMetadata value) {
         return value.getIssuer();
     }
 }
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/HTTPProviderConfigurationFetchingStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/HTTPProviderConfigurationFetchingStrategy.java
index bd9ff3e..55a1489 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/HTTPProviderConfigurationFetchingStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/HTTPProviderConfigurationFetchingStrategy.java
@@ -110,11 +110,12 @@ public class HTTPProviderConfigurationFetchingStrategy
         }
     }
 
+    /** {@inheritDoc} */
     @Override
-    protected String buildRequestURL(@Nonnull final CriteriaSet criteria) {
-        if (criteria.contains(IssuerIDCriterion.class)) {
-            final String url = wellKnownLocationCompositionStrategy
-                    .apply(criteria.get(IssuerIDCriterion.class).getIssuerID(),wellKnownPath);
+    protected String buildRequestURL(@Nullable final CriteriaSet criteria) {
+        final IssuerIDCriterion issuerCrit = criteria != null ? criteria.get(IssuerIDCriterion.class) : null;
+        if (issuerCrit != null) {
+            final String url = wellKnownLocationCompositionStrategy.apply(issuerCrit.getIssuerID(),wellKnownPath);
             
             log.debug("URL generated by request builder was: {}", url);            
             return url;
@@ -127,8 +128,14 @@ public class HTTPProviderConfigurationFetchingStrategy
     @ThreadSafe
     private static final class DefaultWellKnownPathCompositionStrategy implements BiFunction<Issuer, String, String> {
 
+        /** {@inheritDoc} */
         @Override
         @Nullable public String apply(@Nullable final Issuer issuer, @Nullable @NotEmpty final String wellKnownPath) {
+            
+            if (issuer == null) {
+                return null;
+            }
+            
             // remove trailing slash if any (see openid-connect-discovery 4.1)
             final String normalizedIssuer = StringUtils.removeEnd(issuer.getValue(), "/");
             final StringBuilder builder = new StringBuilder();
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/PropertiesClientSecretValueResolver.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/PropertiesClientSecretValueResolver.java
index c33814f..4034068 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/PropertiesClientSecretValueResolver.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/PropertiesClientSecretValueResolver.java
@@ -15,22 +15,21 @@
 package net.shibboleth.oidc.metadata.impl;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.Properties;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.core.io.Resource;
 
 import net.shibboleth.oidc.metadata.criterion.ClientSecretReferenceCriterion;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.collection.LazySet;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.ConstraintViolationException;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
 
@@ -40,7 +39,7 @@ import net.shibboleth.shared.resolver.ResolverException;
 public class PropertiesClientSecretValueResolver extends AbstractClientSecretValueResolver {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(PropertiesClientSecretValueResolver.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(PropertiesClientSecretValueResolver.class);
 
     /** The properties resource containing client secret values. */
     @NonnullAfterInit private Resource propertiesResource;
@@ -73,23 +72,26 @@ public class PropertiesClientSecretValueResolver extends AbstractClientSecretVal
     
     /** {@inheritDoc} */
     @Override
-    public @Nonnull Iterable<String> resolve(@Nonnull final CriteriaSet criteria) throws ResolverException {
+    @Nonnull public Iterable<String> resolve(@Nullable final CriteriaSet criteria) throws ResolverException {
         final String value = resolveSingle(criteria);
         if (value != null) {
-            final LazySet<String> result = new LazySet<>();
-            result.add(value);
-            return result;
+            return CollectionSupport.singletonList(value);
         }
-        return Collections.emptySet();
+        return CollectionSupport.emptySet();
     }
 
     /** {@inheritDoc} */
     @Override
-    public @Nullable String resolveSingle(@Nonnull final CriteriaSet criteria) throws ResolverException {
+    @Nullable public String resolveSingle(@Nullable final CriteriaSet criteria) throws ResolverException {
         ifNotInitializedThrowUninitializedComponentException();
         ifDestroyedThrowDestroyedComponentException();
 
-        final ClientSecretReferenceCriterion criterion = criteria.get(ClientSecretReferenceCriterion.class);
+        final ClientSecretReferenceCriterion criterion =
+                criteria != null ? criteria.get(ClientSecretReferenceCriterion.class) : null;
+        if (criterion == null) {
+            return null;
+        }
+        
         final Properties properties = new Properties();
         try {
             properties.load(propertiesResource.getInputStream());
@@ -97,6 +99,7 @@ public class PropertiesClientSecretValueResolver extends AbstractClientSecretVal
             log.error("Could not read the properties from the resource", e);
             throw new ResolverException(e);
         }
+        
         return properties.getProperty(criterion.getSecretReference());
     }
 
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ReloadingProviderMetadataProvider.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ReloadingProviderMetadataProvider.java
index 4e9f228..d6a4418 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ReloadingProviderMetadataProvider.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ReloadingProviderMetadataProvider.java
@@ -14,18 +14,18 @@
 
 package net.shibboleth.oidc.metadata.impl;
 
-import java.util.Collections;
-
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata;
 
 import net.shibboleth.oidc.metadata.ProviderMetadataResolver;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
 import net.shibboleth.shared.service.ReloadableService;
@@ -54,8 +54,9 @@ public class ReloadingProviderMetadataProvider extends AbstractIdentifiableIniti
         service = Constraint.isNotNull(resolverService, "ProviderMetadataResolver Service cannot be null");
     }
 
-    @Override
-    public Iterable<OIDCProviderMetadata> resolve(@Nonnull final CriteriaSet criteria) throws ResolverException {
+    /** {@inheritDoc} */
+    @Nonnull public Iterable<OIDCProviderMetadata> resolve(@Nullable final CriteriaSet criteria)
+            throws ResolverException {
         ifNotInitializedThrowUninitializedComponentException();
 
         try (final ServiceableComponent<ProviderMetadataResolver> component = service.getServiceableComponent()) {
@@ -67,11 +68,11 @@ public class ReloadingProviderMetadataProvider extends AbstractIdentifiableIniti
             log.error("ReloadingProviderMetadataProvider '{}': Error accessing underlying source: "
                     + "Invalid configuration.", getId());
         }
-        return Collections.emptySet();
+        return CollectionSupport.emptySet();
     }
 
-    @Override
-    public OIDCProviderMetadata resolveSingle(@Nonnull final CriteriaSet criteria) throws ResolverException {
+    /** {@inheritDoc} */
+    @Nullable public OIDCProviderMetadata resolveSingle(@Nullable final CriteriaSet criteria) throws ResolverException {
         ifNotInitializedThrowUninitializedComponentException();
 
         try (final ServiceableComponent<ProviderMetadataResolver> component = service.getServiceableComponent()) {
@@ -86,4 +87,4 @@ public class ReloadingProviderMetadataProvider extends AbstractIdentifiableIniti
         return null;
     }
 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ReloadingRelyingPartyClientInformationProvider.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ReloadingRelyingPartyClientInformationProvider.java
index 3b367f5..2f0e030 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ReloadingRelyingPartyClientInformationProvider.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ReloadingRelyingPartyClientInformationProvider.java
@@ -14,19 +14,18 @@
 
 package net.shibboleth.oidc.metadata.impl;
 
-import java.util.Collections;
-
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.openid.connect.sdk.rp.OIDCClientInformation;
 
 import net.shibboleth.oidc.metadata.ClientInformationResolver;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
 import net.shibboleth.shared.service.ReloadableService;
@@ -56,7 +55,7 @@ public class ReloadingRelyingPartyClientInformationProvider extends AbstractIden
     }
 
     /** {@inheritDoc} */
-    @Override @Nonnull public Iterable<OIDCClientInformation> resolve(final CriteriaSet criteria) 
+    @Nonnull public Iterable<OIDCClientInformation> resolve(@Nullable final CriteriaSet criteria) 
             throws ResolverException {
 
         ifNotInitializedThrowUninitializedComponentException();
@@ -70,11 +69,11 @@ public class ReloadingRelyingPartyClientInformationProvider extends AbstractIden
             log.error("RelyingPartyClientInformationProvider '{}': Error accessing underlying source: "
                     + "Invalid configuration.", getId());
         }
-        return Collections.emptySet();
+        return CollectionSupport.emptySet();
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable public OIDCClientInformation resolveSingle(final CriteriaSet criteria) 
+    @Nullable public OIDCClientInformation resolveSingle(@Nullable final CriteriaSet criteria) 
             throws ResolverException {
 
         ifNotInitializedThrowUninitializedComponentException();
@@ -89,4 +88,5 @@ public class ReloadingRelyingPartyClientInformationProvider extends AbstractIden
         }
         return null;
     }
-}
+
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ResolverServiceClientSecretValueResolver.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ResolverServiceClientSecretValueResolver.java
index cce06d4..fa4d6c2 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ResolverServiceClientSecretValueResolver.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/ResolverServiceClientSecretValueResolver.java
@@ -14,7 +14,6 @@
 
 package net.shibboleth.oidc.metadata.impl;
 
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -25,7 +24,6 @@ import javax.annotation.Nullable;
 import org.opensaml.core.criterion.EntityIdCriterion;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
@@ -34,9 +32,11 @@ import net.shibboleth.idp.attribute.resolver.AttributeResolver;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.oidc.metadata.criterion.ClientSecretReferenceCriterion;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazySet;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
 import net.shibboleth.shared.service.ReloadableService;
@@ -52,7 +52,7 @@ import net.shibboleth.shared.service.ReloadableService;
 public class ResolverServiceClientSecretValueResolver extends AbstractClientSecretValueResolver {
     
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(ResolverServiceClientSecretValueResolver.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(ResolverServiceClientSecretValueResolver.class);
    
     /** The attribute resolver service used for the client secret value resolution. */
     @NonnullAfterInit private ReloadableService<AttributeResolver> service;
@@ -64,7 +64,7 @@ public class ResolverServiceClientSecretValueResolver extends AbstractClientSecr
      * Constructor.
      */
     public ResolverServiceClientSecretValueResolver() {
-        attributeIds = Collections.emptyList();
+        attributeIds = CollectionSupport.emptyList();
     }
     
     /**
@@ -107,22 +107,27 @@ public class ResolverServiceClientSecretValueResolver extends AbstractClientSecr
 
     /** {@inheritDoc} */
     @Override
-    public @Nonnull Iterable<String> resolve(@Nonnull final CriteriaSet criteria) throws ResolverException {
+    @Nonnull public Iterable<String> resolve(@Nullable final CriteriaSet criteria) throws ResolverException {
         ifNotInitializedThrowUninitializedComponentException();
         ifDestroyedThrowDestroyedComponentException();
 
-        final ClientSecretReferenceCriterion referenceCriterion = criteria.get(ClientSecretReferenceCriterion.class);
-        Constraint.isNotNull(referenceCriterion,
-                "The client secret reference criterion must be included in the criteria.");
+        final ClientSecretReferenceCriterion referenceCriterion =
+                criteria != null ? criteria.get(ClientSecretReferenceCriterion.class) : null;
+        if (referenceCriterion == null) {
+            throw new ResolverException("The client secret reference criterion must be included in the criteria.");
+        }
 
         final ProfileRequestContext profileRequestContext = new ProfileRequestContext();
         final AttributeResolutionContext resolutionContext =
-                profileRequestContext.getSubcontext(AttributeResolutionContext.class, true);
+                profileRequestContext.ensureSubcontext(AttributeResolutionContext.class);
         resolutionContext.setPrincipal(referenceCriterion.getSecretReference());
         resolutionContext.setResolutionLabel(getClass().getSimpleName());
-        if (criteria.contains(EntityIdCriterion.class)) {
-            resolutionContext.setAttributeRecipientID(criteria.get(EntityIdCriterion.class).getEntityId());
+        
+        final EntityIdCriterion entityIdCrit = criteria != null ? criteria.get(EntityIdCriterion.class) : null; 
+        if (entityIdCrit != null) {
+            resolutionContext.setAttributeRecipientID(entityIdCrit.getEntityId());
         }
+        
         resolutionContext.resolveAttributes(service);
         final Map<String, IdPAttribute> resolvedAttributes = resolutionContext.getResolvedIdPAttributes();
         final LazySet<String> result = new LazySet<>();
@@ -142,7 +147,7 @@ public class ResolverServiceClientSecretValueResolver extends AbstractClientSecr
 
     /** {@inheritDoc} */
     @Override
-    public @Nullable String resolveSingle(@Nonnull final CriteriaSet criteria) throws ResolverException {
+    @Nullable public String resolveSingle(@Nullable final CriteriaSet criteria) throws ResolverException {
         final Iterator<String> iterator = resolve(criteria).iterator();
         return iterator.hasNext() ? iterator.next() : null;
     }
@@ -151,7 +156,6 @@ public class ResolverServiceClientSecretValueResolver extends AbstractClientSecr
     @Override
     protected void doDestroy() {
         service = null;
-        attributeIds = null;
         super.doDestroy();
     }
 
@@ -164,4 +168,5 @@ public class ResolverServiceClientSecretValueResolver extends AbstractClientSecr
             throw new ComponentInitializationException("Attribute resolver service can not be null");
         }
     }
-}
+    
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/StorageServiceClientInformationManager.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/StorageServiceClientInformationManager.java
index eebec30..a82365d 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/StorageServiceClientInformationManager.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/StorageServiceClientInformationManager.java
@@ -22,13 +22,13 @@ import javax.annotation.Nullable;
 
 import org.opensaml.storage.StorageService;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.oauth2.sdk.id.ClientID;
 import com.nimbusds.openid.connect.sdk.rp.OIDCClientInformation;
 
 import net.shibboleth.oidc.metadata.ClientInformationManager;
 import net.shibboleth.oidc.metadata.ClientInformationManagerException;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * A {@link ClientInformationManager} exploiting {@link StorageService} for storing the data.
@@ -74,7 +74,7 @@ public class StorageServiceClientInformationManager extends BaseStorageServiceCl
 
     /** {@inheritDoc} */
     @Override
-    public void destroyClientInformation(final ClientID clientId) {
+    public void destroyClientInformation(@Nullable final ClientID clientId) {
         if (clientId == null) {
             log.warn("The null clientId cannot be destroyed, nothing to do");
             return;
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/StorageServiceClientInformationResolver.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/StorageServiceClientInformationResolver.java
index c78f44b..47af830 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/StorageServiceClientInformationResolver.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/impl/StorageServiceClientInformationResolver.java
@@ -16,7 +16,6 @@ package net.shibboleth.oidc.metadata.impl;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
@@ -26,7 +25,6 @@ import javax.annotation.Nullable;
 import org.opensaml.storage.StorageRecord;
 import org.opensaml.storage.StorageService;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.oauth2.sdk.ParseException;
 import com.nimbusds.oauth2.sdk.util.JSONObjectUtils;
@@ -34,7 +32,8 @@ import com.nimbusds.openid.connect.sdk.rp.OIDCClientInformation;
 
 import net.shibboleth.oidc.metadata.ClientInformationResolver;
 import net.shibboleth.oidc.metadata.criterion.ClientIDCriterion;
-import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.collection.CollectionSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
 
@@ -48,21 +47,15 @@ public class StorageServiceClientInformationResolver extends BaseStorageServiceC
     @Nonnull private final Logger log = LoggerFactory.getLogger(StorageServiceClientInformationResolver.class);
 
     /** {@inheritDoc} */
-    @Override protected void doInitialize() throws ComponentInitializationException {
-        super.doInitialize();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    @Nullable public Iterable<OIDCClientInformation> resolve(@Nullable final CriteriaSet criteria)
+    @Nonnull public Iterable<OIDCClientInformation> resolve(@Nullable final CriteriaSet criteria)
             throws ResolverException {
         ifNotInitializedThrowUninitializedComponentException();
         ifDestroyedThrowDestroyedComponentException();
 
-        final ClientIDCriterion clientIdCriterion = criteria.get(ClientIDCriterion.class);
+        final ClientIDCriterion clientIdCriterion = criteria != null ? criteria.get(ClientIDCriterion.class) : null;
         if (clientIdCriterion == null || clientIdCriterion.getClientID() == null) {
             log.info("No client ID criteria found, returning empty set.");
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
         // TODO: support other criterion
         final String clientId = clientIdCriterion.getClientID().getValue();
@@ -84,7 +77,6 @@ public class StorageServiceClientInformationResolver extends BaseStorageServiceC
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public OIDCClientInformation resolveSingle(@Nullable final CriteriaSet criteria)
             throws ResolverException {
         final Iterable<OIDCClientInformation> iterable = resolve(criteria);
@@ -97,4 +89,5 @@ public class StorageServiceClientInformationResolver extends BaseStorageServiceC
         log.warn("Could not find any clients with the given criteria");
         return null;
     }
-}
+    
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/ClientSecretProvider.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/ClientSecretProvider.java
index 91474c6..06c2212 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/ClientSecretProvider.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/ClientSecretProvider.java
@@ -25,7 +25,6 @@ import org.opensaml.xmlsec.keyinfo.KeyInfoCredentialResolver;
 import org.opensaml.xmlsec.keyinfo.impl.KeyInfoResolutionContext;
 import org.opensaml.xmlsec.keyinfo.impl.provider.AbstractKeyInfoProvider;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.oauth2.sdk.auth.Secret;
 
@@ -33,6 +32,7 @@ import net.shibboleth.oidc.saml.xmlobject.ClientSecret;
 import net.shibboleth.oidc.security.credential.BasicNimbusSecretCredential;
 import net.shibboleth.oidc.security.credential.NimbusSecretCredential;
 import net.shibboleth.shared.collection.LazySet;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
@@ -43,7 +43,7 @@ import net.shibboleth.shared.resolver.CriteriaSet;
 public class ClientSecretProvider extends AbstractKeyInfoProvider {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(ClientSecretProvider.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(ClientSecretProvider.class);
 
     /** {@inheritDoc} */
     @Override @Nullable
@@ -80,4 +80,5 @@ public class ClientSecretProvider extends AbstractKeyInfoProvider {
             return null;
         }
     }
-}
+
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/ClientSecretReferenceProvider.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/ClientSecretReferenceProvider.java
index 2827474..7fa3193 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/ClientSecretReferenceProvider.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/ClientSecretReferenceProvider.java
@@ -15,8 +15,6 @@
 package net.shibboleth.oidc.metadata.keyinfo.ext.impl.provider;
 
 import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -27,7 +25,6 @@ import org.opensaml.xmlsec.keyinfo.KeyInfoCredentialResolver;
 import org.opensaml.xmlsec.keyinfo.impl.KeyInfoResolutionContext;
 import org.opensaml.xmlsec.keyinfo.impl.provider.AbstractKeyInfoProvider;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.oauth2.sdk.auth.Secret;
 
@@ -37,7 +34,9 @@ import net.shibboleth.oidc.saml.xmlobject.ClientSecretKeyReference;
 import net.shibboleth.oidc.security.credential.BasicNimbusSecretCredential;
 import net.shibboleth.oidc.security.credential.NimbusSecretCredential;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazySet;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.ResolverException;
@@ -63,9 +62,9 @@ public class ClientSecretReferenceProvider  extends AbstractKeyInfoProvider {
     public ClientSecretReferenceProvider(
             @Nullable @NotEmpty final Collection<ClientSecretValueResolver> valueResolvers) {
         if (valueResolvers != null) {
-            clientSecretValueResolvers = List.copyOf(valueResolvers);
+            clientSecretValueResolvers = CollectionSupport.copyToList(valueResolvers);
         } else {
-            clientSecretValueResolvers = Collections.emptyList();
+            clientSecretValueResolvers = CollectionSupport.emptyList();
         }
     }
     
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/InlineJwksProvider.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/InlineJwksProvider.java
index 50c782d..983710c 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/InlineJwksProvider.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/keyinfo/ext/impl/provider/InlineJwksProvider.java
@@ -30,7 +30,6 @@ import org.opensaml.xmlsec.keyinfo.KeyInfoCredentialResolver;
 import org.opensaml.xmlsec.keyinfo.impl.KeyInfoResolutionContext;
 import org.opensaml.xmlsec.keyinfo.impl.provider.AbstractKeyInfoProvider;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.nimbusds.jose.JOSEException;
 import com.nimbusds.jose.jwk.AsymmetricJWK;
@@ -45,6 +44,7 @@ import net.shibboleth.oidc.security.credential.JWKCredential;
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.DecodingException;
 import net.shibboleth.shared.collection.LazySet;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
@@ -56,7 +56,7 @@ import net.shibboleth.shared.resolver.CriteriaSet;
 public class InlineJwksProvider extends AbstractKeyInfoProvider {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(InlineJwksProvider.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(InlineJwksProvider.class);
 
     /** {@inheritDoc} */
     @Override @Nullable
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyEnforcer.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyEnforcer.java
index e93bfb1..f0dfe7c 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyEnforcer.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyEnforcer.java
@@ -24,11 +24,12 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.oidc.metadata.policy.MetadataPolicy;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.logic.ConstraintViolationException;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * <p>A function that applies the given {@link MetadataPolicy} to the given object. The input is given as a {@link
@@ -121,7 +122,7 @@ public class DefaultMetadataPolicyEnforcer implements BiFunction<Object,Metadata
             }
         }
         if (add instanceof Collection) {
-            return List.copyOf((Collection<?>) add);
+            return CollectionSupport.copyToList((Collection<?>) add);
         }
         return add;
     }
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyResponseHandler.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyResponseHandler.java
index 4055c9d..a5be73e 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyResponseHandler.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyResponseHandler.java
@@ -27,7 +27,6 @@ import org.apache.hc.core5.http.HttpStatus;
 import org.apache.hc.core5.http.io.HttpClientResponseHandler;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.slf4j.MDC;
 
 import net.shibboleth.oidc.metadata.policy.MetadataPolicy;
@@ -35,6 +34,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /** The response handler for parsing the metadata policy document into a map. */
 public class DefaultMetadataPolicyResponseHandler extends AbstractIdentifiableInitializableComponent
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyValidator.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyValidator.java
index 493e18d..9a25c8c 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyValidator.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/DefaultMetadataPolicyValidator.java
@@ -22,10 +22,10 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.oidc.metadata.policy.MetadataPolicy;
 import net.shibboleth.shared.collection.Pair;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * <p>
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyViaLocationFetchingStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyViaLocationFetchingStrategy.java
index a3e6172..54a628d 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyViaLocationFetchingStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyViaLocationFetchingStrategy.java
@@ -25,7 +25,6 @@ import javax.annotation.Nullable;
 import org.apache.hc.client5.http.classic.HttpClient;
 import org.apache.hc.core5.http.io.HttpClientResponseHandler;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.core.io.FileSystemResource;
 
 import net.shibboleth.oidc.metadata.cache.CacheLoadingContext;
@@ -38,6 +37,7 @@ import net.shibboleth.oidc.metadata.policy.MetadataPolicy;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
 /**
@@ -62,8 +62,8 @@ public class MetadataPolicyViaLocationFetchingStrategy
      * @param client the instance of {@link HttpClient} used to fetch remote metadata policy.
      * @param handler the response handler used to convert the HTTP response to the metadata policy.
      */
-    public MetadataPolicyViaLocationFetchingStrategy(final HttpClient client,
-            final HttpClientResponseHandler<Map<String, MetadataPolicy>> handler) {
+    public MetadataPolicyViaLocationFetchingStrategy(@Nonnull final HttpClient client,
+            @Nonnull final HttpClientResponseHandler<Map<String, MetadataPolicy>> handler) {
         super(client, handler);
     }
     
@@ -91,7 +91,7 @@ public class MetadataPolicyViaLocationFetchingStrategy
 
     /** {@inheritDoc} */
     @Override
-    @Nullable public Map<String, MetadataPolicy> apply(final @Nonnull CriteriaSet criteriaSet) {
+    @Nullable public Map<String, MetadataPolicy> apply(@Nullable final CriteriaSet criteriaSet) {
         final String requestURL = buildRequestURL(criteriaSet);
         if (requestURL == null) {
             return null;
@@ -127,7 +127,7 @@ public class MetadataPolicyViaLocationFetchingStrategy
 
     /** {@inheritDoc} */
     @Override
-    protected String buildRequestURL(final CriteriaSet criteria) {
+    protected String buildRequestURL(@Nullable final CriteriaSet criteria) {
         if (criteria == null || criteria.isEmpty()) {
             return null;
         }
@@ -135,4 +135,4 @@ public class MetadataPolicyViaLocationFetchingStrategy
         return criterion == null ? null : criterion.getResourceLocation();
     }
 
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/filter/impl/ClientInformationParser.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/filter/impl/ClientInformationParser.java
index 85b31b4..732cb4f 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/filter/impl/ClientInformationParser.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/filter/impl/ClientInformationParser.java
@@ -18,7 +18,7 @@ import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
 import org.springframework.beans.factory.xml.ParserContext;
@@ -26,6 +26,7 @@ import org.w3c.dom.Element;
 
 import net.shibboleth.oidc.metadata.impl.ClientInformationNodeProcessor;
 import net.shibboleth.oidc.profile.spring.relyingparty.metadata.impl.MetadataNamespaceHandler;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -41,22 +42,24 @@ public class ClientInformationParser extends AbstractSingleBeanDefinitionParser
     @Nonnull private final Logger log = LoggerFactory.getLogger(ClientInformationParser.class);
     
     /** {@inheritDoc} */
-    @Override protected Class<?> getBeanClass(final Element element) {
+    @Override protected Class<?> getBeanClass(@Nonnull final Element element) {
         return ClientInformationNodeProcessor.class;
     }
 
     /** {@inheritDoc} */
     @Override
-    protected void doParse(final Element element, final ParserContext parserContext,
-            final BeanDefinitionBuilder builder) {
+    protected void doParse(@Nonnull final Element element, @Nonnull final ParserContext parserContext,
+            @Nonnull final BeanDefinitionBuilder builder) {
         super.doParse(element, parserContext, builder);
 
         if (element.hasAttributeNS(null, "keyInfoProvidersRef")) {
-            builder.addConstructorArgReference(StringSupport.trimOrNull(element.getAttributeNS(null,
-                    "keyInfoProvidersRef")));
-        } else {
-            log.error("No 'keyInfoProvidersRef' attribute defined!");
+            final String trimmed = StringSupport.trimOrNull(element.getAttributeNS(null, "keyInfoProvidersRef"));
+            if (trimmed != null) {
+                builder.addConstructorArgReference(trimmed);
+            }
+            return;
         }
+        log.error("No 'keyInfoProvidersRef' attribute defined!");
     }
 
     /** {@inheritDoc} */
@@ -64,4 +67,4 @@ public class ClientInformationParser extends AbstractSingleBeanDefinitionParser
         return true;
     }
     
-}
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/impl/ClientInformationResolverServiceStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/impl/ClientInformationResolverServiceStrategy.java
index 3a12027..cf0a4c7 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/impl/ClientInformationResolverServiceStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/impl/ClientInformationResolverServiceStrategy.java
@@ -28,6 +28,7 @@ import org.springframework.context.ApplicationContext;
 import net.shibboleth.oidc.metadata.ClientInformationResolver;
 import net.shibboleth.oidc.metadata.RelyingPartyClientInformationProvider;
 import net.shibboleth.oidc.metadata.impl.ChainingClientInformationResolver;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.NonnullFunction;
@@ -47,10 +48,11 @@ public class ClientInformationResolverServiceStrategy extends AbstractIdentifiab
         implements NonnullFunction<ApplicationContext, AbstractServiceableComponent<ClientInformationResolver>> {
 
     /** {@inheritDoc} */
-	@Nonnull
-    public AbstractServiceableComponent<ClientInformationResolver> apply(@Nullable final ApplicationContext appContext) {
+    @Nonnull public AbstractServiceableComponent<ClientInformationResolver> apply(
+            @Nullable final ApplicationContext appContext) {
         final Collection<RelyingPartyClientInformationProvider> resolvers =
-                appContext.getBeansOfType(RelyingPartyClientInformationProvider.class).values();
+                appContext != null ? appContext.getBeansOfType(RelyingPartyClientInformationProvider.class).values()
+                        : CollectionSupport.emptyList();
 
         if (resolvers.isEmpty()) {
             throw new ServiceException(
@@ -87,4 +89,5 @@ public class ClientInformationResolverServiceStrategy extends AbstractIdentifiab
             throw new ServiceException("Chaining constructor create failed", e);
         }
     }
-}
+
+}
\ No newline at end of file
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/impl/ProviderMetadataResolverServiceStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/impl/ProviderMetadataResolverServiceStrategy.java
index 4ec5584..c8dfc1f 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/impl/ProviderMetadataResolverServiceStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/profile/spring/relyingparty/metadata/impl/ProviderMetadataResolverServiceStrategy.java
@@ -21,6 +21,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import org.springframework.beans.factory.BeanCreationException;
 import org.springframework.context.ApplicationContext;
@@ -28,6 +29,7 @@ import org.springframework.context.ApplicationContext;
 import net.shibboleth.oidc.metadata.ProviderMetadataProviderContainer;
 import net.shibboleth.oidc.metadata.ProviderMetadataResolver;
 import net.shibboleth.oidc.metadata.impl.ChainingProviderMetadataResolver;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.NonnullFunction;
@@ -48,9 +50,10 @@ public class ProviderMetadataResolverServiceStrategy extends AbstractIdentifiabl
 
     /** {@inheritDoc} */
     @Nonnull
-    public AbstractServiceableComponent<ProviderMetadataResolver> apply(@Nonnull final ApplicationContext appContext) {
+    public AbstractServiceableComponent<ProviderMetadataResolver> apply(@Nullable final ApplicationContext appContext) {
         final Collection<ProviderMetadataProviderContainer> containers =
-                appContext.getBeansOfType(ProviderMetadataProviderContainer.class).values();
+                appContext != null ? appContext.getBeansOfType(ProviderMetadataProviderContainer.class).values()
+                        : CollectionSupport.emptyList();
 
         if (containers.isEmpty()) {
             throw new ServiceException(

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


More information about the commits mailing list