Solved it myself, I've used karaf archetype to create bundle instead of
archetype for zk webapp. I wonder what's the
difference since I've created the same directory layout and the same
MANIFEST.MF.

Anyway, it's working fine now.


On Mon, Sep 9, 2013 at 4:54 PM, Bratislav Stojanovic <
[email protected]> wrote:

> Hi all,
>
>
> I've created a simple ZK (zkoss) webapp using Maven 2 and
> zk-archetype-webapp from
> within Eclipse. I'm trying to convert this project (WAR) into OSGi bundle
> simply by
> adding more info into maven-war-plugin like this :
>
> ...
> <plugin>
> <artifactId>maven-war-plugin</artifactId>
>  <groupId>org.apache.maven.plugins</groupId>
> <version>2.1.1</version>
> <configuration>
>  <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
> <archive>
> <manifest>
>  <addClasspath>false</addClasspath>
> </manifest>
> <manifestEntries>
>  <Bundle-ManifestVersion>2</Bundle-ManifestVersion>
> <Bundle-Name>Test :: Core :: ZK</Bundle-Name>
>  <Bundle-SymbolicName>test.core.zk</Bundle-SymbolicName>
> <Bundle-Version>1.0.0</Bundle-Version>
>  <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
> <Bundle-Activator>test.core.ZkWebappActivator</Bundle-Activator>
>
> <Import-Package>org.slf4j,javax.servlet;version="2.5.0",javax.servlet.http;version="2.5.0",javax.swing.filechooser,javax.xml.parsers,javax.xml.transform,javax.xml.transform.dom,javax.xml.transform.stream,org.w3c.dom,org.xml.sax,org.xml.sax.ext,org.xml.sax.helpers,org.osgi.framework;version="[1.5,2)"</Import-Package>
>  <Require-Bundle>zk.osgi.bundle;bundle-version="6.5.2"</Require-Bundle>
> <Bundle-Description>Core zk bundle</Bundle-Description>
>
> <Bundle-RequiredExecutionEnvironment>JavaSE-1.6</Bundle-RequiredExecutionEnvironment>
> <Web-ContextPath>/test</Web-ContextPath>
>  <Webapp-Context>/test</Webapp-Context>
> </manifestEntries>
> </archive>
>  </configuration>
> </plugin>
> ...
>
> Activator class looks like this :
>
> package test.core;
>
> import org.osgi.framework.BundleActivator;
> import org.osgi.framework.BundleContext;
> import org.osgi.framework.ServiceEvent;
> import org.osgi.framework.ServiceListener;
> import org.osgi.framework.ServiceReference;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
>
> public class ZkWebappActivator implements BundleActivator, ServiceListener
> {
>  private static final Logger logger =
> LoggerFactory.getLogger(ZkWebappActivator.class);
>  // TODO: ok to be static?
> private static BundleContext context;
> private static ServiceReference dbServiceRef;
>  private static DbService dbService;
>
> public void start(BundleContext context) throws Exception {
>  logger.info("Starting core zk bundle...");
>  ZkWebappActivator.context = context;
>  synchronized (this) {
>              // Listen for events pertaining to dictionary services.
>             context.addServiceListener(this,
>                 "(&(objectClass=" + DbService.class.getName() + ")" +
>                 "(Language=*))");
>
>             logger.info("Service listener registered");
>
>             // Query for any service references matching any language.
>             ServiceReference[] refs = context.getServiceReferences(
>                 DbService.class.getName(), "(Language=*)");
>
>             // If we found any dictionary services, then just get
>             // a reference to the first one so we can use it.
>             if (refs != null)
>             {
>             logger.info("Found DbService!");
>                 dbServiceRef = refs[0];
>                 dbService = (DbService) context.getService(dbServiceRef);
>             }
>             else {
>             logger.info("DbService reference is null!");
>             }
>         }
>  }
>
> public void stop(BundleContext context) throws Exception {
>  logger.info("Stopping core zk bundle...");
>  context.removeServiceListener(this);
>
> }
>
> public synchronized void serviceChanged(ServiceEvent event) {
>  String[] objectClass = (String[])
> event.getServiceReference().getProperty("objectClass");
>  logger.debug("serviceChanged called!");
>
>         // If a dictionary service was registered, see if we
>         // need one. If so, get a reference to it.
>         if (event.getType() == ServiceEvent.REGISTERED)
>         {
>         logger.debug("Detected registration of
> "+event.getServiceReference().getClass().getCanonicalName());
>             if (dbServiceRef == null)
>             {
>             logger.debug("Found DbService in serviceChanged!");
>                 // Get a reference to the service object.
>             dbServiceRef = event.getServiceReference();
>                 dbService = (DbService) context.getService(dbServiceRef);
>             }
>         }
>         // If a dictionary service was unregistered, see if it
>         // was the one we were using. If so, unget the service
>         // and try to query to get another one.
>         else if (event.getType() == ServiceEvent.UNREGISTERING)
>         {
>         logger.debug("Detected UN-registration of
> "+event.getServiceReference().getClass().getCanonicalName());
>             if (event.getServiceReference() == dbServiceRef)
>             {
>                 // Unget service object and null references.
>                 context.ungetService(dbServiceRef);
>                 dbServiceRef = null;
>                 dbService = null;
>
>
>             }
>         }
>  }
>
> public static DbService getDbService() {
> return dbService;
>  }
>
> }
>
> Activator class is in the WEB-INF/classes folder.
>
> *The problem : Even if the service is properly registered (I can see it
> in the webconsole), this always returns NULL!*
> *What is really interesting is that if I create a simple bundle using
> karaf-bundle-archetype and copy the same*
> *Activator, it will find the service!*
> *
> *
> *I'm using ServiceMix 4.5.2, Java 1.6.45 x64, Windows 7 x64 and Eclipse
> Juno SR2.*
>
> *What am I missing here? Thanx in advance.*
>
> --
> Bratislav Stojanovic, M.Sc.
>
>
>
> --
> Bratislav Stojanovic, M.Sc.
>



-- 
Bratislav Stojanovic, M.Sc.

Reply via email to