blob: 75707f80dce1dd4300444fdbffdc7376429fe6e7 [file] [log] [blame]
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);
}
}