Home / Class/ ChannelInitializerExtensions Class — netty Architecture

ChannelInitializerExtensions Class — netty Architecture

Architecture documentation for the ChannelInitializerExtensions class in ChannelInitializerExtensions.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  0aa447fe_97b1_f1a0_eb76_9ecf6f5dcc64["ChannelInitializerExtensions"]
  cb29dc4b_6558_3149_3d50_2eedc0d4495a["ChannelInitializerExtensions.java"]
  0aa447fe_97b1_f1a0_eb76_9ecf6f5dcc64 -->|defined in| cb29dc4b_6558_3149_3d50_2eedc0d4495a
  d168ed28_259d_fc41_3c7c_282c491da8f4["ChannelInitializerExtensions()"]
  0aa447fe_97b1_f1a0_eb76_9ecf6f5dcc64 -->|method| d168ed28_259d_fc41_3c7c_282c491da8f4
  6827123f_cb1e_696a_d42a_879a12db7365["extensions()"]
  0aa447fe_97b1_f1a0_eb76_9ecf6f5dcc64 -->|method| 6827123f_cb1e_696a_d42a_879a12db7365

Relationship Graph

Source Code

transport/src/main/java/io/netty/bootstrap/ChannelInitializerExtensions.java lines 33–127

abstract class ChannelInitializerExtensions {
    private static final InternalLogger logger = InternalLoggerFactory.getInstance(ChannelInitializerExtensions.class);
    private static volatile ChannelInitializerExtensions implementation;

    private ChannelInitializerExtensions() {
    }

    /**
     * Get the configuration extensions, which is a no-op implementation by default,
     * or a service-loading implementation if the {@code io.netty.bootstrap.extensions} system property is
     * {@code serviceload}.
     */
    static ChannelInitializerExtensions getExtensions() {
        ChannelInitializerExtensions impl = implementation;
        if (impl == null) {
            synchronized (ChannelInitializerExtensions.class) {
                impl = implementation;
                if (impl != null) {
                    return impl;
                }
                String extensionProp = SystemPropertyUtil.get(ChannelInitializerExtension.EXTENSIONS_SYSTEM_PROPERTY);
                logger.debug("-Dio.netty.bootstrap.extensions: {}", extensionProp);
                if ("serviceload".equalsIgnoreCase(extensionProp)) {
                    impl = new ServiceLoadingExtensions(true);
                } else if ("log".equalsIgnoreCase(extensionProp)) {
                    impl = new ServiceLoadingExtensions(false);
                } else {
                    impl = new EmptyExtensions();
                }
                implementation = impl;
            }
        }
        return impl;
    }

    /**
     * Get the list of available extensions. The list is unmodifiable.
     */
    abstract Collection<ChannelInitializerExtension> extensions(ClassLoader cl);

    private static final class EmptyExtensions extends ChannelInitializerExtensions {
        @Override
        Collection<ChannelInitializerExtension> extensions(ClassLoader cl) {
            return Collections.emptyList();
        }
    }

    private static final class ServiceLoadingExtensions extends ChannelInitializerExtensions {
        private final boolean loadAndCache;

        private WeakReference<ClassLoader> classLoader;
        private Collection<ChannelInitializerExtension> extensions;

        ServiceLoadingExtensions(boolean loadAndCache) {
            this.loadAndCache = loadAndCache;
        }

        @SuppressWarnings("AssignmentOrReturnOfFieldWithMutableType")
        @Override
        synchronized Collection<ChannelInitializerExtension> extensions(ClassLoader cl) {
            ClassLoader configured = classLoader == null ? null : classLoader.get();
            if (configured == null || configured != cl) {
                Collection<ChannelInitializerExtension> loaded = serviceLoadExtensions(loadAndCache, cl);
                classLoader = new WeakReference<ClassLoader>(cl);
                extensions = loadAndCache ? loaded : Collections.<ChannelInitializerExtension>emptyList();
            }
            return extensions;
        }

        private static Collection<ChannelInitializerExtension> serviceLoadExtensions(boolean load, ClassLoader cl) {
            List<ChannelInitializerExtension> extensions = new ArrayList<ChannelInitializerExtension>();

            ServiceLoader<ChannelInitializerExtension> loader = ServiceLoader.load(
                    ChannelInitializerExtension.class, cl);
            for (ChannelInitializerExtension extension : loader) {
                extensions.add(extension);
            }

            if (!extensions.isEmpty()) {
                Collections.sort(extensions, new Comparator<ChannelInitializerExtension>() {
                    @Override

Frequently Asked Questions

What is the ChannelInitializerExtensions class?
ChannelInitializerExtensions is a class in the netty codebase, defined in transport/src/main/java/io/netty/bootstrap/ChannelInitializerExtensions.java.
Where is ChannelInitializerExtensions defined?
ChannelInitializerExtensions is defined in transport/src/main/java/io/netty/bootstrap/ChannelInitializerExtensions.java at line 33.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free