in jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/cxf/CxfJaxrsServiceRegistrator.java [201:282]
public <T> T createEndpoint(Application app, Class<T> endpointType) {
// final JAXRSServerFactoryBean bean = ResourceUtils.createApplication(app, false, false, false, null);
final JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean();
Set<Object> singletons = app.getSingletons();
if (!singletons.isEmpty() && singletons.stream().map(Object::getClass).count() < singletons.size()) {
throw new IllegalArgumentException("More than one instance of the same singleton class is available: " + singletons);
}
final List<Class<?>> resourceClasses = new ArrayList<>();
final List<Object> providers = new ArrayList<>();
final List<org.apache.cxf.feature.Feature> features = new ArrayList<>();
final Map<Class<?>, ResourceProvider> map = new HashMap<>();
// Note, app.getClasses() returns a list of per-request classes
// or singleton provider classes
for (Class<?> cls : app.getClasses()) {
if (!cls.isInterface() && !Modifier.isAbstract(cls.getModifiers())) {
if (isProvider(cls)) {
providers.add(ResourceUtils.createProviderInstance(cls));
} else if (org.apache.cxf.feature.Feature.class.isAssignableFrom(cls)) {
features.add(ResourceUtils.createFeatureInstance(cls.asSubclass(org.apache.cxf.feature.Feature.class)));
} else {
resourceClasses.add(cls);
/* todo: support singleton provider otherwise perfs can be a shame
if (useSingletonResourceProvider) {
map.put(cls, new SingletonResourceProvider(ResourceUtils.createProviderInstance(cls)));
} else {
*/
map.put(cls, new PerRequestResourceProvider(cls));
}
}
}
// we can get either a provider or resource class here
for (final Object o : singletons) {
if (isProvider(o.getClass())) {
providers.add(o);
} else if (o instanceof org.apache.cxf.feature.Feature) {
features.add((org.apache.cxf.feature.Feature) o);
} else {
final Class<?> unwrapped = Proxies.unwrap(o.getClass());
resourceClasses.add(unwrapped);
map.put(unwrapped, new SingletonResourceProvider(o));
}
}
String address = "/";
/* spec ignores @ApplicationPath
ApplicationPath appPath = ResourceUtils.locateApplicationPath(app.getClass());
if (appPath != null) {
address = appPath.value();
}
if (!address.startsWith("/")) {
address = "/" + address;
}
*/
bean.setAddress(address);
bean.setStaticSubresourceResolution(false);
bean.setResourceClasses(resourceClasses);
bean.setProviders(providers);
bean.getFeatures().addAll(features);
for (Map.Entry<Class<?>, ResourceProvider> entry : map.entrySet()) {
bean.setResourceProvider(entry.getKey(), entry.getValue());
}
Map<String, Object> appProps = app.getProperties();
if (appProps != null) {
bean.getProperties(true).putAll(appProps);
}
bean.setApplication(app);
if (_bus != null) {
bean.setBus(_bus);
}
if (JAXRSServerFactoryBean.class.isAssignableFrom(endpointType)) {
return endpointType.cast(bean);
}
bean.setApplication(app);
bean.setStart(false);
final Server server = bean.create();
return endpointType.cast(server);
}