private boolean createServlet()

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


    private boolean createServlet(final Servlet servlet, 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 {
            servlet.init(new SlingServletConfig(servletContext, reference, name));
            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;
    }