public void load()

in meecrowave-core/src/main/java/org/apache/meecrowave/cxf/JAXWSCdiExtension.java [83:147]


        public void load(@Observes final AfterDeploymentValidation afterDeploymentValidation, final BeanManager beanManager) {
            if (!active || serviceBeans.isEmpty() ||
                    !Configuration.class.cast(beanManager.getReference(beanManager.resolve(beanManager.getBeans(Configuration.class)), Configuration.class, null))
                                             .isJaxwsSupportIfAvailable()) {
                return;
            }

            final Bean<?> busBean = beanManager.resolve(beanManager.getBeans("cxf"));
            final org.apache.cxf.Bus bus = org.apache.cxf.Bus.class.cast(beanManager.getReference(
                    busBean, org.apache.cxf.Bus.class, beanManager.createCreationalContext(busBean)));

            final Bean<?> mapperBean = beanManager.resolve(beanManager.getBeans(JAXWSAddressMapper.class));
            final JAXWSAddressMapper mapper;
            if (mapperBean == null) {
                mapper = type -> {
                    WsMapping wsMapping = type.getAnnotation(WsMapping.class);
                    return wsMapping != null
                            ? wsMapping.value()
                            : "/webservices/" + type.getSimpleName();
                };
            } else {
                mapper = JAXWSAddressMapper.class.cast(beanManager.getReference(mapperBean, JAXWSAddressMapper.class, beanManager.createCreationalContext(mapperBean)));
            }

            serviceBeans.forEach(bean -> {
                final Class<?> beanClass = OwbBean.class.isInstance(bean) ? OwbBean.class.cast(bean).getReturnType() : bean.getBeanClass();

                final ClassLoader loader = Thread.currentThread().getContextClassLoader();
                try {
                    final org.apache.cxf.endpoint.AbstractEndpointFactory aef = org.apache.cxf.endpoint.AbstractEndpointFactory.class.cast(
                            loader.loadClass("org.apache.cxf.jaxws.JaxWsServerFactoryBean").getConstructor().newInstance());
                    aef.setBus(bus);
                    aef.setAddress(mapper.map(beanClass));

                    final Class<? extends org.apache.cxf.endpoint.AbstractEndpointFactory> factoryClass = aef.getClass();
                    factoryClass.getMethod("setStart", boolean.class).invoke(aef, true);
                    factoryClass.getMethod("setServiceClass", Class.class).invoke(aef, beanClass);

                    final CreationalContext<Object> creationalContext = beanManager.createCreationalContext(null);
                    if (!beanManager.isNormalScope(bean.getScope())) {
                        preShutdownTasks.add(creationalContext::release);
                    }
                    factoryClass.getMethod("setServiceBean", Object.class).invoke(aef, beanManager.getReference(bean, Object.class, creationalContext));

                    final Object server = factoryClass.getMethod("create").invoke(aef);

                    final Class<?> serverClass = server.getClass();
                    serverClass.getMethod("start").invoke(server);
                    preShutdownTasks.add(() -> {
                        try {
                            serverClass.getMethod("destroy").invoke(server);
                        } catch (final NoClassDefFoundError | NoSuchMethodException | IllegalAccessException e) {
                            throw new IllegalStateException(e);
                        } catch (final InvocationTargetException e) {
                            throw new IllegalStateException(e.getCause());
                        }
                    });
                } catch (final NoClassDefFoundError | ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException e) {
                    throw new IllegalStateException(e);
                } catch (final InvocationTargetException e) {
                    throw new IllegalStateException(e.getCause());
                }
            });
            serviceBeans.clear();
        }