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); | |
} | |
} |