Class ChainingMetadataResolver

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

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 Details

    • log

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

      @Nonnull @NonnullElements private List<MetadataResolver> resolvers
      Registered resolvers.
    • detectDuplicateEntityIDs

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

    • ChainingMetadataResolver

      public ChainingMetadataResolver()
      Constructor.
  • Method Details

    • getResolvers

      @Nonnull @NonnullElements @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 @NonnullElements 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

      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(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
    • 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, @Nonnull 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 -
      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(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

      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

      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

      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
    • doInitialize

      protected void doInitialize() throws ComponentInitializationException
      Overrides:
      doInitialize in class AbstractIdentifiedInitializableComponent
      Throws:
      ComponentInitializationException
    • doDestroy

      protected void doDestroy()
      Overrides:
      doDestroy in class AbstractInitializableComponent