Package org.opensaml.saml.metadata.resolver

# Class ChainingMetadataResolver

java.lang.Object
net.shibboleth.shared.component.AbstractInitializableComponent
net.shibboleth.shared.component.AbstractIdentifiedInitializableComponent
net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent
org.opensaml.saml.metadata.resolver.ChainingMetadataResolver

All Implemented Interfaces:
  `Component`, `DestructableComponent`, `IdentifiableComponent`, `IdentifiedComponent`, `InitializableComponent`, `Resolver<EntityDescriptor,CriteriaSet>`, `ClearableMetadataResolver`, `MetadataResolver`, `RefreshableMetadataResolver`

public class ChainingMetadataResolver extends AbstractIdentifiableInitializableComponent implements MetadataResolver, RefreshableMetadataResolver, ClearableMetadataResolver
A metadata provider that uses registered resolvers, in turn, to answer queries. The Iterable of entity descriptors returned is the first non-null and non-empty Iterable found while iterating over the registered resolvers in resolver list order.

## Field Summary

Fields
Modifier and Type
Field
Description
`private Predicate<ProfileRequestContext>`
`activationCondition`
Activation condition.
`private DetectDuplicateEntityIDs`
`detectDuplicateEntityIDs`
Strategy for detecting duplicate entityIDs across resolvers.
`private final org.slf4j.Logger`
`log`
Class logger.
`private List<MetadataResolver>`
`resolvers`
Registered resolvers.
`private String`
`resolverType`
Resolver type.

## Constructor Summary

Constructors
Constructor
Description
`ChainingMetadataResolver()`
Constructor.

## Method Summary

Modifier and Type
Method
Description
`void`
`clear()`
Attempt to clear all data from the internal cache of the resolver.
`void`
`clear(String entityID)`
Attempt to clear data from the internal cache of the resolver for the specified entityID.
`private Set<String>`
`collectEntityIDs(Iterable<EntityDescriptor> descriptors)`
Collect the unique entityIDs from the supplied iterable of entity descriptors.
`private void`
`detectDuplicateEntityIDs(MetadataResolver resolver, CriteriaSet criteria, Set<String> resultEntityIDs, DetectDuplicateEntityIDs detectDuplicates)`
Perform duplicate entityID detection.
`Predicate<ProfileRequestContext>`
`getActivationCondition()`
Get an activation condition for this resolver.
`DetectDuplicateEntityIDs`
`getDetectDuplicateEntityIDs()`
Get the strategy for detecting duplicate entityIDs across resolvers.
`Throwable`
`getLastFailureCause()`
Gets the reason the last refresh failed.
`Instant`
`getLastRefresh()`
Gets the time the last refresh cycle occurred.
`Instant`
`getLastSuccessfulRefresh()`
Gets the time the last successful refresh cycle occurred.
`Instant`
`getLastUpdate()`
Get the time that the currently available metadata was last updated.
`MetadataFilter`
`getMetadataFilter()`
Gets the metadata filter applied to the metadata.
`List<MetadataResolver>`
`getResolvers()`
Get an immutable the list of currently registered resolvers.
`String`
`getType()`
Gets the type of resolver for reporting or logging purposes.
`boolean`
`isRequireValidMetadata()`
Gets whether the metadata returned by queries must be valid.
`void`
`refresh()`
Refresh the data exposed by the resolver.
`Iterable<EntityDescriptor>`
`resolve(CriteriaSet criteria)`
`EntityDescriptor`
`resolveSingle(CriteriaSet criteria)`
`void`
`setActivationCondition(Predicate<ProfileRequestContext> condition)`
Set an activation condition for this resolver.
`void`
`setDetectDuplicateEntityIDs(DetectDuplicateEntityIDs strategy)`
Set the strategy for detecting duplicate entityIDs across resolvers.
`void`
`setMetadataFilter(MetadataFilter newFilter)`
Sets the metadata filter applied to the metadata.
`void`
`setRequireValidMetadata(boolean requireValidMetadata)`
Sets whether the metadata returned by queries must be valid.
`void`
`setResolvers(List<? extends MetadataResolver> newResolvers)`
Set the registered metadata resolvers.
`void`
`setType(String type)`
Sets the type of this resolver for reporting/logging.
`Boolean`
`wasLastRefreshSuccess()`
Gets whether the last refresh cycle was successful.

### Methods inherited from class net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent

`setId`

### Methods inherited from class net.shibboleth.shared.component.AbstractIdentifiedInitializableComponent

`doInitialize, ensureId, getId, ifDestroyedThrowDestroyedComponentException, ifInitializedThrowUnmodifiabledComponentException, ifNotInitializedThrowUninitializedComponentException`

### Methods inherited from class net.shibboleth.shared.component.AbstractInitializableComponent

`checkComponentActive, checkSetterPreconditions, destroy, doDestroy, initialize, isDestroyed, isInitialized`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface net.shibboleth.shared.component.IdentifiedComponent

`getId`

## Field Details

### log

@Nonnull private final org.slf4j.Logger log
Class logger.

### resolverType

@Nullable @NotEmpty private String resolverType
Resolver type.

### resolvers

@Nonnull private List<MetadataResolver> resolvers
Registered resolvers.

### detectDuplicateEntityIDs

@Nonnull private DetectDuplicateEntityIDs detectDuplicateEntityIDs
Strategy for detecting duplicate entityIDs across resolvers.

### activationCondition

@Nullable private Predicate<ProfileRequestContext> activationCondition
Activation condition.

## Constructor Details

### ChainingMetadataResolver

public ChainingMetadataResolver()
Constructor.

## Method Details

### getType

@Nullable @NotEmpty public String getType()
Gets the type of resolver for reporting or logging purposes.

Specified by:
  `getType` in interface `MetadataResolver`
Returns:
  resolver type

### setType

public void setType(@Nullable @NotEmpty String type)
Sets the type of this resolver for reporting/logging.

Parameters:
  `type` - type to set
Since:
  5.0.0

### getResolvers

@Nonnull @Unmodifiable @NotLive public List<MetadataResolver> getResolvers()
Get an immutable the list of currently registered resolvers.

Returns:
  list of currently registered resolvers

### setResolvers

public void setResolvers(@Nonnull List<? extends MetadataResolver> newResolvers) throws ResolverException
Set the registered metadata resolvers.

Parameters:
  `newResolvers` - the metadata resolvers to use
Throws:
  `ResolverException` - thrown if there is a problem adding the metadata resolvers

### getDetectDuplicateEntityIDs

@Nonnull public DetectDuplicateEntityIDs getDetectDuplicateEntityIDs()
Get the strategy for detecting duplicate entityIDs across resolvers.

Returns:
  the configured strategy

### setDetectDuplicateEntityIDs

public void setDetectDuplicateEntityIDs(@Nullable DetectDuplicateEntityIDs strategy)
Set the strategy for detecting duplicate entityIDs across resolvers.

Parameters:
  `strategy` - the strategy to configure

### isRequireValidMetadata

public boolean isRequireValidMetadata()
Gets whether the metadata returned by queries must be valid.

At a minimum, metadata is valid only if the date expressed in the `validUntil` attribute of the element and all its ancestral elements has not passed. Specific implementations may add additional constraints.

Specified by:
  `isRequireValidMetadata` in interface `MetadataResolver`
Returns:
  whether the metadata returned by queries must be valid

### setRequireValidMetadata

public void setRequireValidMetadata(boolean requireValidMetadata)
Sets whether the metadata returned by queries must be valid.

Specified by:
  `setRequireValidMetadata` in interface `MetadataResolver`
Parameters:
  `requireValidMetadata` - whether the metadata returned by queries must be valid

### getMetadataFilter

@Nullable public MetadataFilter getMetadataFilter()
Gets the metadata filter applied to the metadata.

Specified by:
  `getMetadataFilter` in interface `MetadataResolver`
Returns:
  the metadata filter applied to the metadata

### setMetadataFilter

public void setMetadataFilter(@Nullable MetadataFilter newFilter)
Sets the metadata filter applied to the metadata.

Specified by:
  `setMetadataFilter` in interface `MetadataResolver`
Parameters:
  `newFilter` - the metadata filter applied to the metadata

### getActivationCondition

@Nullable public Predicate<ProfileRequestContext> getActivationCondition()
Get an activation condition for this resolver.

Returns:
  activation condition

### setActivationCondition

public void setActivationCondition(@Nullable Predicate<ProfileRequestContext> condition)
Set an activation condition for this resolver.

Parameters:
  `condition` - condition to set

### resolveSingle

@Nullable public EntityDescriptor resolveSingle(@Nullable CriteriaSet criteria) throws ResolverException

Specified by:
  `resolveSingle` in interface `Resolver<EntityDescriptor,CriteriaSet>`
Throws:
  `ResolverException`

### resolve

@Nonnull public Iterable<EntityDescriptor> resolve(@Nullable CriteriaSet criteria) throws ResolverException

Specified by:
  `resolve` in interface `Resolver<EntityDescriptor,CriteriaSet>`
Throws:
  `ResolverException`

### detectDuplicateEntityIDs

private void detectDuplicateEntityIDs(@Nonnull MetadataResolver resolver, @Nullable CriteriaSet criteria, @Nullable Set<String> resultEntityIDs, @Nonnull DetectDuplicateEntityIDs detectDuplicates)
Perform duplicate entityID detection.

Parameters:
  `resolver` - the metadata resolver over which to perform duplicate detection
  `criteria` - the current criteria set
  `resultEntityIDs` - the set of entityIDs contained in the effective results to be returned
  `detectDuplicates` - the effective strategy for duplicate detection

### collectEntityIDs

private Set<String> collectEntityIDs(@Nonnull Iterable<EntityDescriptor> descriptors)
Collect the unique entityIDs from the supplied iterable of entity descriptors.

Parameters:
  `descriptors` - the input objects
Returns:
  the unique entityIDs from the supplied descriptors

### clear

public void clear() throws ResolverException
Attempt to clear all data from the internal cache of the resolver.

Specified by:
  `clear` in interface `ClearableMetadataResolver`
Throws:
  `ResolverException` - if the clear operation was unsuccessful

### clear

public void clear(@Nonnull String entityID) throws ResolverException
Attempt to clear data from the internal cache of the resolver for the specified entityID.

Specified by:
  `clear` in interface `ClearableMetadataResolver`
Parameters:
  `entityID` - the target entityID
Throws:
  `ResolverException` - if the clear operation was unsuccessful

### refresh

public void refresh() throws ResolverException
Refresh the data exposed by the resolver.

An implementation of this method should typically be either `synchronized` or make use other locking mechanisms to protect against concurrent access.

Specified by:
  `refresh` in interface `RefreshableMetadataResolver`
Throws:
  `ResolverException` - if the refresh operation was unsuccessful

### getLastUpdate

@Nullable public Instant getLastUpdate()
Get the time that the currently available metadata was last updated. Note, this may be different than the time retrieved by `RefreshableMetadataResolver.getLastRefresh()` is the metadata was known not to have changed during the last refresh cycle. We iterate over all the children and return the earliest instant or null if one of them hasn't ever updated.

Specified by:
  `getLastUpdate` in interface `RefreshableMetadataResolver`
Returns:
  time when the currently metadata was last updated, null if metadata has never successfully been read in

### getLastRefresh

@Nullable public Instant getLastRefresh()
Gets the time the last refresh cycle occurred. We iterate over all the children and return the earliest instant or null if one of them hasn't ever refreshed.

Specified by:
  `getLastRefresh` in interface `RefreshableMetadataResolver`
Returns:
  time the last refresh cycle occurred

### getLastSuccessfulRefresh

@Nullable public Instant getLastSuccessfulRefresh()
Gets the time the last successful refresh cycle occurred. We iterate over all the children and return the earliest instant or null if one of them hasn't ever refreshed successfully.

Specified by:
  `getLastSuccessfulRefresh` in interface `RefreshableMetadataResolver`
Returns:
  time the last successful refresh cycle occurred

### wasLastRefreshSuccess

@Nullable public Boolean wasLastRefreshSuccess()
Gets whether the last refresh cycle was successful. We iterate over all children - a failure of any is a failure.

Specified by:
  `wasLastRefreshSuccess` in interface `RefreshableMetadataResolver`
Returns:
  true if last refresh cycle was successful, false if not

### getLastFailureCause

@Nullable public Throwable getLastFailureCause()
Gets the reason the last refresh failed. We iterate over all children and return the first failure we find.

Specified by:
  `getLastFailureCause` in interface `RefreshableMetadataResolver`
Returns:
  reason the last refresh failed or null if the last refresh was successful