2009/1/30 Vinicius Carvalho <[email protected]> > Wow!!! Finally :D > > Thanks all, I finally got it working :D > > We still have the HttpService activator being called by system bundle. but > follwoing Stuart's and Neil's advice, just adding org.osgi.http.service to > the org.osgi.framework.system.packages.extra did the trick :) >
excellent news! btw, when you have a situation where a bundle can't see something but you can see it in the console (like a service) then it's worth thinking about class visibility, especially when you're embedding the framework and accessing services from both inside and outside. Now my bundle that register a servlet have access to the httpservice > > Thanks a bunch :D > > Regards > > On Thu, Jan 29, 2009 at 6:02 PM, Vinicius Carvalho < > [email protected]> wrote: > > > > > > > On Thu, Jan 29, 2009 at 5:30 PM, Neil Bartlett <[email protected] > >wrote: > > > >> Further to Stuart's email, it would be interesting to see how your > >> tracking bundle is getting the HttpService class. Do you import the > >> org.osgi.service.http package using Import-Package? If so, which > >> bundle is supplying the export? > > > > > > Well, the system-bundle, at least I think from the console output: > > > > System Bundle (0) provides: > > --------------------------- > > objectClass = org.osgi.service.startlevel.StartLevel > > service.id = 1 > > ---- > > objectClass = org.osgi.service.packageadmin.PackageAdmin > > service.id = 2 > > ---- > > objectClass = org.osgi.service.http.HttpService > > service.description = Equinox Servlet Bridge > > service.id = 39 > > service.vendor = Eclipse.org > > > > > >> > >> > >> It seems like you're using the Equinox servlet bridge, which has a > >> parameter "extendedFrameworkExports". You set this in the web.xml of > >> the WAR and it should contain a list of packages to be exported by the > >> system bundle. Then they can be imported in the usual way by any other > >> bundle. > > > > > > Well, that's the point, we are not using the ServletBridge Servlet > > (org.eclipse.equinox.servletbridge.BridgeServlet) > > > > We have our own. > > > > > >> > >> > >> You may have better luck asking about this in the Equinox newgroups or > >> mailing lists, since your problem seems to be quite specific to the > >> Equinox servlet bridge rather than Felix or OSGi in general. > >> > >> Regards > >> Neil > >> > > > > Yeah, I'm giving a try there as well, sorry, folks here seems to be more > > helpful > > > > Regards > > > >> > >> On Thu, Jan 29, 2009 at 7:16 PM, Stuart McCulloch <[email protected]> > >> wrote: > >> > 2009/1/30 Vinicius Carvalho <[email protected]> > >> > > >> >> Well, we got stuck again :( > >> >> > >> >> Here's the dilema: > >> >> > >> >> We need the ProxyServlet to handle requests, so it is loaded from > >> >> webappclassloader, so we need the equinox jar in our web-inf/lib > >> >> We need the Activator from equinox to get started outside the > >> >> webappclassloader, it has to be loaded by context classloader > >> >> > >> >> So we have this: > >> >> > >> >> WEB-INF/ > >> >> lib/ > >> >> equinox-servlet.jar > >> >> > >> >> bundles/ > >> >> equinox-servlet.jar > >> >> > >> >> > >> >> Now, the problem happens here: > >> >> > >> >> ProxyServlet (from equinox) calls > >> >> Activator.addProxyServlet(this) > >> >> > >> >> The method: > >> >> > >> >> static synchronized void addProxyServlet(ProxyServlet proxyServlet) { > >> >> ServiceRegistration registration = null; > >> >> if (context != null) > >> >> registration = registerHttpService(proxyServlet); > >> >> > >> >> serviceRegistrations.put(proxyServlet, registration); > >> >> } > >> >> > >> >> > >> >> Ok, of course the damn context will be null, ProxyServlet was loaded > by > >> >> webappclassloader whereas the Activator was started by our > >> >> contextclassloader > >> >> > >> >> So, no way we get HttpService registred this way. > >> >> > >> >> The other way around: > >> >> > >> >> Having our servlet starting equinox Activator: > >> >> > >> >> Well now we do have an HttpService installed as service but... It > comes > >> >> from > >> >> a differente classloader :( and can't be used by our bundles. > >> >> > >> >> I guess we hit a dead end here? Is there a solution for this? > >> >> > >> > > >> > if you're embedding an OSGi framework inside another container (like a > >> > web-app) and want to use the same container classloader for a > particular > >> > package then there are a couple of framework properties you can use to > >> > either: > >> > > >> > a) expose packages through the system bundle > >> > (org.osgi.framework.system.packages) > >> > > >> > or > >> > > >> > b) expose packages through bootdelegation > >> > (org.osgi.framework.bootdelegation) > >> > > >> > your bundles will then get wired to the container classloader (not the > >> local > >> > bundle) for the named package(s) > >> > > >> > this blog has a good write up of both approaches: > >> > > >> > > >> > > >> > http://blog.springsource.com/2009/01/19/exposing-the-boot-classpath-in-osgi/ > >> > > >> > HTH - I'd write a bit more but it's getting late here... > >> > > >> > > >> >> Regards > >> >> > >> >> > >> >> > >> >> On Thu, Jan 29, 2009 at 3:25 PM, Richard S. Hall < > [email protected] > >> >> >wrote: > >> >> > >> >> > Vinicius Carvalho wrote: > >> >> > > >> >> >> Sorry for the mess. Neil, I was just mentioning that you left a > post > >> at > >> >> my > >> >> >> twitter a month ago. I read both books, and they are equally > great. > >> Some > >> >> >> things better in one, others in other. I do recommend everyone to > >> get > >> >> both > >> >> >> of em :) > >> >> >> > >> >> >> > >> >> > > >> >> > Don't worry, it's just Neil (he's British). ;-) > >> >> > > >> >> > -> richard > >> >> > > >> >> > On Thu, Jan 29, 2009 at 3:01 PM, Richard S. Hall < > >> [email protected] > >> >> >> >wrote: > >> >> >> > >> >> >> > >> >> >> > >> >> >>> Neil Bartlett wrote: > >> >> >>> > >> >> >>> > >> >> >>> > >> >> >>>> Hi Vinicius, > >> >> >>>> > >> >> >>>> Glad to help, and thanks for your kind comments about my book. > >> >> >>>> > >> >> >>>> However I think it's the authors of "OSGi in Action" who are > >> asking > >> >> >>>> for a book review at the moment, since they have just released > >> some > >> >> >>>> chapters for early access. They are on this mailing list so can > >> >> >>>> probably clarify. My book is "OSGi in Practice". Yes, these two > >> titles > >> >> >>>> are confusingly similar... my defence is that I started writing > my > >> >> >>>> book first! > >> >> >>>> > >> >> >>>> > >> >> >>>> > >> >> >>>> > >> >> >>> We aren't asking for a book review, but there was some review > >> recently > >> >> on > >> >> >>> DZone about the early access release from a few weeks back. > >> >> >>> > >> >> >>> Regarding the titles, we didn't really choose the title per se, > but > >> "X > >> >> in > >> >> >>> Action" and even "X in Practice" titles are both Manning > Publishing > >> >> >>> series > >> >> >>> books from what I understand. So you be the judge. ;-) > >> >> >>> > >> >> >>> -> richard > >> >> >>> > >> >> >>> Kind regards, > >> >> >>> > >> >> >>> > >> >> >>>> Neil > >> >> >>>> > >> >> >>>> On Thu, Jan 29, 2009 at 4:45 PM, Vinicius Carvalho > >> >> >>>> <[email protected]> wrote: > >> >> >>>> > >> >> >>>> > >> >> >>>> > >> >> >>>> > >> >> >>>>> Bullseye! Thanks Neil. I've tested and got a ClassCastException > >> ... > >> >> >>>>> > >> >> >>>>> We'll look into our code and check why is this happening. We've > >> just > >> >> >>>>> tried, > >> >> >>>>> and in a debug breakpoint we've seen that the service returned > >> by: > >> >> >>>>> HttpService httpService = (HttpService) > >> >> >>>>> context.getService(reference); > >> >> >>>>> > >> >> >>>>> Was indeed HttpServiceImpl, I guess we have a classloader > >> problem. We > >> >> >>>>> have > >> >> >>>>> the equinox servletbridge inside webinf/lib, hence it's loaded > by > >> >> >>>>> WebApplicationClassLoader. Since this bundle is loaded by > >> >> >>>>> ContextClassLoader > >> >> >>>>> that might be the problem, we don't know. > >> >> >>>>> > >> >> >>>>> I'll look into it. Thanks a lot for your help, it gave us hope > >> again > >> >> :) > >> >> >>>>> > >> >> >>>>> I owe you a book review (from your message at twitter.com). > I've > >> >> >>>>> finished > >> >> >>>>> you book btw, best chapter is chapter 6 (concurrency is a > subject > >> >> that > >> >> >>>>> is > >> >> >>>>> not very well explained in most books, which is a shame since > it > >> lead > >> >> >>>>> to > >> >> >>>>> really annoying problems) Promise to write a few lines of > revuew > >> to > >> >> you > >> >> >>>>> soon. > >> >> >>>>> > >> >> >>>>> Regards > >> >> >>>>> > >> >> >>>>> > >> >> >>>>> On Thu, Jan 29, 2009 at 11:57 AM, Neil Bartlett < > >> >> [email protected] > >> >> >>>>> > >> >> >>>>> > >> >> >>>>>> wrote: > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>> > >> >> >>>>> > >> >> >>>>> > >> >> >>>>>> It's possible that the HttpService published in the service > >> registry > >> >> >>>>>> is not compatible with your bundle that is trying to track it. > >> This > >> >> >>>>>> could happen if you have multiple bundles exporting the > >> >> >>>>>> org.osgi.service.http package, or if your tracking bundle has > >> >> somehow > >> >> >>>>>> included the org.osgi.service.http package instead of > importing > >> it. > >> >> >>>>>> > >> >> >>>>>> To check if this is the case, try changing the start() method > of > >> >> your > >> >> >>>>>> Activator to call httpServiceTracker.open(true) rather than > just > >> >> >>>>>> httpServiceTracker.open(). This will force the tracker to find > >> all > >> >> >>>>>> HttpServices, even the incompatible ones. Of course you will > >> soon > >> >> get > >> >> >>>>>> a ClassCastException when you try to use the returned service, > >> so > >> >> you > >> >> >>>>>> need to fix the underlying problem. Doing this will simply > tell > >> you > >> >> if > >> >> >>>>>> that is indeed the problem. > >> >> >>>>>> > >> >> >>>>>> Regards, > >> >> >>>>>> Neil > >> >> >>>>>> > >> >> >>>>>> On Thu, Jan 29, 2009 at 1:48 PM, Vinicius Carvalho > >> >> >>>>>> <[email protected]> wrote: > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>>> Hello all, sorry for always comming back on the same subject, > >> but > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>> tomorrow > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>>> is our deadline, and even we got some progress on the osgi > >> front > >> >> with > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>> spring > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>>> (we now have services and dependency injection working). > >> Nothing > >> >> >>>>>>> seems > >> >> >>>>>>> to > >> >> >>>>>>> work on the HttpService integration. > >> >> >>>>>>> > >> >> >>>>>>> We tried almost everything to get equinox running inside a > >> servlet > >> >> >>>>>>> container. The documentation on equinox servlet bridge is > >> almost > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>> inexistent. > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>>> We are not using their servletbridge since it starts the osgi > >> >> >>>>>>> container > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>> and > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>>> that is something we are doing in our code (following the > sling > >> >> >>>>>>> approach) > >> >> >>>>>>> > >> >> >>>>>>> What seems to be happening is that any service tracker > >> registered > >> >> to > >> >> >>>>>>> HttpService never gets called, ever... We've seen this on the > >> >> >>>>>>> OsgiManager > >> >> >>>>>>> class, and now we decided to drop our own little servlet > >> bundle: > >> >> >>>>>>> > >> >> >>>>>>> public class Activator implements BundleActivator { > >> >> >>>>>>> private ServiceTracker httpServiceTracker; > >> >> >>>>>>> > >> >> >>>>>>> public void start(BundleContext context) throws Exception { > >> >> >>>>>>> httpServiceTracker = new HttpServiceTracker(context); > >> >> >>>>>>> httpServiceTracker.open(); > >> >> >>>>>>> > >> >> >>>>>>> } > >> >> >>>>>>> > >> >> >>>>>>> public void stop(BundleContext arg0) throws Exception { > >> >> >>>>>>> httpServiceTracker.close(); > >> >> >>>>>>> httpServiceTracker = null; > >> >> >>>>>>> } > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> private class HttpServiceTracker extends ServiceTracker { > >> >> >>>>>>> > >> >> >>>>>>> public HttpServiceTracker(BundleContext context) { > >> >> >>>>>>> super(context, HttpService.class.getName(), null); > >> >> >>>>>>> } > >> >> >>>>>>> > >> >> >>>>>>> public Object addingService(ServiceReference reference) > { > >> >> >>>>>>> HttpService httpService = (HttpService) > >> >> >>>>>>> context.getService(reference); > >> >> >>>>>>> try { > >> >> >>>>>>> httpService.registerServlet("/dummy", new > >> >> >>>>>>> DummyServlet(), > >> >> >>>>>>> null, null); //$NON-NLS-1$ > >> >> >>>>>>> } catch (Exception e) { > >> >> >>>>>>> e.printStackTrace(); > >> >> >>>>>>> } > >> >> >>>>>>> return httpService; > >> >> >>>>>>> } > >> >> >>>>>>> > >> >> >>>>>>> public void removedService(ServiceReference reference, > >> Object > >> >> >>>>>>> service) { > >> >> >>>>>>> HttpService httpService = (HttpService) service; > >> >> >>>>>>> httpService.unregister("/dummy"); //$NON-NLS-1$ > >> >> >>>>>>> super.removedService(reference, service); > >> >> >>>>>>> } > >> >> >>>>>>> } > >> >> >>>>>>> } > >> >> >>>>>>> > >> >> >>>>>>> Well, the adding servlet never gets called :( > >> >> >>>>>>> > >> >> >>>>>>> Here how we start the felix container: > >> >> >>>>>>> > >> >> >>>>>>> public void init() throws ServletException { > >> >> >>>>>>> ServletContextResourceProvider rp = new > >> >> >>>>>>> ServletContextResourceProvider(getServletContext()); > >> >> >>>>>>> Logger logger = new > >> ServletContextLogger(getServletContext()); > >> >> >>>>>>> Map<Object, Object> props = loadProperties(); > >> >> >>>>>>> this.osl = new OSL(rp,props,logger); > >> >> >>>>>>> this.delegatee = new HttpServiceServlet(); > >> >> >>>>>>> this.delegatee.init(getServletConfig()); > >> >> >>>>>>> > >> >> >>>>>>> super.init(); > >> >> >>>>>>> } > >> >> >>>>>>> > >> >> >>>>>>> public class OSL implements BundleActivator { > >> >> >>>>>>> > >> >> >>>>>>> private Felix felix; > >> >> >>>>>>> private ReadWriteLock felixLock; > >> >> >>>>>>> private ResourceProvider resourceProvider; > >> >> >>>>>>> private Logger logger; > >> >> >>>>>>> private BundleActivator httpServiceActivator; > >> >> >>>>>>> > >> >> >>>>>>> public OSL(ResourceProvider rp, Map<Object, Object> props, > >> Logger > >> >> >>>>>>> logger){ > >> >> >>>>>>> this.resourceProvider = rp; > >> >> >>>>>>> this.logger = logger; > >> >> >>>>>>> List<BundleActivator> activators = new > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>> ArrayList<BundleActivator>(); > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>>> activators.add(this); > >> >> >>>>>>> activators.add(new BootstrapInstaller(logger,rp)); > >> >> >>>>>>> props.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>> activators); > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>>> Felix tmpFelix = new Felix(props); > >> >> >>>>>>> try { > >> >> >>>>>>> tmpFelix.start(); > >> >> >>>>>>> this.felix = tmpFelix; > >> >> >>>>>>> } catch (Exception e) { > >> >> >>>>>>> e.printStackTrace(); > >> >> >>>>>>> } > >> >> >>>>>>> } > >> >> >>>>>>> > >> >> >>>>>>> public void start(BundleContext context) throws Exception { > >> >> >>>>>>> this.httpServiceActivator = new Activator(); > >> >> >>>>>>> this.httpServiceActivator.start(context); > >> >> >>>>>>> > >> >> >>>>>>> } > >> >> >>>>>>> > >> >> >>>>>>> As you can see, we are starting the Httpservice ourselves, we > >> tried > >> >> >>>>>>> to > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>> not > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>>> do so and pack it with the other bundles, but the effect is > the > >> >> same > >> >> >>>>>>> (do > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>> not > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>>> call the addingservice) > >> >> >>>>>>> > >> >> >>>>>>> After the complete startup we have these services: > >> >> >>>>>>> > >> >> >>>>>>> System Bundle (0) provides: > >> >> >>>>>>> --------------------------- > >> >> >>>>>>> org.osgi.service.startlevel.StartLevel > >> >> >>>>>>> org.osgi.service.packageadmin.PackageAdmin > >> >> >>>>>>> org.osgi.service.http.HttpService > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> So I guess the HttpService is up and running. > >> >> >>>>>>> > >> >> >>>>>>> Is there anything else that we could do? Any other point to > >> look > >> >> at, > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>> replace > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>>> class, packaging format, anything please. Tomorrow if we > don't > >> >> >>>>>>> present > >> >> >>>>>>> at > >> >> >>>>>>> least one servlet (we needed at least the GWT-RPC working but > >> one > >> >> >>>>>>> servlet > >> >> >>>>>>> should do it), we may have to drop osgi for good, and that's > >> >> >>>>>>> something > >> >> >>>>>>> we > >> >> >>>>>>> are really not willing to do :( > >> >> >>>>>>> > >> >> >>>>>>> Regards > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>>> > >> >> >>>>>> > >> >> --------------------------------------------------------------------- > >> >> >>>>>> To unsubscribe, e-mail: [email protected] > >> >> >>>>>> For additional commands, e-mail: [email protected] > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>>> > >> >> >>>>> > >> --------------------------------------------------------------------- > >> >> >>>> To unsubscribe, e-mail: [email protected] > >> >> >>>> For additional commands, e-mail: [email protected] > >> >> >>>> > >> >> >>>> > >> >> >>>> > >> >> >>>> > >> >> >>>> > >> >> >>> > >> --------------------------------------------------------------------- > >> >> >>> To unsubscribe, e-mail: [email protected] > >> >> >>> For additional commands, e-mail: [email protected] > >> >> >>> > >> >> >>> > >> >> >>> > >> >> >>> > >> >> >> > >> >> >> > >> >> >> > >> >> > > >> >> > > --------------------------------------------------------------------- > >> >> > To unsubscribe, e-mail: [email protected] > >> >> > For additional commands, e-mail: [email protected] > >> >> > > >> >> > > >> >> > >> > > >> > > >> > > >> > -- > >> > Cheers, Stuart > >> > > >> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: [email protected] > >> For additional commands, e-mail: [email protected] > >> > >> > > > -- Cheers, Stuart

