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