See the pseudo code as below. During OSGI bundle activation we want to register 
the org.apache.cxf.transport.servlet.CXFServlet servlet with the whiteboard 
pattern, get the cxf bus returned from the servlet and set it as the default 
bus of BusFactory, and after that publish the endpoints by calling 
javax.xml.ws.Endpoint.publish(). By doing this we can receive SOAP calls from 
HP devices and also send SOAP calls to HP devices.

In our old product we registered the CXFServlet servlet by calling 
httpService.registerServlet(…), the cxf bus retrieved from the CXFServlet was 
not null (which was actually an org.apache.cxf.bus.spring.SpringBus object), 
and the communication with HP device was always fine. Due to the OSGI version 
upgrading for our product we change to use the whiteboard pattern to do the 
registration and we notice the returned cxf bus from the CXFServlet is null 
after calling bundleContext.registerService(…) , and also, the published 
endpoints are not there for listening.  We are trying to find a solution. The 
experimentations showed the way to make it work is to get the 
org.osgi.service.http.HttpService reference ready first, and then call 
bundleContext.registerService(…) to register the CXFServlet. With this way the 
returned cxf bus is not null anymore and the communication between the web 
server and HP device is fine.

As per tests and experimentations, the OSGI HttpService instance seems to be 
lazy started. In order to get the org.osgi.service.http.HttpService reference 
ready (which is actually an  
org.apache.felix.http.base.internal.service.PerBundleHttpServiceImpl object), 
there has to be a web request sent to the web server. For example, in the code 
make a web request to the web server itself. But, this does not seem to be 
elegant . ) Is there any other way to make the OSGI HttpService reference ready 
before calling bundleContext.registerService()?

... ...
import javax.servlet.Servlet;
import javax.xml.ws.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.transport.http.osgi.HTTPTransportActivator;
import org.apache.cxf.transport.servlet.CXFServlet;
... ...

@Component(service = { HPOmniWebServicePublishComponent.class })
public class HPOmniWebServicePublishComponent implements IWebComponent {
    ... ...
    private HTTPTransportActivator httpTransportActivator = new 
HTTPTransportActivator();
    ... ...

    @Activate
    public void activate(ComponentContext ctx)
    {
         try {
            // Set value for keystore and keystore password
                ... ...
            System.setProperty("javax.net.ssl.keyStore", keyStoreLocation);
            System.setProperty("javax.net.ssl.keyStorePassword", password);
            ... ...
            httpTransportActivator.start(ctx.getBundleContext());
        } catch (NoClassDefFoundError | Exception exception) {
            // Log error for starting HTTPTransportActivator
        }
        … …
        ClassLoader currentcl = Thread.currentThread().getContextClassLoader();
        try {
            // set classloader to CXF bundle class loader to avoid OSGi 
classloader problems
            ClassLoader bundlecl = BusFactory.class.getClassLoader();
            Thread.currentThread().setContextClassLoader(bundlecl);
            ... ...
            System.setProperty("javax.xml.ws.spi.Provider", 
"org.apache.cxf.jaxws.spi.ProviderImpl");
            … …
            org.apache.cxf.transport.servlet.CXFServlet servlet = new 
org.apache.cxf.transport.servlet.CXFServlet();
            BundleContext bundleContext = ctx.getBundleContext();
            params.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, 
ApplicationFactory.SERVICE_BASE_PATH);
            params.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, 
"(osgi.http.whiteboard.context.name=org.osgi.service.http)");
           cxfServletRegistration = 
bundleContext.registerService(Servlet.class, servlet, params); // Register the 
org.apache.cxf.transport.servlet.CXFServlet servlet

            org.apache.cxf.Bus bus = servlet.getBus(); // The returned 
org.apache.cxf.Bus bus is always null if we didn’t get OSGI HttpService 
reference ready before calling bundleContext.registerService(Servlet.class, 
servlet, params);
            BusFactory.setDefaultBus(bus); //org.apache.cxf.BusFactory

            // Publishe endpoints for specified implementors
           Endpoint.publish("/HPOmniWebAuthenticationAgentService", 
jaxwsAuthenticationAgent);
           ... ...


Thanks.
Justin Li

Reply via email to