I have built a simple maven project for learning but I am stuck. I generated a 
bundle that contains api and implementation and a DAO service. The dao service 
(CarService) provides methods to create and select car entities (simple 
entities with just a name field as id). I dropped the generated bundle into 
karaf (4.2.1-SNAPSHOT) and it seems to run:

8<----------

karaf@root()> bundle:services 198

jpa Bundle (198) provides:
--------------------------
[javax.persistence.EntityManagerFactory]
[org.apache.aries.jpa.supplier.EmSupplier]
[javax.persistence.EntityManager]
[org.apache.aries.jpa.template.JpaTemplate]
[org.osgi.service.cm.ManagedService]
[org.osgi.service.jpa.EntityManagerFactoryBuilder]
[aries.example.api.CarService]
karaf@root()>

karaf@root()> service:list CarService
[aries.example.api.CarService]
------------------------------
 component.id = 12
 component.name = aries.example.service.CarServiceImpl
 JpaTemplate.target = (osgi.unit.name=aries)
 service.bundleid = 198
 service.id = 316
 service.scope = bundle
Provided by :
 jpa Bundle (198)

karaf@root()>

8<----------

To see, if the service is ok, i added a command bundle to create cars with help 
of this service, that is tracked with a service tracker in the execute method 
of the command:

package aries.example.command;

import org.apache.karaf.shell.api.action.Action;
import org.apache.karaf.shell.api.action.Argument;
import org.apache.karaf.shell.api.action.Command;
import org.apache.karaf.shell.api.action.lifecycle.Service;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;

import aries.example.api.Car;
import aries.example.api.CarService;

@Command(scope = "aries", name = "create", description = "Create cars")
@Service
public class Create implements Action
{
        @Argument(name = "Name", description = "Argument to the command", 
required = true, multiValued = false)
        private String name;

        @Override
        public Object execute() throws Exception
        {
                ServiceTracker<CarService, CarService> tracker = new 
ServiceTracker<CarService, 
CarService>(FrameworkUtil.getBundle(this.getClass()).getBundleContext(), 
CarService.class, null);
                tracker.open();
                try
                {
                        ServiceReference<CarService> reference = 
tracker.getServiceReference();
                        CarService carService = tracker.getService(reference);
                        if (carService == null)
                        {
                                System.out.println("Service not available.");
                        }
                        else
                        {
                                carService.createCar(name);
                                Car car = carService.getCar(name);
                                System.out.println(car.getName());
                        }
                }
                finally
                {
                        tracker.close();
                }
                return null;
        }
}

The problem is, that the tracker does not return the service, or in the actual 
example above, the service reference. I have just no idea what could going 
wrong and I spent a lot of time with it. Any hints? Thanks!

Attachment: signature.asc
Description: Message signed with OpenPGP

Reply via email to