package javax.persistence.osgi; | |
import java.io.IOException; | |
import java.util.Collection; | |
import java.util.HashSet; | |
import org.osgi.framework.BundleActivator; | |
import org.osgi.framework.BundleContext; | |
import org.osgi.framework.InvalidSyntaxException; | |
import org.osgi.framework.ServiceReference; | |
import org.osgi.util.tracker.ServiceTracker; | |
import org.osgi.util.tracker.ServiceTrackerCustomizer; | |
import javax.persistence.Persistence; | |
import javax.persistence.Persistence.ProviderResolver; | |
import javax.persistence.spi.PersistenceProvider; | |
/** | |
* Uses OSGi services to discover JPA persistence providers | |
* | |
* Also acts as a resolver class (called by the Persistence | |
* class when resolving providers). | |
*/ | |
public class Activator implements BundleActivator, ProviderResolver { | |
public static final String PERSISTENCE_PROVIDER = "javax.persistence.spi.PersistenceProvider"; | |
private BundleContext ctx; | |
private ServiceTracker serviceTracker; | |
//------------------------------------------------------------- | |
// Bundle life cycle method | |
//------------------------------------------------------------- | |
public void start(BundleContext context) throws Exception { | |
log("Persistence bundle starting..."); | |
// Init the bundle context | |
this.ctx = context; | |
// Set the persistence provider resolver to use OSGi services | |
Persistence.setProviderResolver(this); | |
// Set up a tracker to add providers as they register themselves | |
ServiceTrackerCustomizer customizer = new ProviderTrackerCustomizer(ctx); | |
serviceTracker = new ServiceTracker(ctx, PERSISTENCE_PROVIDER, customizer); | |
serviceTracker.open(); | |
log("Persistence bundle started."); | |
} | |
//------------------------------------------------------------- | |
// Bundle life cycle method | |
//------------------------------------------------------------- | |
public void stop(BundleContext context) throws Exception { | |
log("Persistence bundle stopping..."); | |
// Close the service tracker | |
serviceTracker.close(); | |
serviceTracker = null; | |
// Nil out the known provider list | |
Persistence.resetProviders(); | |
log("Persistence bundle stopped."); | |
} | |
//------------------------------------------------------------- | |
// Resolve/return existing providers | |
// (Implementation method for the ProviderResolver interface.) | |
//------------------------------------------------------------- | |
public Collection<PersistenceProvider> findAllProviders() throws IOException { | |
log("OSGi - Find all providers."); | |
Collection<PersistenceProvider> providers = new HashSet<PersistenceProvider>(); | |
// Provider bundles should require this bundle to be started before | |
// they start, so it is very unlikely that provider bundles will have | |
// already loaded and registered but we'll do this just in case... | |
ServiceReference[] refs = null; | |
try { refs = ctx.getServiceReferences(PERSISTENCE_PROVIDER, null); } | |
catch (InvalidSyntaxException invEx) {} // Can't happen since filter is null | |
if (refs != null){ | |
for (ServiceReference ref : refs) { | |
providers.add((PersistenceProvider)ctx.getService(ref)); | |
} | |
} | |
// Newly started providers should dynamically add themselves to the | |
// list of providers using OSGi service registration facilities | |
return providers; | |
} | |
private void log(String message) { | |
System.out.println(message); | |
} | |
} |