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();
}