[java-identity-provider] 01/02: IDP-1486 Collapse the RelyingPartyMetadata Provider

Rod Widdowson rdw at steadingsoftware.com
Fri Aug 30 10:01:11 EDT 2019


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

rdw pushed a commit to branch master
in repository java-identity-provider.

View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=da2e29da9dc6509fda1e98ff5b5234c86966f9d7

commit da2e29da9dc6509fda1e98ff5b5234c86966f9d7
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Fri Aug 30 14:24:54 2019 +0100

    IDP-1486 Collapse the RelyingPartyMetadata Provider
    
    https://issues.shibboleth.net/jira/browse/IDP-1486
    
    We replace this with a container (which can also be a serviceable component) but which can be
    restricted to the Spring  project (since this is the only place we need it)
---
 .../metadata/AbstractMetadataProviderParser.java   |  13 +-
 .../metadata/MetadataProviderContainer.java        | 139 +++++++++++
 .../impl/MetadataResolverServiceStrategy.java      |  47 ++--
 .../NodeProcessingAttachingBeanPostProcessor.java  |   4 +-
 .../metadata/AbstractMetadataParserTest.java       |   3 +-
 .../DynamicHTTPMetadataProviderParserTest.java     |  15 +-
 .../relyingparty/metadata/EmptyChainService.java   |  10 +-
 .../metadata/FilesystemMetadataParserTest.java     |  10 +-
 .../LocalDynamicMetadataProviderParserTest.java    |   3 +-
 .../metadata/RelyingPartyMetadataProvider.java     | 261 ---------------------
 .../impl/MetadataResolverServiceGaugeSet.java      |  14 +-
 .../idp/saml/profile/impl/ReloadMetadata.java      |  31 +--
 12 files changed, 202 insertions(+), 348 deletions(-)

diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataProviderParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataProviderParser.java
index 890a0d7..cd07395 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataProviderParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataProviderParser.java
@@ -33,7 +33,6 @@ import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
 import net.shibboleth.ext.spring.util.SpringSupport;
-import net.shibboleth.idp.saml.metadata.RelyingPartyMetadataProvider;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 import net.shibboleth.utilities.java.support.xml.DOMTypeSupport;
 import net.shibboleth.utilities.java.support.xml.ElementSupport;
@@ -41,10 +40,8 @@ import net.shibboleth.utilities.java.support.xml.ElementSupport;
 /**
  * Parser for the MetadataProviderType in the <code>urn:mace:shibboleth:2.0:metadata</code> namespace.
  * 
- * This also handles the ambivalence of where the <MetadataProvider> can be found. If it is found inside a
- * <RelyingPartyGroup> or a <ChainingMetadataPRovider> then we just emit a MetadataResolver of the correct
- * type and the outer parsers will deal with the rest. If we are the top most element then we need to summon up a
- * {@link RelyingPartyMetadataProvider} and inject what we would usually create into that.
+ *  If we are the top most element then we need to summon up a
+ * {@link MetadataProviderContainer} and inject what we would usually create into that.
  */
 public abstract class AbstractMetadataProviderParser extends AbstractSingleBeanDefinitionParser {
 
@@ -89,7 +86,7 @@ public abstract class AbstractMetadataProviderParser extends AbstractSingleBeanD
 
     /**
      * Is this the element at the top of the file? Yes, if it has no parent. In
-     * this situation we need to wrap the element in a {@link RelyingPartyMetadataProvider}.
+     * this situation we need to wrap the element in a {@link MetadataProviderContainer}.
      * 
      * @param element the element.
      * @return whether it is the outmost element.
@@ -113,9 +110,9 @@ public abstract class AbstractMetadataProviderParser extends AbstractSingleBeanD
     protected abstract Class<? extends MetadataResolver> getNativeBeanClass(Element element);
 
     /** {@inheritDoc} */
-    @Override protected final Class<? extends MetadataResolver> getBeanClass(final Element element) {
+    @Override protected final Class<?> getBeanClass(final Element element) {
         if (isTopMost(element)) {
-            return RelyingPartyMetadataProvider.class;
+            return MetadataProviderContainer.class;
         }
         return getNativeBeanClass(element);
     }
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/MetadataProviderContainer.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/MetadataProviderContainer.java
new file mode 100644
index 0000000..e5c1801
--- /dev/null
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/MetadataProviderContainer.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.shibboleth.idp.profile.spring.relyingparty.metadata;
+
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import org.opensaml.saml.metadata.resolver.MetadataResolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import net.shibboleth.ext.spring.service.AbstractServiceableComponent;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.component.ComponentSupport;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+
+
+/**
+ * This class is a sortable container of {@link MetadataResolver}s, wrapped into a serviceable component.
+ */
+public class MetadataProviderContainer extends AbstractServiceableComponent<MetadataResolver>
+                                       implements Comparable<MetadataProviderContainer> {
+
+    /** If we autogenerate a sort key it comes from this count. */
+    private static int sortKeyValue;
+
+    /** Class logger. */
+    private final Logger log = LoggerFactory.getLogger(MetadataProviderContainer.class);
+
+    /** The embedded resolver. */
+    @NonnullAfterInit private MetadataResolver resolver;
+
+    /** The key by which we sort the provider. */
+    @NonnullAfterInit private Integer sortKey;
+
+
+    /**
+     * Set the sort key.
+     * 
+     * @param key what to set
+     */
+    public void setSortKey(final int key) {
+        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        sortKey = key;
+    }
+    
+    /**
+     * Set the {@link MetadataResolver} to embed.
+     * 
+     * @param theResolver The {@link MetadataResolver} to embed.
+     */
+    @Nonnull public void setEmbeddedResolver(@Nonnull final MetadataResolver theResolver) {
+        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        resolver = Constraint.isNotNull(theResolver, "MetadataResolver cannot be null");
+    }
+
+    /**
+     * Return what we are build around. Used for testing.
+     * 
+     * @return the contained resolver.
+     */
+    @Nonnull public MetadataResolver getEmbeddedResolver() {
+        return resolver;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void doInitialize() throws ComponentInitializationException {
+        setId(resolver.getId());
+        super.doInitialize();
+        if (null == resolver) {
+            throw new ComponentInitializationException("MetadataResolver cannot be null");
+        }
+
+        if (null == sortKey) {
+            synchronized (MetadataProviderContainer.class) {
+                sortKeyValue++;
+                sortKey = sortKeyValue;
+            }
+            log.info("Top level Metadata Provider '{}' did not have a sort key; giving it value '{}'",
+                    getId(), sortKey);
+        }
+    }
+    
+    /** {@inheritDoc} */
+    @Override public int compareTo(final MetadataProviderContainer other) {
+        ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
+        final int result = sortKey.compareTo(other.sortKey);
+        if (result != 0) {
+            return result;
+        }
+        if (equals(other)) {
+            return 0;
+        }
+        return getId().compareTo(other.getId());
+    }
+
+    /**
+     * {@inheritDoc}. We are within a spring context and so equality can be determined by ID, however we also test by
+     * sortKey just in case.
+     */
+    @Override public boolean equals(final Object other) {
+        if (null == other) {
+            return false;
+        }
+        if (!(other instanceof MetadataProviderContainer)) {
+            return false;
+        }
+        final MetadataProviderContainer otherRp = (MetadataProviderContainer) other;
+        
+        return Objects.equals(otherRp.sortKey, sortKey) && Objects.equals(getId(), otherRp.getId());
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        return com.google.common.base.Objects.hashCode(sortKey, getId());
+    }
+
+    /** {@inheritDoc} */
+    public MetadataResolver getComponent() {
+        return getEmbeddedResolver();
+    }
+}
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/MetadataResolverServiceStrategy.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/MetadataResolverServiceStrategy.java
index 1ede21e..7f563a5 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/MetadataResolverServiceStrategy.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/MetadataResolverServiceStrategy.java
@@ -22,25 +22,26 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import javax.annotation.Nullable;
 
-import net.shibboleth.idp.saml.metadata.RelyingPartyMetadataProvider;
+import org.opensaml.saml.metadata.resolver.ChainingMetadataResolver;
+import org.opensaml.saml.metadata.resolver.MetadataResolver;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.context.ApplicationContext;
+
+import net.shibboleth.idp.profile.spring.relyingparty.metadata.MetadataProviderContainer;
 import net.shibboleth.utilities.java.support.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.resolver.ResolverException;
 import net.shibboleth.utilities.java.support.service.ServiceException;
 import net.shibboleth.utilities.java.support.service.ServiceableComponent;
 
-import org.opensaml.saml.metadata.resolver.ChainingMetadataResolver;
-import org.opensaml.saml.metadata.resolver.MetadataResolver;
-import org.springframework.beans.factory.BeanCreationException;
-import org.springframework.context.ApplicationContext;
-
 /**
  * Strategy for summoning up a {@link MetadataResolver} from a populated {@link ApplicationContext}. <br/>
- * This is made somewhat complex by the need to chain multiple, top level Metadata Resolvers, but to not combine, non
- * top level resolvers. The parser will create a {@link RelyingPartyMetadataProvider} for each top level resolver. If we
+ * This is made somewhat complex by the need to chain multiple, top level Metadata Resolvers, but to not combine non
+ * top level resolvers. The parser will create a {@link MetadataProviderContainer} for each top level resolver. If we
  * encounter but one we are done (it is a {@link ServiceableComponent} already), otherwise we need to chain all the
  * children together and wrap them into a Serviceable Component.
  * 
@@ -50,19 +51,19 @@ public class MetadataResolverServiceStrategy extends AbstractIdentifiableInitial
 
     /** {@inheritDoc} */
     @Nullable public ServiceableComponent<MetadataResolver> apply(@Nullable final ApplicationContext appContext) {
-        final Collection<RelyingPartyMetadataProvider> resolvers =
-                appContext.getBeansOfType(RelyingPartyMetadataProvider.class).values();
+        final Collection<MetadataProviderContainer> containers =
+                appContext.getBeansOfType(MetadataProviderContainer.class).values();
 
-        if (resolvers.isEmpty()) {
+        if (containers.isEmpty()) {
             throw new ServiceException("Reload did not produce any bean of type"
-                    + RelyingPartyMetadataProvider.class.getName());
+                    + MetadataProviderContainer.class.getName());
         }
-        if (1 == resolvers.size()) {
+        if (1 == containers.size()) {
             // done
-            return resolvers.iterator().next();
+            return containers.iterator().next();
         }
         // initialize so we can sort
-        for (final RelyingPartyMetadataProvider resolver:resolvers) {
+        for (final MetadataProviderContainer resolver:containers) {
             try {
                 resolver.initialize();
             } catch (final ComponentInitializationException e) {
@@ -70,15 +71,17 @@ public class MetadataResolverServiceStrategy extends AbstractIdentifiableInitial
             }
         }
         
-        final List<RelyingPartyMetadataProvider> resolverList = new ArrayList<>(resolvers.size());
-        resolverList.addAll(resolvers);
-        Collections.sort(resolverList); 
+        final List<MetadataProviderContainer> containerList = new ArrayList<>(containers.size());
+        containerList.addAll(containers);
+        Collections.sort(containerList);
         final ChainingMetadataResolver chain = new ChainingMetadataResolver();
         try {
-            chain.setResolvers(resolverList);
-            chain.setId("MultiFileResolverFor:"+resolvers.size()+":Resources");
+            chain.setResolvers(containerList.stream().
+                               map(MetadataProviderContainer::getEmbeddedResolver).
+                               collect(Collectors.toList()));
+            chain.setId("MultiFileResolverFor:"+containers.size()+":Resources");
             chain.initialize();
-            final RelyingPartyMetadataProvider result = new RelyingPartyMetadataProvider();
+            final MetadataProviderContainer result = new MetadataProviderContainer();
             result.setEmbeddedResolver(chain);
             result.initialize();
             return result;
@@ -86,4 +89,4 @@ public class MetadataResolverServiceStrategy extends AbstractIdentifiableInitial
            throw new ServiceException("Chaining constructor create failed", e);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/NodeProcessingAttachingBeanPostProcessor.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/NodeProcessingAttachingBeanPostProcessor.java
index ac8da77..9cbf430 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/NodeProcessingAttachingBeanPostProcessor.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/NodeProcessingAttachingBeanPostProcessor.java
@@ -34,7 +34,6 @@ import org.springframework.beans.factory.BeanCreationException;
 import org.springframework.beans.factory.config.BeanPostProcessor;
 
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
-import net.shibboleth.idp.saml.metadata.RelyingPartyMetadataProvider;
 import net.shibboleth.idp.saml.metadata.impl.AttributeMappingNodeProcessor;
 import net.shibboleth.idp.saml.metadata.impl.ScopesNodeProcessor;
 import net.shibboleth.idp.saml.metadata.impl.UIInfoNodeProcessor;
@@ -70,8 +69,7 @@ public class NodeProcessingAttachingBeanPostProcessor implements BeanPostProcess
     // Checkstyle: CyclomaticComplexity OFF
     /** {@inheritDoc} */
     @Override public Object postProcessBeforeInitialization(final Object bean, final String beanName) {
-        if (!(bean instanceof MetadataResolver) || bean instanceof ChainingMetadataResolver
-                || bean instanceof RelyingPartyMetadataProvider) {
+        if (!(bean instanceof MetadataResolver) || bean instanceof ChainingMetadataResolver) {
             // Do not attach to beans which just include other ones.
             return bean;
         }
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataParserTest.java
index 7ef9f3d..065a2ae 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataParserTest.java
@@ -40,7 +40,6 @@ import org.testng.annotations.BeforeSuite;
 
 import net.shibboleth.ext.spring.util.ApplicationContextBuilder;
 import net.shibboleth.ext.spring.util.SpringSupport;
-import net.shibboleth.idp.saml.metadata.RelyingPartyMetadataProvider;
 import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
 
 /**
@@ -155,7 +154,7 @@ public class AbstractMetadataParserTest extends OpenSAMLInitBaseTestCase {
             return result;
         }
 
-        final RelyingPartyMetadataProvider rpProvider = context.getBean(RelyingPartyMetadataProvider.class);
+        final MetadataProviderContainer rpProvider = context.getBean(MetadataProviderContainer.class);
 
         return claz.cast(rpProvider.getEmbeddedResolver());
     }
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/DynamicHTTPMetadataProviderParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/DynamicHTTPMetadataProviderParserTest.java
index dd7c089..c2f8996 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/DynamicHTTPMetadataProviderParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/DynamicHTTPMetadataProviderParserTest.java
@@ -25,10 +25,6 @@ import java.util.Collections;
 import java.util.function.Function;
 import java.util.function.Predicate;
 
-import net.shibboleth.idp.saml.metadata.RelyingPartyMetadataProvider;
-import net.shibboleth.utilities.java.support.repository.RepositorySupport;
-import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
-
 import org.opensaml.core.criterion.EntityIdCriterion;
 import org.opensaml.core.xml.persist.FilesystemLoadSaveManager;
 import org.opensaml.core.xml.persist.XMLObjectLoadSaveManager;
@@ -45,6 +41,9 @@ import org.springframework.mock.env.MockPropertySource;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import net.shibboleth.utilities.java.support.repository.RepositorySupport;
+import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
+
 public class DynamicHTTPMetadataProviderParserTest extends AbstractMetadataParserTest {
     
     private static final String PROP_MDURL = "metadataURL";
@@ -134,8 +133,8 @@ public class DynamicHTTPMetadataProviderParserTest extends AbstractMetadataParse
         final ApplicationContext appContext = getApplicationContext("dynamicResolverContext",
                 "dynamicPersistentCacheDirectory.xml", "beans.xml", "httpClient.xml");
         
-        final RelyingPartyMetadataProvider rpProvider = 
-                appContext.getBean("dynamicPersistentCacheParamsDirectory", RelyingPartyMetadataProvider.class);
+        final MetadataProviderContainer rpProvider = 
+                appContext.getBean("dynamicPersistentCacheParamsDirectory", MetadataProviderContainer.class);
         final FunctionDrivenDynamicHTTPMetadataResolver resolver = 
                 FunctionDrivenDynamicHTTPMetadataResolver.class.cast(rpProvider.getEmbeddedResolver());
         Assert.assertNotNull(resolver);
@@ -163,8 +162,8 @@ public class DynamicHTTPMetadataProviderParserTest extends AbstractMetadataParse
         final ApplicationContext appContext = getApplicationContext("dynamicResolverContext",
                 "dynamicPersistentCacheBean.xml", "beans.xml", "httpClient.xml");
         
-        final RelyingPartyMetadataProvider rpProvider = 
-                appContext.getBean("dynamicPersistentCacheParamsBean", RelyingPartyMetadataProvider.class);
+        final MetadataProviderContainer rpProvider = 
+                appContext.getBean("dynamicPersistentCacheParamsBean", MetadataProviderContainer.class);
         final FunctionDrivenDynamicHTTPMetadataResolver resolver = 
                 FunctionDrivenDynamicHTTPMetadataResolver.class.cast(rpProvider.getEmbeddedResolver());
         Assert.assertNotNull(resolver);
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/EmptyChainService.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/EmptyChainService.java
index 441d345..5210816 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/EmptyChainService.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/EmptyChainService.java
@@ -19,15 +19,14 @@ package net.shibboleth.idp.profile.spring.relyingparty.metadata;
 
 import java.io.IOException;
 
-import net.shibboleth.idp.saml.metadata.RelyingPartyMetadataProvider;
-import net.shibboleth.utilities.java.support.service.ReloadableService;
-import net.shibboleth.utilities.java.support.service.ServiceableComponent;
-
 import org.opensaml.saml.metadata.resolver.ChainingMetadataResolver;
 import org.opensaml.saml.metadata.resolver.RefreshableMetadataResolver;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import net.shibboleth.utilities.java.support.service.ReloadableService;
+import net.shibboleth.utilities.java.support.service.ServiceableComponent;
+
 /**
  *
  */
@@ -37,8 +36,7 @@ public class EmptyChainService extends AbstractMetadataParserTest {
         final ReloadableService<RefreshableMetadataResolver> service = getBean(ReloadableService.class, "empty-chain-svc.xml");
         final ServiceableComponent<RefreshableMetadataResolver> comp = service.getServiceableComponent();
         try {
-            final RelyingPartyMetadataProvider rpmp = (RelyingPartyMetadataProvider) comp.getComponent();
-            final ChainingMetadataResolver chain = (ChainingMetadataResolver) rpmp.getEmbeddedResolver();
+            final ChainingMetadataResolver chain = (ChainingMetadataResolver) comp.getComponent();
             Assert.assertTrue(chain.getResolvers().isEmpty());
             
         } finally {
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/FilesystemMetadataParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/FilesystemMetadataParserTest.java
index 65fa08d..dbc6af4 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/FilesystemMetadataParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/FilesystemMetadataParserTest.java
@@ -28,8 +28,6 @@ import org.springframework.context.ApplicationContext;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import net.shibboleth.idp.saml.metadata.RelyingPartyMetadataProvider;
-
 public class FilesystemMetadataParserTest extends AbstractMetadataParserTest {
     
     @Test public void entity() throws Exception {
@@ -98,8 +96,8 @@ public class FilesystemMetadataParserTest extends AbstractMetadataParserTest {
         ApplicationContext appContext = getApplicationContext("filesystemResolverContext",
                 "filePredicatesOptions.xml", "beans.xml");
         
-        RelyingPartyMetadataProvider rpProvider = 
-                appContext.getBean("filePredicatesOptions", RelyingPartyMetadataProvider.class);
+        MetadataProviderContainer rpProvider = 
+                appContext.getBean("filePredicatesOptions", MetadataProviderContainer.class);
         FilesystemMetadataResolver resolver = 
                 FilesystemMetadataResolver.class.cast(rpProvider.getEmbeddedResolver());
         
@@ -116,8 +114,8 @@ public class FilesystemMetadataParserTest extends AbstractMetadataParserTest {
         ApplicationContext appContext = getApplicationContext("filesystemResolverContext",
                 "fileBadRVPO.xml", "beans.xml");
         
-        RelyingPartyMetadataProvider rpProvider = 
-                appContext.getBean("BadRVPO", RelyingPartyMetadataProvider.class);
+        MetadataProviderContainer rpProvider = 
+                appContext.getBean("BadRVPO", MetadataProviderContainer.class);
         FilesystemMetadataResolver resolver = 
                 FilesystemMetadataResolver.class.cast(rpProvider.getEmbeddedResolver());
         
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/LocalDynamicMetadataProviderParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/LocalDynamicMetadataProviderParserTest.java
index 8cd8939..1afed4e 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/LocalDynamicMetadataProviderParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/LocalDynamicMetadataProviderParserTest.java
@@ -38,7 +38,6 @@ import org.testng.annotations.Test;
 
 import com.google.common.util.concurrent.Uninterruptibles;
 
-import net.shibboleth.idp.saml.metadata.RelyingPartyMetadataProvider;
 import net.shibboleth.utilities.java.support.codec.StringDigester;
 import net.shibboleth.utilities.java.support.codec.StringDigester.OutputFormat;
 import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
@@ -116,7 +115,7 @@ public class LocalDynamicMetadataProviderParserTest extends AbstractMetadataPars
         XMLObjectLoadSaveManager<XMLObject> sourceManager = 
                 appContext.getBean("metadata.LocalDynamicSourceManager", XMLObjectLoadSaveManager.class);
 
-        RelyingPartyMetadataProvider rpProvider = appContext.getBean("localDynamicWithManagerAndGenerator", RelyingPartyMetadataProvider.class);
+        MetadataProviderContainer rpProvider = appContext.getBean("localDynamicWithManagerAndGenerator", MetadataProviderContainer.class);
         LocalDynamicMetadataResolver resolver = (LocalDynamicMetadataResolver) rpProvider.getEmbeddedResolver(); 
         
         CriteriaSet criteria = new CriteriaSet(new EntityIdCriterion(entityID));
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/metadata/RelyingPartyMetadataProvider.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/metadata/RelyingPartyMetadataProvider.java
deleted file mode 100644
index d061764..0000000
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/metadata/RelyingPartyMetadataProvider.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Licensed to the University Corporation for Advanced Internet Development,
- * Inc. (UCAID) under one or more contributor license agreements.  See the
- * NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The UCAID licenses this file to You under the Apache
- * License, Version 2.0 (the "License"); you may not use this file except in
- * compliance with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.shibboleth.idp.saml.metadata;
-
-import java.time.Instant;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Objects;
-
-import net.shibboleth.ext.spring.service.AbstractServiceableComponent;
-import net.shibboleth.utilities.java.support.annotation.ParameterName;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.logic.Constraint;
-import net.shibboleth.utilities.java.support.primitive.DeprecationSupport;
-import net.shibboleth.utilities.java.support.primitive.DeprecationSupport.ObjectType;
-import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
-import net.shibboleth.utilities.java.support.resolver.ResolverException;
-
-import org.opensaml.saml.metadata.resolver.ClearableMetadataResolver;
-import org.opensaml.saml.metadata.resolver.MetadataResolver;
-import org.opensaml.saml.metadata.resolver.RefreshableMetadataResolver;
-import org.opensaml.saml.metadata.resolver.filter.MetadataFilter;
-import org.opensaml.saml.saml2.metadata.EntityDescriptor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/**
- * This class exists primarily to allow the parsing of relying-party.xml to create a serviceable implementation of
- * {@link MetadataResolver}.
- */
-public class RelyingPartyMetadataProvider extends AbstractServiceableComponent<MetadataResolver> implements
-        RefreshableMetadataResolver, ClearableMetadataResolver, Comparable<RelyingPartyMetadataProvider> {
-
-    /** If we autogenerate a sort key it comes from this count. */
-    private static int sortKeyValue;
-
-    /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(RelyingPartyMetadataProvider.class);
-
-    /** The embedded resolver. */
-    @NonnullAfterInit private MetadataResolver resolver;
-
-    /** The key by which we sort the provider. */
-    @NonnullAfterInit private Integer sortKey;
-
-    /**
-     * Constructor.
-     * 
-     * @param child The {@link MetadataResolver} to embed.
-     * @deprecated use properties and {@link #RelyingPartyMetadataProvider()}.
-     */
-    @Deprecated public RelyingPartyMetadataProvider(
-            @Nonnull @ParameterName(name="child") final MetadataResolver child) {
-        DeprecationSupport.warnOnce(ObjectType.METHOD, "RelyingPartyMetadataProvider(MetadataResolver)", null, null);
-        resolver = Constraint.isNotNull(child, "MetadataResolver cannot be null");
-    }
-    
-    /** Constructor. */
-    public RelyingPartyMetadataProvider() {
-    }
-
-    /**
-     * Set the sort key.
-     * 
-     * @param key what to set
-     */
-    public void setSortKey(final int key) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        sortKey = key;
-    }
-    
-    /**
-     * Set the {@link MetadataResolver} to embed.
-     * 
-     * @param theResolver The {@link MetadataResolver} to embed.
-     */
-    @Nonnull public void setEmbeddedResolver(@Nonnull final MetadataResolver theResolver) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        resolver = Constraint.isNotNull(theResolver, "MetadataResolver cannot be null");
-    }
-
-    /**
-     * Return what we are build around. Used for testing.
-     * 
-     * @return the parameter we got as a constructor
-     */
-    @Nonnull public MetadataResolver getEmbeddedResolver() {
-        return resolver;
-    }
-
-    /** {@inheritDoc} */
-    @Override @Nonnull public Iterable<EntityDescriptor> resolve(@Nullable final CriteriaSet criteria)
-            throws ResolverException {
-        ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
-        return resolver.resolve(criteria);
-    }
-
-    /** {@inheritDoc} */
-    @Override @Nullable public EntityDescriptor resolveSingle(@Nullable final CriteriaSet criteria)
-            throws ResolverException {
-        ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
-        return resolver.resolveSingle(criteria);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean isRequireValidMetadata() {
-        return resolver.isRequireValidMetadata();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void setRequireValidMetadata(final boolean requireValidMetadata) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        
-        resolver.setRequireValidMetadata(requireValidMetadata);
-
-    }
-
-    /** {@inheritDoc} */
-    @Override @Nullable public MetadataFilter getMetadataFilter() {
-        return resolver.getMetadataFilter();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void setMetadataFilter(@Nullable final MetadataFilter newFilter) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        
-        resolver.setMetadataFilter(newFilter);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void doInitialize() throws ComponentInitializationException {
-        setId(resolver.getId());
-        super.doInitialize();
-        if (null == resolver) {
-            throw new ComponentInitializationException("MetadataResolver cannot be null");
-        }
-
-        if (null == sortKey) {
-            synchronized (this) {
-                sortKeyValue++;
-                sortKey = sortKeyValue;
-            }
-            log.info("Top level Metadata Provider '{}' did not have a sort key; giving it value '{}'",
-                    getId(), sortKey);
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override @Nonnull public MetadataResolver getComponent() {
-        return this;
-    }
-
-    /** {@inheritDoc} */
-    public void clear() throws ResolverException {
-        if (resolver instanceof ClearableMetadataResolver) {
-            ((ClearableMetadataResolver) resolver).clear();
-        }
-    }
-
-    /** {@inheritDoc} */
-    public void clear(final String entityID) throws ResolverException {
-        if (resolver instanceof ClearableMetadataResolver) {
-            ((ClearableMetadataResolver) resolver).clear(entityID);
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override public void refresh() throws ResolverException {
-        if (resolver instanceof RefreshableMetadataResolver) {
-            ((RefreshableMetadataResolver) resolver).refresh();
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Instant getLastRefresh() {
-        if (resolver instanceof RefreshableMetadataResolver) {
-            return ((RefreshableMetadataResolver) resolver).getLastRefresh();
-        }
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Instant getLastUpdate() {
-        if (resolver instanceof RefreshableMetadataResolver) {
-            return ((RefreshableMetadataResolver) resolver).getLastUpdate();
-        }
-        return null;
-    }
-    
-    /** {@inheritDoc} */
-    public Instant getLastSuccessfulRefresh() {
-        if (resolver instanceof RefreshableMetadataResolver) {
-            return ((RefreshableMetadataResolver) resolver).getLastSuccessfulRefresh();
-        }
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    public Boolean wasLastRefreshSuccess() {
-        if (resolver instanceof RefreshableMetadataResolver) {
-            return ((RefreshableMetadataResolver) resolver).wasLastRefreshSuccess();
-        }
-        return null;
-    }
-    
-    /** {@inheritDoc} */
-    @Override public int compareTo(final RelyingPartyMetadataProvider other) {
-        ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
-        final int result = sortKey.compareTo(other.sortKey);
-        if (result != 0) {
-            return result;
-        }
-        if (equals(other)) {
-            return 0;
-        }
-        return getId().compareTo(other.getId());
-    }
-
-    /**
-     * {@inheritDoc}. We are within a spring context and so equality can be determined by ID, however we also test by
-     * sortKey just in case.
-     */
-    @Override public boolean equals(final Object other) {
-        if (null == other) {
-            return false;
-        }
-        if (!(other instanceof RelyingPartyMetadataProvider)) {
-            return false;
-        }
-        final RelyingPartyMetadataProvider otherRp = (RelyingPartyMetadataProvider) other;
-        
-        return Objects.equals(otherRp.sortKey, sortKey) && Objects.equals(getId(), otherRp.getId());
-    }
-
-    /** {@inheritDoc} */
-    @Override public int hashCode() {
-        return com.google.common.base.Objects.hashCode(sortKey, getId());
-    }
-
-}
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/MetadataResolverServiceGaugeSet.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/MetadataResolverServiceGaugeSet.java
index 7a9302f..29d48df 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/MetadataResolverServiceGaugeSet.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/MetadataResolverServiceGaugeSet.java
@@ -40,7 +40,6 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMap.Builder;
 
 import net.shibboleth.idp.metrics.ReloadableServiceGaugeSet;
-import net.shibboleth.idp.saml.metadata.RelyingPartyMetadataProvider;
 import net.shibboleth.utilities.java.support.annotation.ParameterName;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
@@ -219,17 +218,10 @@ public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet<M
     @Nonnull @NonnullElements private Iterable<MetadataResolver> getMetadataResolvers(
             @Nonnull final MetadataResolver rootResolver) {
         
-        MetadataResolver root = rootResolver;
-        
-        // Step down into wrapping component.
-        if (root instanceof RelyingPartyMetadataProvider) {
-            root = ((RelyingPartyMetadataProvider) root).getEmbeddedResolver();
-        }
-        
-        if (root instanceof ChainingMetadataResolver) {
-            return getAllChildren((ChainingMetadataResolver) root);
+        if (rootResolver instanceof ChainingMetadataResolver) {
+            return getAllChildren((ChainingMetadataResolver) rootResolver);
         }
-        return Collections.singletonList(root);
+        return Collections.singletonList(rootResolver);
     }
 
 }
\ No newline at end of file
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ReloadMetadata.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ReloadMetadata.java
index 807bdc1..8799152 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ReloadMetadata.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ReloadMetadata.java
@@ -24,18 +24,6 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletResponse;
 
-import net.shibboleth.idp.profile.AbstractProfileAction;
-import net.shibboleth.idp.profile.context.SpringRequestContext;
-import net.shibboleth.idp.saml.metadata.RelyingPartyMetadataProvider;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.logic.Constraint;
-import net.shibboleth.utilities.java.support.resolver.ResolverException;
-import net.shibboleth.utilities.java.support.service.ReloadableService;
-import net.shibboleth.utilities.java.support.service.ServiceableComponent;
-
 import org.opensaml.profile.action.ActionSupport;
 import org.opensaml.profile.action.EventIds;
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -47,6 +35,17 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.webflow.execution.RequestContext;
 
+import net.shibboleth.idp.profile.AbstractProfileAction;
+import net.shibboleth.idp.profile.context.SpringRequestContext;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.component.ComponentSupport;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+import net.shibboleth.utilities.java.support.service.ReloadableService;
+import net.shibboleth.utilities.java.support.service.ServiceableComponent;
+
 /**
  * Action that refreshes or clears a {@link MetadataResolver} manually.
  * 
@@ -159,13 +158,7 @@ public class ReloadMetadata extends AbstractProfileAction {
 
         final ServiceableComponent<MetadataResolver> component = metadataResolverService.getServiceableComponent();
         try {
-            MetadataResolver rootResolver = component.getComponent();
-            
-            // Step down into wrapping component.
-            if (rootResolver instanceof RelyingPartyMetadataProvider) {
-                rootResolver = ((RelyingPartyMetadataProvider) rootResolver).getEmbeddedResolver(); 
-            }
-            final MetadataResolver toProcess = findProvider(rootResolver);
+            final MetadataResolver toProcess = findProvider(component.getComponent());
 
             if (toProcess != null) {
                 if (toProcess instanceof RefreshableMetadataResolver) {

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


More information about the commits mailing list