common-scope/src/main/java/org/gcube/common/scope/impl/ScopeProviderScanner.java

69 lines
1.9 KiB
Java

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.
* <p>
* 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<Class<? extends ScopeProvider>> impls =
reflections.getSubTypesOf(ScopeProvider.class);
ScopeProvider defaultProvider = null;
for (Class<? extends ScopeProvider> 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);
}
}
}