[java-oidfed-common] branch main updated: Refactored the entity configuration skeleton fetching strategy to use Metadata object

Codeberg noreply at shibboleth.net
Thu Sep 24 12:07:12 UTC 2026


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

codeberg pushed a commit to branch main
in repository java-oidfed-common.

View the commit online:
https://codeberg.org/Shibboleth/java-oidfed-common/commit/723d21953a160c8fa0979a905f00a9d41a706599

The following commit(s) were added to refs/heads/main by this push:
     new 723d219  Refactored the entity configuration skeleton fetching strategy to use Metadata object
723d219 is described below

commit 723d21953a160c8fa0979a905f00a9d41a706599
Author: Henri Mikkonen <henri.mikkonen at iki.fi>
AuthorDate: Thu Sep 24 15:06:41 2026 +0300

    Refactored the entity configuration skeleton fetching strategy to use Metadata object
    
    - Also simplified MetadataImpl to deal with the copies of maps
    - Fixed wrong references regarding oauthResourceMetadata
---
 ...onfigurationMetadataSkeletonLookupStrategy.java | 13 +++--
 .../metadata/payload/claim/impl/MetadataImpl.java  | 59 +++++++++-------------
 .../impl/InitializeEntityStatementContext.java     | 25 +++++----
 3 files changed, 47 insertions(+), 50 deletions(-)

diff --git a/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/metadata/cache/local/DefaultEntityConfigurationMetadataSkeletonLookupStrategy.java b/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/metadata/cache/local/DefaultEntityConfigurationMetadataSkeletonLookupStrategy.java
index ded0f10..57c652c 100644
--- a/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/metadata/cache/local/DefaultEntityConfigurationMetadataSkeletonLookupStrategy.java
+++ b/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/metadata/cache/local/DefaultEntityConfigurationMetadataSkeletonLookupStrategy.java
@@ -25,6 +25,8 @@ import org.slf4j.Logger;
 
 import net.shibboleth.oidc.metadata.cache.MetadataCache;
 import net.shibboleth.oidc.metadata.cache.MetadataCacheException;
+import net.shibboleth.oidfed.metadata.payload.claim.Metadata;
+import net.shibboleth.oidfed.metadata.payload.claim.impl.MetadataImpl;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.ThreadSafeAfterInit;
 import net.shibboleth.shared.collection.CollectionSupport;
@@ -39,7 +41,7 @@ import net.shibboleth.shared.resolver.CriteriaSet;
  */
 @ThreadSafeAfterInit
 public class DefaultEntityConfigurationMetadataSkeletonLookupStrategy extends AbstractIdentifiableInitializableComponent
-        implements Function<CriteriaSet, Map<String,Map<String,Object>>> {
+        implements Function<CriteriaSet, Metadata> {
 
     /** Class logger. */
     @Nonnull
@@ -69,18 +71,21 @@ public class DefaultEntityConfigurationMetadataSkeletonLookupStrategy extends Ab
 
     /** {@inheritDoc} */
     @Override @Nullable
-    public Map<String,Map<String,Object>> apply(@Nullable final CriteriaSet criteria) {
+    public Metadata apply(@Nullable final CriteriaSet criteria) {
         checkComponentActive();
         if (criteria != null) {
             try {
-                return Optional.of(metadataSkeletonCache.get(criteria))
+                final Map<String, Map<String, Object>> skeletonClaims =
+                        Optional.ofNullable(metadataSkeletonCache.get(criteria))
                         .filter(result -> result.size() == 1)
                         .map(result -> result.get(0))
                         .orElse(CollectionSupport.emptyMap());
+                assert skeletonClaims != null;
+                return new MetadataImpl(skeletonClaims);
             } catch (final MetadataCacheException e) {
                 log.error("Could not fetch metadata skeleton via metadata cache", e);
             }
         }
-        return CollectionSupport.emptyMap();
+        return new MetadataImpl(CollectionSupport.emptyMap());
     }
 }
diff --git a/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/metadata/payload/claim/impl/MetadataImpl.java b/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/metadata/payload/claim/impl/MetadataImpl.java
index 4a0e975..d03aa43 100644
--- a/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/metadata/payload/claim/impl/MetadataImpl.java
+++ b/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/metadata/payload/claim/impl/MetadataImpl.java
@@ -70,35 +70,24 @@ public class MetadataImpl implements Metadata {
      */
     public MetadataImpl(@Nonnull final Map<String, Map<String, Object>> allClaims) {
         for (final String claim : allClaims.keySet()) {
-            verifyNoNullValues(allClaims.get(claim), Constraint.isNotNull(claim,
+            final Map<String, Object> value = verifyNoNullValues(allClaims.get(claim), Constraint.isNotNull(claim,
                     "Metadata for entity type " + claim + " contains a null claim key"));
+            if ("federation_entity".equals(claim)) {
+                federationEntityMetadata = value;
+            } else if ("openid_relying_party".equals(claim)) {
+                openidRelyingPartyMetadata = value;
+            } else if ("openid_provider".equals(claim)) {
+                openidProviderMetadata = value;
+            } else if ("oauth_authorization_server".equals(claim)) {
+                oauthAuthorizationServerMetadata = value;
+            } else if ("oauth_client".equals(claim)) {
+                oauthClientMetadata = value;
+            } else if ("oauth_resource".equals(claim)) {
+                oauthResourceMetadata = value;
+            } else {
+                customClaims.put(claim, value);
+            }
         }
-        final Map<String,Map<String,Object>> input = new HashMap<>(allClaims);
-        if (allClaims.containsKey("federation_entity")) {
-            federationEntityMetadata = allClaims.get("federation_entity");
-            input.remove("federation_entity");
-        }
-        if (allClaims.containsKey("openid_relying_party")) {
-            openidRelyingPartyMetadata = allClaims.get("openid_relying_party");
-            input.remove("openid_relying_party");
-        }
-        if (allClaims.containsKey("openid_provider")) {
-            openidProviderMetadata = allClaims.get("openid_provider");
-            input.remove("openid_provider");
-        }
-        if (allClaims.containsKey("oauth_authorization_server")) {
-            oauthAuthorizationServerMetadata = allClaims.get("oauth_authorization_server");
-            input.remove("oauth_authorization_server");
-        }
-        if (allClaims.containsKey("oauth_client")) {
-            oauthClientMetadata = allClaims.get("oauth_client");
-            input.remove("oauth_client");
-        }
-        if (allClaims.containsKey("oauth_resource")) {
-            oauthResourceMetadata = allClaims.get("oauth_resource");
-            input.remove("oauth_resource");
-        }
-        customClaims.putAll(input);
     }
 
     /**
@@ -197,7 +186,7 @@ public class MetadataImpl implements Metadata {
      * @return OAuth protected resource metadata
      */
     @Nullable public Map<String,Object> getOauthResourceMetadata() {
-        return oauthClientMetadata;
+        return oauthResourceMetadata;
     }
 
     /**
@@ -206,7 +195,7 @@ public class MetadataImpl implements Metadata {
      * @param metadata OAuth protected resource metadata
      */
     public void setOauthResourceMetadata(@Nullable final Map<String,Object> metadata) {
-        oauthClientMetadata = verifyNoNullValues(metadata, "oauth_resource");
+        oauthResourceMetadata = verifyNoNullValues(metadata, "oauth_resource");
     }
 
     /**
@@ -253,7 +242,7 @@ public class MetadataImpl implements Metadata {
             claims.put("oauth_client", oauthClientMetadata);
         }
         if (oauthResourceMetadata != null) {
-            claims.put("oauth_resource", oauthClientMetadata);
+            claims.put("oauth_resource", oauthResourceMetadata);
         }
         claims.putAll(getCustomClaims());
         return CollectionSupport.copyToMap(claims);
@@ -269,13 +258,13 @@ public class MetadataImpl implements Metadata {
      */
     protected Map<String,Object> verifyNoNullValues(@Nullable final Map<String,Object> map,
             @Nonnull final String entityType)  throws ConstraintViolationException {
-        Constraint.isNotNull(map, "Metadata entity type " + entityType + " cannot be null");
-        assert map != null;
-        for (final String claim : map.keySet()) {
-            Constraint.isNotNull(map.get(claim), "Metadata for entity type " + entityType 
+        final Map<String,Object> nonNullMap =
+                Constraint.isNotNull(map, "Metadata entity type " + entityType + " cannot be null");
+        for (final String claim : nonNullMap.keySet()) {
+            Constraint.isNotNull(nonNullMap.get(claim), "Metadata for entity type " + entityType 
                     + " contains a claim with null value: " + claim);
         }
-        return map;
+        return CollectionSupport.copyToMap(nonNullMap);
     }
 
     /** {@inheritDoc} */
diff --git a/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/profile/impl/InitializeEntityStatementContext.java b/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/profile/impl/InitializeEntityStatementContext.java
index 08129cf..545a919 100644
--- a/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/profile/impl/InitializeEntityStatementContext.java
+++ b/oidfed-common-impl/src/main/java/net/shibboleth/oidfed/profile/impl/InitializeEntityStatementContext.java
@@ -27,16 +27,15 @@ import org.opensaml.profile.context.navigate.OutboundMessageContextLookup;
 import org.slf4j.Logger;
 
 import net.shibboleth.idp.profile.AbstractProfileAction;
+import net.shibboleth.oidfed.metadata.payload.claim.Metadata;
 import net.shibboleth.oidfed.metadata.payload.claim.impl.MetadataImpl;
 import net.shibboleth.oidfed.profile.EntityConfigurationMetadataDecorator;
 import net.shibboleth.oidfed.profile.EntityConfigurationMetadataDecoratorManager;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
-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.primitive.NonnullSupplier;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
@@ -56,7 +55,7 @@ public class InitializeEntityStatementContext extends AbstractProfileAction {
 
     /** Strategy used to locate skeleton for the metadata claim. */
     @NonnullAfterInit
-    private Function<CriteriaSet,Map<String,Map<String,Object>>> metadataSkeletonLookupStrategy;
+    private Function<CriteriaSet,Metadata> metadataSkeletonLookupStrategy;
 
     /** Strategy used to create the subcontext to hold the statement. */
     @Nonnull private Function<ProfileRequestContext,EntityStatementContext> entityStatementContextCreationStrategy;
@@ -68,7 +67,7 @@ public class InitializeEntityStatementContext extends AbstractProfileAction {
     @NonnullBeforeExec private EntityStatementContext entityStatementCtx;
 
     /** Metadata skeleton. */
-    @NonnullBeforeExec private Map<String,Map<String,Object>> metadataSkeleton;
+    @NonnullBeforeExec private Metadata metadataSkeleton;
 
     /** Constructor. */
     public InitializeEntityStatementContext() {
@@ -85,7 +84,7 @@ public class InitializeEntityStatementContext extends AbstractProfileAction {
      * @param strategy lookup strategy
      */
     public void setMetadataSkeletonLookupStrategy(
-            @Nonnull final Function<CriteriaSet,Map<String,Map<String,Object>>> strategy) {
+            @Nonnull final Function<CriteriaSet,Metadata> strategy) {
         checkSetterPreconditions();
         
         metadataSkeletonLookupStrategy =
@@ -143,8 +142,8 @@ public class InitializeEntityStatementContext extends AbstractProfileAction {
             return false;
         }
 
-        metadataSkeleton = new HashMap<>(Optional.ofNullable(metadataSkeletonLookupStrategy.apply(new CriteriaSet()))
-                .orElseGet(NonnullSupplier.of(CollectionSupport.emptyMap())));
+        metadataSkeleton = Optional.ofNullable(metadataSkeletonLookupStrategy.apply(new CriteriaSet()))
+                .orElse(new MetadataImpl());
 
         return true;
     }
@@ -153,13 +152,17 @@ public class InitializeEntityStatementContext extends AbstractProfileAction {
     @Override
     protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
         log.trace("{} Start decoration of metadata skeleton {}", getLogPrefix(), metadataSkeleton);
+        final Map<String, Map<String, Object>> skeletonClaims = metadataSkeleton.getAllClaims();
+        final Map<String, Map<String, Object>> decorationClaims = new HashMap<>();
+        for (final String claim : skeletonClaims.keySet()) {
+            decorationClaims.put(claim, new HashMap<>(skeletonClaims.get(claim)));
+        }
         for (final EntityConfigurationMetadataDecorator decorator : metadataDecoratorManager.all()) {
             log.debug("{} Decorating metadata skeleton with {}", getLogPrefix(), decorator.getId());
-            decorator.accept(metadataSkeleton, profileRequestContext);
+            decorator.accept(decorationClaims, profileRequestContext);
         }
-        log.trace("{} Metadata after all decorators have run: {}", getLogPrefix(), metadataSkeleton);
-        assert metadataSkeleton != null;
-        entityStatementCtx.setMetadata(new MetadataImpl(metadataSkeleton));
+        log.trace("{} Metadata after all decorators have run: {}", getLogPrefix(), decorationClaims);
+        entityStatementCtx.setMetadata(new MetadataImpl(decorationClaims));
     }
 
 }
\ No newline at end of file

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


More information about the commits mailing list