package org.gcube.common.scope.impl; import java.util.Set; import org.gcube.common.scope.api.DefaultScopeProvider; import org.gcube.common.scope.api.ScopeProvider; import org.reflections.Reflections; import org.reflections.scanners.SubTypesScanner; import org.reflections.util.ClasspathHelper; import org.reflections.util.ConfigurationBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Scans the classpath for a {@link ScopeProvider} implementation. *

* Returns a shared {@link DefaultScopeProvider} by default. * * @author Fabio Simeoni * @see ScopeProvider * @see ScopeProvider#instance */ public class ScopeProviderScanner { private static Logger log = LoggerFactory.getLogger(ScopeProviderScanner.class); /** * Returns the configured provider. * @return the provider */ public static ScopeProvider provider() { try { // we include urls specified in manifest files, which is required // when we run tests in surefire's forked-mode ConfigurationBuilder builder = new ConfigurationBuilder().setUrls( ClasspathHelper.forManifest(Utils.urlsToScan())).setScanners(new SubTypesScanner()); Reflections reflections = new Reflections(builder); Set> impls = reflections.getSubTypesOf(ScopeProvider.class); ScopeProvider defaultProvider = null; for (Class impl : impls) if (impl.isAnnotationPresent(DefaultScopeProvider.class)) if (defaultProvider==null) defaultProvider = impl.newInstance(); else throw new Exception("mis-configured environment: detected multiple deafult providers among "+impls); if (defaultProvider==null) { log.info("using default scope provider"); defaultProvider = new DefaultScopeProviderImpl(); } return defaultProvider; } catch (Exception e) { throw new RuntimeException("could not configure scope provider", e); } } }