private boolean createServlet()

in src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java [231:325]


    private boolean createServlet(
            final Servlet servlet,
            final javax.servlet.Servlet javaxServlet,
            final ServiceReference<Servlet> reference) {
        // check for a name, this is required
        final String name = getName(reference);

        // check for Sling properties in the service registration
        final ServletResourceProvider srProvider = servletResourceProviderFactory.create(reference, servlet);
        if (srProvider == null) {
            // this is expected if the servlet is not destined for Sling
            return false;
        }

        // initialize now
        try {
            final SlingServletConfig servletConfig = new SlingServletConfig(servletContext, reference, name);
            if (javaxServlet != null) {
                javaxServlet.init(new JavaxSlingServletConfig(servletConfig));
            } else {
                servlet.init(servletConfig);
            }
            logger.debug("bindServlet: Servlet {} initialized", name);
        } catch (final ServletException ce) {
            logger.error(
                    "bindServlet: Servlet " + ServletResourceProviderFactory.getServiceReferenceInfo(reference)
                            + " failed to initialize",
                    ce);
            return false;
        } catch (final Throwable t) { // NOSONAR
            logger.error(
                    "bindServlet: Unexpected problem initializing servlet "
                            + ServletResourceProviderFactory.getServiceReferenceInfo(reference),
                    t);
            return false;
        }

        boolean registered = false;
        final Bundle bundle = reference.getBundle();
        if (bundle != null) {
            final BundleContext bundleContext = bundle.getBundleContext();
            if (bundleContext != null) {
                final List<ServiceRegistration<ResourceProvider<Object>>> regs = new ArrayList<>();
                try {
                    if (this.provider != null) {
                        this.provider.add(srProvider, reference);
                        if (pathProviders) {
                            outer:
                            for (final String path : srProvider.getServletPaths()) {
                                String root =
                                        path.indexOf('/', 1) != -1 ? path.substring(0, path.indexOf('/', 1) + 1) : path;
                                for (ServiceRegistration<?> reg : providerRegs) {
                                    if (root.equals(reg.getReference().getProperty(ResourceProvider.PROPERTY_ROOT))) {
                                        continue outer;
                                    }
                                }
                                final Dictionary<String, Object> params = new Hashtable<>();
                                params.put(ResourceProvider.PROPERTY_ROOT, root);
                                params.put(Constants.SERVICE_DESCRIPTION, "ServletResourceProvider for Servlets");
                                params.put(ResourceProvider.PROPERTY_MODE, ResourceProvider.MODE_PASSTHROUGH);
                                providerRegs.add(context.registerService(ResourceProvider.class, provider, params));
                            }
                        }
                        resolutionCaches.values().forEach(ResolutionCache::flushCache);
                    } else {
                        for (final String root : srProvider.getServletPaths()) {
                            @SuppressWarnings("unchecked")
                            final ServiceRegistration<ResourceProvider<Object>> reg =
                                    (ServiceRegistration<ResourceProvider<Object>>) bundleContext.registerService(
                                            ResourceProvider.class.getName(),
                                            srProvider,
                                            createServiceProperties(reference, root));
                            regs.add(reg);
                        }
                    }
                    registered = true;
                } catch (final IllegalStateException ise) {
                    // bundle context not valid anymore - ignore and continue without this
                }
                if (registered) {
                    if (logger.isDebugEnabled()) {
                        logger.debug("Registered {}", srProvider);
                    }
                    synchronized (this.servletsByReference) {
                        servletsByReference.put(reference, new ServletReg(servlet, regs, srProvider));
                    }
                }
            }
        }
        if (!registered) {
            logger.debug("bindServlet: servlet has been unregistered in the meantime. Ignoring {}", name);
        }

        return true;
    }