undertow/src/main/java/org/wildfly/extension/undertow/deployment/ServletContainerInitializerDeploymentProcessor.java
public void deploy(final DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
        final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
        final ModuleSpecification moduleSpecification = deploymentUnit.getAttachment(Attachments.MODULE_SPECIFICATION);
        final ServiceModuleLoader loader = deploymentUnit.getAttachment(Attachments.SERVICE_MODULE_LOADER);
        if (!DeploymentTypeMarker.isType(DeploymentType.WAR, deploymentUnit)) {
            return; // Skip non web deployments
        }
        WarMetaData warMetaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
        assert warMetaData != null;
        final Module module = deploymentUnit.getAttachment(Attachments.MODULE);
        if (module == null) {
            throw UndertowLogger.ROOT_LOGGER.failedToResolveModule(deploymentUnit);
        }
        final ClassLoader classLoader = module.getClassLoader();
        ScisMetaData scisMetaData = deploymentUnit.getAttachment(ScisMetaData.ATTACHMENT_KEY);
        if (scisMetaData == null) {
            scisMetaData = new ScisMetaData();
            deploymentUnit.putAttachment(ScisMetaData.ATTACHMENT_KEY, scisMetaData);
        }
        Set<ServletContainerInitializer> scis = scisMetaData.getScis();
        Set<Class<? extends ServletContainerInitializer>> sciClasses = new HashSet<>();
        if (scis == null) {
            scis = new LinkedHashSet<>();
            scisMetaData.setScis(scis);
        }
        Map<ServletContainerInitializer, Set<Class<?>>> handlesTypes = scisMetaData.getHandlesTypes();
        if (handlesTypes == null) {
            handlesTypes = new HashMap<ServletContainerInitializer, Set<Class<?>>>();
            scisMetaData.setHandlesTypes(handlesTypes);
        }
        // Find the SCIs from shared modules
        for (ModuleDependency dependency : moduleSpecification.getAllDependencies()) {
            // Should not include SCI if services is not included
            if (!dependency.isImportServices()) {
                continue;
            }
            try {
                Module depModule = loader.loadModule(dependency.getIdentifier());
                ServiceLoader<ServletContainerInitializer> serviceLoader = depModule.loadService(ServletContainerInitializer.class);
                for (ServletContainerInitializer service : serviceLoader) {
                    if(sciClasses.add(service.getClass())) {
                        scis.add(service);
                    }
                }
            } catch (ModuleLoadException e) {
                if (!dependency.isOptional()) {
                    throw UndertowLogger.ROOT_LOGGER.errorLoadingSCIFromModule(dependency.getIdentifier().toString(), e);
                }
            }
        }
        // Find local ServletContainerInitializer services
        List<String> order = warMetaData.getOrder();
        Map<String, VirtualFile> localScis = warMetaData.getScis();
        if (order != null && localScis != null) {
            for (String jar : order) {
                VirtualFile sci = localScis.get(jar);
                if (sci != null) {
                    scis.addAll(loadSci(classLoader, sci, jar, true, sciClasses));
                }
            }
        }

        //SCI's deployed in the war itself
        if(localScis != null) {
            VirtualFile warDeployedScis = localScis.get("classes");
            if(warDeployedScis != null) {
                scis.addAll(loadSci(classLoader, warDeployedScis, deploymentUnit.getName(), true, sciClasses));
            }
        }

        // Process HandlesTypes for ServletContainerInitializer
        Map<Class<?>, Set<ServletContainerInitializer>> typesMap = new HashMap<Class<?>, Set<ServletContainerInitializer>>();
        for (ServletContainerInitializer service : scis) {
            if (service.getClass().isAnnotationPresent(HandlesTypes.class)) {
                HandlesTypes handlesTypesAnnotation = service.getClass().getAnnotation(HandlesTypes.class);
                Class<?>[] typesArray = handlesTypesAnnotation.value();
                if (typesArray != null) {
                    for (Class<?> type : typesArray) {
                        Set<ServletContainerInitializer> servicesSet = typesMap.get(type);
                        if (servicesSet == null) {
                            servicesSet = new HashSet<ServletContainerInitializer>();
                            typesMap.put(type, servicesSet);
                        }
                        servicesSet.add(service);
                        handlesTypes.put(service, new HashSet<Class<?>>());
                    }
                }
            }
        }
        Class<?>[] typesArray = typesMap.keySet().toArray(new Class<?>[0]);

        final CompositeIndex index = deploymentUnit.getAttachment(Attachments.COMPOSITE_ANNOTATION_INDEX);
        if (index == null) {
            throw UndertowLogger.ROOT_LOGGER.unableToResolveAnnotationIndex(deploymentUnit);
        }
        final CompositeIndex parent;
        if(deploymentUnit.getParent() != null) {
            parent = deploymentUnit.getParent().getAttachment(Attachments.COMPOSITE_ANNOTATION_INDEX);
        } else {
            parent = null;
        }
        //WFLY-4205, look in the parent as well as the war
        CompositeIndex parentIndex = deploymentUnit.getParent() == null ? null : deploymentUnit.getParent().getAttachment(Attachments.COMPOSITE_ANNOTATION_INDEX);

        // Find classes which extend, implement, or are annotated by HandlesTypes
        for (Class<?> type : typesArray) {
            DotName className = DotName.createSimple(type.getName());
            Set<ClassInfo> classInfos = new HashSet<>();
            classInfos.addAll(processHandlesType(className, type, index, parent));
            if(parentIndex != null) {
                classInfos.addAll(processHandlesType(className, type, parentIndex, parent));
            }
            Set<Class<?>> classes = loadClassInfoSet(classInfos, classLoader);
            Set<ServletContainerInitializer> sciSet = typesMap.get(type);
            for (ServletContainerInitializer sci : sciSet) {
                handlesTypes.get(sci).addAll(classes);
            }
        }
    }
public void deploy(final DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
        final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
        final ModuleSpecification moduleSpecification = deploymentUnit.getAttachment(Attachments.MODULE_SPECIFICATION);
        final ServiceModuleLoader loader = deploymentUnit.getAttachment(Attachments.SERVICE_MODULE_LOADER);
        if (!DeploymentTypeMarker.isType(DeploymentType.WAR, deploymentUnit)) {
            return; // Skip non web deployments
        }
        WarMetaData warMetaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
        assert warMetaData != null;
        final Module module = deploymentUnit.getAttachment(Attachments.MODULE);
        if (module == null) {
            throw UndertowLogger.ROOT_LOGGER.failedToResolveModule(deploymentUnit);
        }
        final ClassLoader classLoader = module.getClassLoader();
        ScisMetaData scisMetaData = deploymentUnit.getAttachment(ScisMetaData.ATTACHMENT_KEY);
        if (scisMetaData == null) {
            scisMetaData = new ScisMetaData();
            deploymentUnit.putAttachment(ScisMetaData.ATTACHMENT_KEY, scisMetaData);
        }
        Set<ServletContainerInitializer> scis = scisMetaData.getScis();
        Set<Class<? extends ServletContainerInitializer>> sciClasses = new HashSet<>();
        if (scis == null) {
            scis = new LinkedHashSet<>();
            scisMetaData.setScis(scis);
        }
        Map<ServletContainerInitializer, Set<Class<?>>> handlesTypes = scisMetaData.getHandlesTypes();
        if (handlesTypes == null) {
            handlesTypes = new HashMap<ServletContainerInitializer, Set<Class<?>>>();
            scisMetaData.setHandlesTypes(handlesTypes);
        }
        // Find the SCIs from shared modules
        for (ModuleDependency dependency : moduleSpecification.getAllDependencies()) {
            // Should not include SCI if services is not included
            if (!dependency.isImportServices()) {
                continue;
            }
            try {
                Module depModule = loader.loadModule(dependency.getIdentifier());
                ServiceLoader<ServletContainerInitializer> serviceLoader = depModule.loadService(ServletContainerInitializer.class);
                for (ServletContainerInitializer service : serviceLoader) {
                    if(sciClasses.add(service.getClass())) {
                        scis.add(service);
                    }
                }
            } catch (ModuleLoadException e) {
                if (!dependency.isOptional()) {
                    throw UndertowLogger.ROOT_LOGGER.errorLoadingSCIFromModule(dependency.getIdentifier().toString(), e);
                }
            }
        }
        // Find local ServletContainerInitializer services
        List<String> order = warMetaData.getOrder();
        Map<String, VirtualFile> localScis = warMetaData.getScis();
        if (order != null && localScis != null) {
            for (String jar : order) {
                VirtualFile sci = localScis.get(jar);
                if (sci != null) {
                    scis.addAll(loadSci(classLoader, sci, jar, true, sciClasses));
                }
            }
        }

        //SCI's deployed in the war itself
        if(localScis != null) {
            VirtualFile warDeployedScis = localScis.get("classes");
            if(warDeployedScis != null) {
                scis.addAll(loadSci(classLoader, warDeployedScis, deploymentUnit.getName(), true, sciClasses));
            }
        }

        // Process HandlesTypes for ServletContainerInitializer
        Map<Class<?>, Set<ServletContainerInitializer>> typesMap = new HashMap<Class<?>, Set<ServletContainerInitializer>>();
        for (ServletContainerInitializer service : scis) {
            if (service.getClass().isAnnotationPresent(HandlesTypes.class)) {
                HandlesTypes handlesTypesAnnotation = service.getClass().getAnnotation(HandlesTypes.class);
                Class<?>[] typesArray = handlesTypesAnnotation.value();
                if (typesArray != null) {
                    for (Class<?> type : typesArray) {
                        Set<ServletContainerInitializer> servicesSet = typesMap.get(type);
                        if (servicesSet == null) {
                            servicesSet = new HashSet<ServletContainerInitializer>();
                            typesMap.put(type, servicesSet);
                        }
                        servicesSet.add(service);
                        handlesTypes.put(service, new HashSet<Class<?>>());
                    }
                }
            }
        }
        Class<?>[] typesArray = typesMap.keySet().toArray(new Class<?>[0]);

        final CompositeIndex index = deploymentUnit.getAttachment(Attachments.COMPOSITE_ANNOTATION_INDEX);
        if (index == null) {
            throw UndertowLogger.ROOT_LOGGER.unableToResolveAnnotationIndex(deploymentUnit);
        }
        final CompositeIndex parent;
        if(deploymentUnit.getParent() != null) {
            parent = deploymentUnit.getParent().getAttachment(Attachments.COMPOSITE_ANNOTATION_INDEX);
        } else {
            parent = null;
        }
        //WFLY-4205, look in the parent as well as the war
        CompositeIndex parentIndex = deploymentUnit.getParent() == null ? null : deploymentUnit.getParent().getAttachment(Attachments.COMPOSITE_ANNOTATION_INDEX);

        // Find classes which extend, implement, or are annotated by HandlesTypes
        for (Class<?> type : typesArray) {
            DotName className = DotName.createSimple(type.getName());
            Set<ClassInfo> classInfos = new HashSet<>();
            classInfos.addAll(processHandlesType(className, type, index, parent));
            if(parentIndex != null) {
                classInfos.addAll(processHandlesType(className, type, parentIndex, parent));
            }
            Set<Class<?>> classes = loadClassInfoSet(classInfos, classLoader);
            Set<ServletContainerInitializer> sciSet = typesMap.get(type);
            for (ServletContainerInitializer sci : sciSet) {
                handlesTypes.get(sci).addAll(classes);
            }
        }
    }
public void deploy ( final DeploymentPhaseContext phaseContext ) throws DeploymentUnitProcessingException { final DeploymentUnit deploymentUnit = phaseContext . getDeploymentUnit ( ) ; final ModuleSpecification moduleSpecification = deploymentUnit . getAttachment ( Attachments . MODULE_SPECIFICATION ) ; final ServiceModuleLoader loader = deploymentUnit . getAttachment ( Attachments . SERVICE_MODULE_LOADER ) ; if ( ! DeploymentTypeMarker . isType ( DeploymentType . WAR , deploymentUnit ) ) { return ; // Skip non web deployments } WarMetaData warMetaData = deploymentUnit . getAttachment ( WarMetaData . ATTACHMENT_KEY ) ; assert warMetaData != null ; final Module module = deploymentUnit . getAttachment ( Attachments . MODULE ) ; if ( module == null ) { throw UndertowLogger . ROOT_LOGGER . failedToResolveModule ( deploymentUnit ) ; } final ClassLoader classLoader = module . getClassLoader ( ) ; ScisMetaData scisMetaData = deploymentUnit . getAttachment ( ScisMetaData . ATTACHMENT_KEY ) ; if ( scisMetaData == null ) { scisMetaData = new ScisMetaData ( ) ; deploymentUnit . putAttachment ( ScisMetaData . ATTACHMENT_KEY , scisMetaData ) ; } Set < ServletContainerInitializer > scis = scisMetaData . getScis ( ) ; Set < Class < ? extends ServletContainerInitializer > > sciClasses = new HashSet <> ( ) ; if ( scis == null ) { scis = new LinkedHashSet <> ( ) ; scisMetaData . setScis ( scis ) ; } Map < ServletContainerInitializer , Set < Class < ? > > > handlesTypes = scisMetaData . getHandlesTypes ( ) ; if ( handlesTypes == null ) { handlesTypes = new HashMap < ServletContainerInitializer , Set < Class < ? > > > ( ) ; scisMetaData . setHandlesTypes ( handlesTypes ) ; } // Find the SCIs from shared modules for ( ModuleDependency dependency : moduleSpecification . getAllDependencies ( ) ) { // Should not include SCI if services is not included if ( ! dependency . isImportServices ( ) ) { continue ; } try { Module depModule = loader . loadModule ( dependency . getIdentifier ( ) ) ; ServiceLoader < ServletContainerInitializer > serviceLoader = depModule . loadService ( ServletContainerInitializer . class ) ; for ( ServletContainerInitializer service : serviceLoader ) { if ( sciClasses . add ( service . getClass ( ) ) ) { scis . add ( service ) ; } } } catch ( ModuleLoadException e ) { if ( ! dependency . isOptional ( ) ) { throw UndertowLogger . ROOT_LOGGER . errorLoadingSCIFromModule ( dependency . getIdentifier ( ) . toString ( ) , e ) ; } } } // Find local ServletContainerInitializer services List < String > order = warMetaData . getOrder ( ) ; Map < String , VirtualFile > localScis = warMetaData . getScis ( ) ; if ( order != null && localScis != null ) { for ( String jar : order ) { VirtualFile sci = localScis . get ( jar ) ; if ( sci != null ) { scis . addAll ( loadSci ( classLoader , sci , jar , true , sciClasses ) ) ; } } } //SCI's deployed in the war itself if ( localScis != null ) { VirtualFile warDeployedScis = localScis . get ( "classes" ) ; if ( warDeployedScis != null ) { scis . addAll ( loadSci ( classLoader , warDeployedScis , deploymentUnit . getName ( ) , true , sciClasses ) ) ; } } // Process HandlesTypes for ServletContainerInitializer Map < Class < ? > , Set < ServletContainerInitializer > > typesMap = new HashMap < Class < ? > , Set < ServletContainerInitializer > > ( ) ; for ( ServletContainerInitializer service : scis ) { if ( service . getClass ( ) . isAnnotationPresent ( HandlesTypes . class ) ) { HandlesTypes handlesTypesAnnotation = service . getClass ( ) . getAnnotation ( HandlesTypes . class ) ; Class < ? > [ ] typesArray = handlesTypesAnnotation . value ( ) ; if ( typesArray != null ) { for ( Class < ? > type : typesArray ) { Set < ServletContainerInitializer > servicesSet = typesMap . get ( type ) ; if ( servicesSet == null ) { servicesSet = new HashSet < ServletContainerInitializer > ( ) ; typesMap . put ( type , servicesSet ) ; } servicesSet . add ( service ) ; handlesTypes . put ( service , new HashSet < Class < ? > > ( ) ) ; } } } } Class < ? > [ ] typesArray = typesMap . keySet ( ) . toArray ( new Class < ? > [ 0 ] ) ; final CompositeIndex index = deploymentUnit . getAttachment ( Attachments . COMPOSITE_ANNOTATION_INDEX ) ; if ( index == null ) { throw UndertowLogger . ROOT_LOGGER . unableToResolveAnnotationIndex ( deploymentUnit ) ; } final CompositeIndex parent ; if ( deploymentUnit . getParent ( ) != null ) { parent = deploymentUnit . getParent ( ) . getAttachment ( Attachments . COMPOSITE_ANNOTATION_INDEX ) ; } else { parent = null ; } //WFLY-4205, look in the parent as well as the war CompositeIndex parentIndex = deploymentUnit . getParent ( ) == null ? null : deploymentUnit . getParent ( ) . getAttachment ( Attachments . COMPOSITE_ANNOTATION_INDEX ) ; // Find classes which extend, implement, or are annotated by HandlesTypes for ( Class < ? > type : typesArray ) { DotName className = DotName . createSimple ( type . getName ( ) ) ; Set < ClassInfo > classInfos = new HashSet <> ( ) ; classInfos . addAll ( processHandlesType ( className , type , index , parent ) ) ; if ( parentIndex != null ) { classInfos . addAll ( processHandlesType ( className , type , parentIndex , parent ) ) ; } Set < Class < ? > > classes = loadClassInfoSet ( classInfos , classLoader ) ; Set < ServletContainerInitializer > sciSet = typesMap . get ( type ) ; for ( ServletContainerInitializer sci : sciSet ) { handlesTypes . get ( sci ) . addAll ( classes ) ; } } }
Process SCIs.
Process SCIs .