| package javax.persistence.osgi; | |
| import javax.persistence.Persistence; | |
| import javax.persistence.spi.PersistenceProvider; | |
| import org.osgi.framework.BundleContext; | |
| import org.osgi.framework.ServiceReference; | |
| import org.osgi.util.tracker.ServiceTrackerCustomizer; | |
| public class ProviderTrackerCustomizer implements ServiceTrackerCustomizer{ | |
| public static final String PERSISTENCE_PROVIDER = "javax.persistence.spi.PersistenceProvider"; | |
| private BundleContext ctx; | |
| public ProviderTrackerCustomizer(BundleContext context) { | |
| this.ctx = context; | |
| } | |
| //------------------------------------------------------------- | |
| // Service was added | |
| //------------------------------------------------------------- | |
| public Object addingService(ServiceReference reference) { | |
| log("New service detected..."); | |
| String providerName = getProviderName(reference); | |
| PersistenceProvider provider = (PersistenceProvider) ctx.getService(reference); | |
| Persistence.addProvider(provider); | |
| log("Added service " + providerName); | |
| return provider; | |
| } | |
| //------------------------------------------------------------- | |
| // Service was modified | |
| //------------------------------------------------------------- | |
| public void modifiedService(ServiceReference reference, Object serviceObject) { | |
| // Rogue provider -- we don't support modifying provider services | |
| this.removedService(reference, serviceObject); | |
| } | |
| //------------------------------------------------------------- | |
| // Service was removed | |
| //------------------------------------------------------------- | |
| public void removedService(ServiceReference reference, Object serviceObject) { | |
| log("Removing service..."); | |
| String providerName = getProviderName(reference); | |
| Persistence.removeProvider(providerName); | |
| log("Removed service " + providerName + " service object: " + serviceObject); | |
| } | |
| //------------------------------------------------------------- | |
| // Helper method to get provider name from the service reference. | |
| // Assumes that provider services are registered with property | |
| // that indicates the name of the provider impl class. | |
| //------------------------------------------------------------- | |
| private String getProviderName(ServiceReference ref) { | |
| String providerName = (String) ref.getProperty(PERSISTENCE_PROVIDER); | |
| if (providerName == null) { | |
| System.out.println("Provider service registered without name property"); | |
| throw new RuntimeException("Provider service registered without name property"); | |
| } | |
| return providerName; | |
| } | |
| private void log(String message) { | |
| System.out.println("ProviderTracker: " + message); | |
| } | |
| } |