
org.infinispan.commons.util.ServiceFinder Maven / Gradle / Ivy
package org.infinispan.commons.util;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.ServiceConfigurationError;
import java.util.ServiceLoader;
import org.infinispan.commons.logging.Log;
import org.infinispan.commons.logging.LogFactory;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.util.tracker.ServiceTracker;
/**
* ServiceFinder is a {@link java.util.ServiceLoader} replacement which understands multiple
* classpaths
*
* @author Tristan Tarrant
* @author Brett Meyer
* @since 6.0
*/
public class ServiceFinder {
private static final Log LOG = LogFactory.getLog(ServiceFinder.class);
public static Collection load(Class contract, ClassLoader... loaders) {
Map services = new LinkedHashMap<>();
if (loaders.length == 0) {
try {
ServiceLoader loadedServices = ServiceLoader.load(contract);
addServices( loadedServices, services );
} catch (Exception e) {
// Ignore
}
}
else {
for (ClassLoader loader : loaders) {
if (loader == null)
continue;
try {
ServiceLoader loadedServices = ServiceLoader.load(contract, loader);
addServices( loadedServices, services );
} catch (Exception e) {
// Ignore
}
}
}
addOsgiServices( contract, services );
if (services.isEmpty()) {
LOG.debugf("No service impls found: %s", contract.getSimpleName());
}
return services.values();
}
private static void addServices(ServiceLoader loadedServices, Map services) {
Iterator i = loadedServices.iterator();
while (i.hasNext()) {
try {
T service = i.next();
if (services.putIfAbsent(service.getClass().getName(), service) == null) {
LOG.debugf("Loading service impl: %s", service.getClass().getSimpleName());
} else {
LOG.debugf("Ignoring already loaded service: %s", service.getClass().getSimpleName());
}
} catch (ServiceConfigurationError e) {
LOG.debugf("Skipping service impl", e);
}
}
}
private static void addOsgiServices(Class contract, Map services) {
if (!Util.isOSGiContext()) {
return;
}
final BundleContext bundleContext = FrameworkUtil.getBundle(ServiceFinder.class).getBundleContext();
final ServiceTracker serviceTracker = new ServiceTracker(bundleContext, contract.getName(),
null);
serviceTracker.open();
try {
final Object[] osgiServices = serviceTracker.getServices();
if (osgiServices != null) {
for (Object osgiService : osgiServices) {
if (services.putIfAbsent(osgiService.getClass().getName(), (T) osgiService) == null) {
LOG.debugf("Loading service impl: %s", osgiService.getClass().getSimpleName());
} else {
LOG.debugf("Ignoring already loaded service: %s", osgiService.getClass().getSimpleName());
}
}
}
} catch (Exception e) {
// ignore
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy