Well digging a little bit more, I found this:
I'm putting the equinox servlet as a bundle: so the class:
org.eclipse.equinox.http.servlet.internal.Activator gets started:
public void start(BundleContext context) throws Exception {
startHttpServiceProxy(context);
}
private static synchronized void startHttpServiceProxy(BundleContext
bundleContext) {
context = bundleContext;
Object[] proxyServlets = serviceRegistrations.keySet().toArray();
for (int i = 0; i < proxyServlets.length; ++i) {
ServiceRegistration registration =
registerHttpService((ProxyServlet) proxyServlets[i]);
serviceRegistrations.put(proxyServlets[i], registration);
}
}
Well it assigns the bundlecontext to its internal variable, so far so good.
Problem is when I create the HTTPProxyServlet:
this.delegatee = new HttpServiceServlet();
this.delegatee.init(getServletConfig());
And it gets initiated:
public void init(ServletConfig config) throws ServletException {
super.init(config);
proxyContext = new ProxyContext(config.getServletContext());
Activator.addProxyServlet(this);
}
The Activator is called in a static way, the addProxyServlet methods checks
for a bundlecontext which is null :(, so it never calls the
registerHttpService, which in turns never triggers the Tracker from the
webconsole.
Anyone got a solution for this please?
Regards
On Mon, Jan 19, 2009 at 6:48 PM, Vinicius Carvalho <
[email protected]> wrote:
> Well, I fixed the project a bit, removed the servlet-api and add a property
> org.osgi.framework.system.packages.extra = javax.servlet, javax.servlet.http
> to Felix startup properties.
>
> But still no success. So I decided to go to the source code.
>
> Well, it seems that the webconsole service tracker HttpServiceTracker never
> gets its addingService method called. So it does not bind itself.
>
> One thing I found my self lost (again) is that the Sling implementation
> starts an HttpService, what about the HttpServiceImpl which register the
> proxy servlet? Isn't this one the one to be instantiated?
>
> Regards
>
>
> On Fri, Jan 16, 2009 at 4:53 PM, Felix Meschberger <[email protected]>wrote:
>
>> Hi Vinicius,
>>
>> Vinicius Carvalho schrieb:
>> > Well, still can't get it to work :(
>>
>> To bad ...
>>
>> >
>> > Here's my web structure:
>> >
>> > web-inf/
>> > -web.xml
>> > -lib/
>> > org.apache.felix.framework-1.4.1.jar
>> > org.eclipse.osgi.services.jar
>> > org.osgi.compendium.jar
>> > org.osgi.core.jar
>> > org.osgi.foundation.jar
>> > org.eclipse.equinox.servlet-1.0.1.jar
>> > -resources/
>> > -bundles/
>> > org.apache.felix.configadmin.jar
>> > org.apache.felix.metatype.jar
>> > org.apache.felix.webconsole.jar
>> > org.eclipse.osgi.services.jar
>> > -corebundles/
>> > servlet-api.osg1-2.5.jar
>>
>> Notes: servlet-api is not required in a servlet container environment,
>> since this api is provided by the container and should be injected
>> through the system bundle. The osgi.services jar should probably not be
>> place in the lib and the bundles folder, one location should do it.
>>
>> I suggest to add an OSGi LogService implementation bundle, such that you
>> get logging of OSGi events as well as the web console itself (and others).
>>
>> From the classes below, I can unfortunately not tell you exactly, why
>> this does not work.
>>
>> If you could send me your web application directly (off-list), I could
>> try to find out, what exactly is going on here.
>>
>> Regards
>> Felix
>>
>> >
>> >
>> > Well, here's the serlvet that boots the system (got it from sling)
>> >
>> > package org.openspotlight.core.loader;
>> >
>> > import java.io.IOException;
>> > import java.net.MalformedURLException;
>> > import java.net.URL;
>> > import java.util.Collections;
>> > import java.util.HashMap;
>> > import java.util.Iterator;
>> > import java.util.Map;
>> > import java.util.Set;
>> >
>> > import javax.servlet.GenericServlet;
>> > import javax.servlet.Servlet;
>> > import javax.servlet.ServletContext;
>> > import javax.servlet.ServletException;
>> > import javax.servlet.ServletRequest;
>> > import javax.servlet.ServletResponse;
>> > import javax.servlet.http.HttpServletResponse;
>> >
>> > import org.apache.felix.framework.Logger;
>> > import org.eclipse.equinox.http.servlet.HttpServiceServlet;
>> > import org.osgi.framework.BundleException;
>> > import org.osgi.framework.ServiceReference;
>> >
>> > public class OSLServlet extends GenericServlet {
>> >
>> > private OSL osl;
>> > private Servlet delegatee;
>> >
>> > @Override
>> > public void service(ServletRequest req, ServletResponse res)
>> > throws ServletException, IOException {
>> > Servlet delegatee = getDelegatee();
>> > if (delegatee == null) {
>> > ((HttpServletResponse)
>> > res).sendError(HttpServletResponse.SC_NOT_FOUND);
>> > } else {
>> > delegatee.service(req, res);
>> > }
>> > }
>> > @Override
>> > public void init() throws ServletException {
>> > ServletContextResourceProvider rp = new
>> > ServletContextResourceProvider(getServletContext());
>> > Logger logger = new ServletContextLogger(getServletContext());
>> > Map<String, String> props = new HashMap<String, String>();
>> > this.osl = new OSL(rp,props,logger);
>> > this.delegatee = new HttpServiceServlet();
>> > this.delegatee.init(getServletConfig());
>> > super.init();
>> > }
>> >
>> >
>> > @Override
>> > public void destroy() {
>> > if(this.delegatee != null){
>> > this.delegatee.destroy();
>> > this.delegatee = null;
>> > }
>> >
>> > if(this.osl != null){
>> > osl.destroy();
>> > this.osl = null;
>> > }
>> > super.destroy();
>> > }
>> >
>> > public Servlet getDelegatee(){
>> > return this.delegatee;
>> > }
>> >
>> >
>> >
>> > }
>> >
>> >
>> > Here's the bridge (OSL) also got from Sling:
>> >
>> > package org.openspotlight.core.loader;
>> >
>> > import java.util.ArrayList;
>> > import java.util.HashMap;
>> > import java.util.List;
>> > import java.util.Map;
>> > import java.util.concurrent.locks.ReadWriteLock;
>> >
>> > import org.apache.felix.framework.Felix;
>> > import org.apache.felix.framework.Logger;
>> > import org.apache.felix.framework.util.FelixConstants;
>> > import org.eclipse.equinox.http.servlet.internal.Activator;
>> > import org.osgi.framework.BundleActivator;
>> > import org.osgi.framework.BundleContext;
>> > import org.osgi.framework.BundleException;
>> >
>> > 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<String, String> props, Logger
>> > logger){
>> > this.resourceProvider = rp;
>> > this.logger = logger;
>> > List<BundleActivator> activators = new
>> ArrayList<BundleActivator>();
>> > activators.add(this);
>> > activators.add(new BootstrapInstaller(logger,rp));
>> > Map configMap = new HashMap();
>> > configMap.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP,
>> > activators);
>> > felix = new Felix(configMap);
>> > try {
>> > felix.start();
>> > } catch (Exception e) {
>> > e.printStackTrace();
>> > }
>> > }
>> >
>> > public void start(BundleContext context) throws Exception {
>> > this.httpServiceActivator = new Activator();
>> > this.httpServiceActivator.start(context);
>> >
>> > }
>> >
>> > public void stop(BundleContext context) throws Exception {
>> > try {
>> > this.httpServiceActivator.stop(context);
>> > } catch (Exception e) {
>> > e.printStackTrace();
>> > }
>> > this.httpServiceActivator = null;
>> > }
>> >
>> > public void destroy(){
>> > if (felix != null) {
>> > logger.log(Logger.LOG_INFO, "Shutting down OSL");
>> > try {
>> > felix.stop();
>> > } catch (BundleException e) {
>> > // TODO Auto-generated catch block
>> > e.printStackTrace();
>> > }
>> > logger.log(Logger.LOG_INFO, "Sling stopped");
>> > felix = null;
>> > }
>> > }
>> >
>> > }
>> >
>> >
>> > Well, I get this messages at console when starting up:
>> >
>> > 16:14:17,887 ERROR [STDERR] *DEBUG* Scheduling task ManagedService
>> Update:
>> > pid=org.apache.felix.webconsole.internal.servlet.OsgiManager
>> > 16:14:17,888 ERROR [STDERR] *DEBUG* Running task ManagedService Update:
>> > pid=org.apache.felix.webconsole.internal.servlet.OsgiManager
>> >
>> > But when I access: localhost:8080/osl/system/console It does not find
>> the
>> > service. Looking at the ServletProxy source I found that there was no
>> > registrations in the class.
>> >
>> > Also, the first time I start the framework (after cleaning the cache
>> dir) I
>> > only find the system bundle. If I redeploy the war, it finds all the
>> bundles
>> > on the second time.
>> >
>> > Any ideas?
>> >
>> > Regards
>> >
>> >
>> > On Fri, Jan 16, 2009 at 11:33 AM, Carsten Ziegeler <
>> [email protected]>wrote:
>> >
>> >> Vinicius Carvalho wrote:
>> >>> Thanks Felix that really helped, just a couple of more questions :)
>> >>>
>> >>> 1- Do I need to launch the container from a servlet (I was doing from
>> a
>> >>> Listener)
>> >>> 2- So, this servlet must be mapped to /* url, just like the Sling
>> does?
>> >>>
>> >> You can map the servlet to any path, like /myosgi - the web console is
>> >> then by default reachable at /myosgi/system/console.
>> >>
>> >> HTH
>> >> Carsten
>> >> --
>> >> Carsten Ziegeler
>> >> [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]
>>
>>
>