The LifecycleInterceptorTestCase deployes a bundle that contains some metadata and an interceptor bundle that processes the metadata and registeres an http endpoint from it. The idea is that the bundle does not process its own metadata. Instead this work is delegated to some specialized metadata processor (i.e. the interceptor).
Each interceptor is itself registered as a service. This is the well known Whiteboard Pattern .
public class InterceptorActivator implements BundleActivator { public void start(BundleContext context) { LifecycleInterceptor publisher = new PublisherInterceptor(); LifecycleInterceptor parser = new ParserInterceptor(); // Add the interceptors, the order of which is handles by the service context.registerService(LifecycleInterceptor.class.getName(), publisher, null); context.registerService(LifecycleInterceptor.class.getName(), parser, null); } }
public class ParserInterceptor extends AbstractLifecycleInterceptor { ParserInterceptor() { // Add the provided output addOutput(HttpMetadata.class); } public void invoke(int state, InvocationContext context) { // Do nothing if the metadata is already available HttpMetadata metadata = context.getAttachment(HttpMetadata.class); if (metadata != null) return; // Parse and create metadta on STARTING if (state == Bundle.STARTING) { VirtualFile root = context.getRoot(); VirtualFile propsFile = root.getChild("/http-metadata.properties"); if (propsFile != null) { log.info("Create and attach HttpMetadata"); metadata = createHttpMetadata(propsFile); context.addAttachment(HttpMetadata.class, metadata); } } } ... }
public class PublisherInterceptor extends AbstractLifecycleInterceptor { PublisherInterceptor() { // Add the required input addInput(HttpMetadata.class); } public void invoke(int state, InvocationContext context) { // HttpMetadata is guaratied to be available because we registered // this type as required input HttpMetadata metadata = context.getAttachment(HttpMetadata.class); // Register HttpMetadata on STARTING if (state == Bundle.STARTING) { String servletName = metadata.getServletName(); // Load the endpoint servlet from the bundle Bundle bundle = context.getBundle(); Class servletClass = bundle.loadClass(servletName); HttpServlet servlet = (HttpServlet)servletClass.newInstance(); // Register the servlet with the HttpService HttpService httpService = getHttpService(context, true); httpService.registerServlet("/servlet", servlet, null, null); } // Unregister the endpoint on STOPPING else if (state == Bundle.STOPPING) { log.info("Unpublish HttpMetadata: " + metadata); HttpService httpService = getHttpService(context, false); if (httpService != null) httpService.unregister("/servlet"); } } }