public T createEndpoint()

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