diff options
Diffstat (limited to 'osgi-integration/src/main/java')
-rw-r--r-- | osgi-integration/src/main/java/com/vaadin/osgi/servlet/VaadinServletRegistration.java | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/osgi-integration/src/main/java/com/vaadin/osgi/servlet/VaadinServletRegistration.java b/osgi-integration/src/main/java/com/vaadin/osgi/servlet/VaadinServletRegistration.java index d7ec6289ce..4ab1cf1505 100644 --- a/osgi-integration/src/main/java/com/vaadin/osgi/servlet/VaadinServletRegistration.java +++ b/osgi-integration/src/main/java/com/vaadin/osgi/servlet/VaadinServletRegistration.java @@ -48,9 +48,9 @@ import com.vaadin.server.VaadinServlet; * * @since 8.1 */ -@Component(immediate = true) +@Component public class VaadinServletRegistration { - private Map<Long, ServiceRegistration<?>> registeredServlets = Collections + private final Map<ServiceReference<VaadinServlet>, ServiceRegistration<Servlet>> registeredServlets = Collections .synchronizedMap(new LinkedHashMap<>()); private static final String MISSING_ANNOTATION_MESSAGE_FORMAT = "The property '%s' must be set in a '%s' without the '%s' annotation!"; @@ -64,19 +64,18 @@ public class VaadinServletRegistration { private LogService logService; @Reference(cardinality = ReferenceCardinality.MULTIPLE, service = VaadinServlet.class, policy = ReferencePolicy.DYNAMIC) - void bindVaadinServlet(ServiceReference<VaadinServlet> reference) + void bindVaadinServlet(VaadinServlet servlet, ServiceReference<VaadinServlet> reference) throws ResourceBundleInactiveException { log(LogService.LOG_WARNING, "VaadinServlet Registration"); - BundleContext bundleContext = reference.getBundle().getBundleContext(); - Hashtable<String, Object> properties = getProperties(reference); - VaadinServlet servlet = bundleContext.getService(reference); + Hashtable<String, Object> properties = getProperties(reference); WebServlet annotation = servlet.getClass() .getAnnotation(WebServlet.class); - if (!validateSettings(annotation, properties)) + if (!validateSettings(annotation, properties)) { return; + } properties.put(VAADIN_RESOURCES_PARAM, getResourcePath()); if (annotation != null) { @@ -85,17 +84,13 @@ public class VaadinServletRegistration { Boolean.toString(annotation.asyncSupported())); } + // We register the Http Whiteboard servlet using the context of + // the bundle which registered the Vaadin Servlet, not our own + BundleContext bundleContext = reference.getBundle().getBundleContext(); ServiceRegistration<Servlet> servletRegistration = bundleContext .registerService(Servlet.class, servlet, properties); - Long serviceId = getServiceId(reference); - registeredServlets.put(serviceId, servletRegistration); - - bundleContext.ungetService(reference); - } - private Long getServiceId(ServiceReference<VaadinServlet> reference) { - return (Long) reference - .getProperty(org.osgi.framework.Constants.SERVICE_ID); + registeredServlets.put(reference, servletRegistration); } private boolean validateSettings(WebServlet annotation, @@ -128,12 +123,18 @@ public class VaadinServletRegistration { } } - void unbindVaadinServlet(ServiceReference<VaadinServlet> servletRef) { - Long serviceId = getServiceId(servletRef); + void unbindVaadinServlet(ServiceReference<VaadinServlet> reference) { ServiceRegistration<?> servletRegistration = registeredServlets - .remove(serviceId); + .remove(reference); if (servletRegistration != null) { - servletRegistration.unregister(); + try { + servletRegistration.unregister(); + } catch (IllegalStateException ise) { + // This service may have already been unregistered + // automatically by the OSGi framework if the + // application bundle is being stopped. This is + // obviously not a problem for us. + } } } |