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