package org.jboss.test.osgi.example.jaxrs.bundle; import javax.annotation.Resource; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import org.jboss.logging.Logger; import org.jboss.test.osgi.example.api.Echo; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.framework.BundleReference; import org.osgi.framework.ServiceReference; @Path("/rest") @Consumes({ "application/json" }) @Produces({ "application/json" }) public class SimpleRestEndpoint { private static final Logger log = Logger.getLogger(SimpleRestEndpoint.class); @Resource private BundleContext context; @GET @Path("/echo/{message}") public String echo(@PathParam("message") String message) { return getEchoService().echo(message); } private Echo getEchoService() { if (context == null) { log.warnf("BundleContext not injected"); context = getBundleContextFromClass(Echo.class); } ServiceReference<Echo> sref = context.getServiceReference(Echo.class); return context.getService(sref); } private BundleContext getBundleContextFromClass(Class<?> clazz) { BundleReference bref = (BundleReference) clazz.getClassLoader(); Bundle bundle = bref.getBundle(); if (bundle.getState() != Bundle.ACTIVE) { try { bundle.start(); } catch (BundleException ex) { log.errorf(ex, "Cannot start bundle: %s", bundle); } } return bundle.getBundleContext(); } }