blob: d43eec78d73d401db402479f41b753f1f290352b [file] [log] [blame]
package org.apache.geronimo.microprofile.opentracing.tck.setup;
import static java.util.stream.Collectors.toMap;
import java.lang.reflect.Field;
import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
import org.apache.cxf.cdi.extension.JAXRSServerFactoryCustomizationExtension;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
import org.apache.cxf.message.Message;
@ApplicationScoped
public class CxfCdiWorkaround implements JAXRSServerFactoryCustomizationExtension {
@Override
public void customize(final JAXRSServerFactoryBean bean) {
final Map<Class<?>, ResourceProvider> providers = getProviders(bean);
final Map<Class<?>, ResourceProvider> workaround = providers.entrySet().stream()
.collect(toMap(Map.Entry::getKey, e -> new WorkaroundProvider(e.getValue())));
providers.clear();
providers.putAll(workaround);
}
private Map<Class<?>, ResourceProvider> getProviders(final JAXRSServerFactoryBean bean) {
try {
final Field f = JAXRSServerFactoryBean.class.getDeclaredField("resourceProviders");
f.setAccessible(true);
return (Map<Class<?>, ResourceProvider>) f.get(bean);
} catch (final Exception e) {
throw new IllegalStateException(e);
}
}
private static class WorkaroundProvider implements ResourceProvider {
private final ResourceProvider delegate;
private WorkaroundProvider(final ResourceProvider value) {
this.delegate = value;
}
@Override
public Object getInstance(final Message m) {
return delegate.getInstance(m);
}
@Override
public void releaseInstance(final Message m, final Object o) {
// no-op: don't release otherwise we are not thread safe for @Dependent, this leaks but ok in *this* context
}
@Override
public Class<?> getResourceClass() {
return delegate.getResourceClass();
}
@Override
public boolean isSingleton() {
return true;
}
}
}