Class MutableExtensionRegistry

  • All Implemented Interfaces:
    ExtensionRegistrar, ExtensionRegistry

    @API(status=INTERNAL,
         since="5.5")
    public class MutableExtensionRegistry
    extends java.lang.Object
    implements ExtensionRegistry, ExtensionRegistrar
    Default, mutable implementation of ExtensionRegistry.

    A registry has a reference to its parent registry, and all lookups are performed first in the current registry itself and then recursively in its ancestors.

    Since:
    5.5
    • Field Detail

      • logger

        private static final Logger logger
      • DEFAULT_EXTENSIONS

        private static final java.util.List<Extension> DEFAULT_EXTENSIONS
      • registeredExtensionTypes

        private final java.util.Set<java.lang.Class<? extends Extension>> registeredExtensionTypes
      • registeredExtensions

        private final java.util.List<Extension> registeredExtensions
    • Method Detail

      • createRegistryWithDefaultExtensions

        public static MutableExtensionRegistry createRegistryWithDefaultExtensions​(JupiterConfiguration configuration)
        Factory for creating and populating a new root registry with the default extensions.

        If the Constants.EXTENSIONS_AUTODETECTION_ENABLED_PROPERTY_NAME configuration parameter has been set to true, extensions will be auto-detected using Java's ServiceLoader mechanism and automatically registered after the default extensions.

        Parameters:
        configuration - configuration parameters used to retrieve the extension auto-detection flag; never null
        Returns:
        a new ExtensionRegistry; never null
      • registerAutoDetectedExtensions

        private static void registerAutoDetectedExtensions​(MutableExtensionRegistry extensionRegistry)
      • createRegistryFrom

        public static MutableExtensionRegistry createRegistryFrom​(MutableExtensionRegistry parentRegistry,
                                                                  java.util.stream.Stream<java.lang.Class<? extends Extension>> extensionTypes)
        Factory for creating and populating a new registry from a list of extension types and a parent registry.
        Parameters:
        parentRegistry - the parent registry
        extensionTypes - the types of extensions to be registered in the new registry
        Returns:
        a new ExtensionRegistry; never null
      • streamLocal

        private <E extends Extension> java.util.stream.Stream<E> streamLocal​(java.lang.Class<E> extensionType)
        Stream all Extensions of the specified type that are present in this registry.

        Extensions in ancestors are ignored.

        Parameters:
        extensionType - the type of Extension to stream
        See Also:
        ExtensionRegistry.getReversedExtensions(Class)
      • registerExtension

        public void registerExtension​(java.lang.Class<? extends Extension> extensionType)
        Description copied from interface: ExtensionRegistrar
        Instantiate an extension of the given type using its default constructor and register it in the registry.

        A new Extension should not be registered if an extension of the given type already exists in the registry or a parent registry.

        Specified by:
        registerExtension in interface ExtensionRegistrar
        Parameters:
        extensionType - the type of extension to register
      • isAlreadyRegistered

        private boolean isAlreadyRegistered​(java.lang.Class<? extends Extension> extensionType)
        Determine if the supplied type is already registered in this registry or in a parent registry.
      • registerExtension

        public void registerExtension​(Extension extension,
                                      java.lang.Object source)
        Description copied from interface: ExtensionRegistrar
        Register the supplied Extension, without checking if an extension of that type has already been registered.

        Semantics for Source

        If an extension is registered declaratively via @ExtendWith, the source and the extension should be the same object. However, if an extension is registered programmatically via @RegisterExtension, the source object should be the Field that is annotated with @RegisterExtension. Similarly, if an extension is registered programmatically as a lambda expression or method reference, the source object should be the underlying Method that implements the extension API.

        Specified by:
        registerExtension in interface ExtensionRegistrar
        Parameters:
        extension - the extension to register; never null
        source - the source of the extension; never null
      • registerDefaultExtension

        private void registerDefaultExtension​(Extension extension)
      • registerAutoDetectedExtension

        private void registerAutoDetectedExtension​(Extension extension)
      • registerLocalExtension

        private void registerLocalExtension​(Extension extension)
      • registerExtension

        private void registerExtension​(java.lang.String category,
                                       Extension extension)
      • registerExtension

        private void registerExtension​(java.lang.String category,
                                       Extension extension,
                                       java.lang.Object source)
      • buildSourceInfo

        private java.lang.String buildSourceInfo​(java.lang.Object source)