diff --git a/src/main/java/org/gcube/common/scope/api/DefaultScopeProvider.java b/src/main/java/org/gcube/common/scope/api/DefaultScopeProvider.java deleted file mode 100644 index 6d5d7ac..0000000 --- a/src/main/java/org/gcube/common/scope/api/DefaultScopeProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.gcube.common.scope.api; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - - -/** - * Marks a {@link ScopeProvider} implementations to use in place of {@link DefaultScopeProvider} - * - * @author Fabio Simeoni - * - */ -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.TYPE}) -@Inherited -@Documented -public @interface DefaultScopeProvider {} diff --git a/src/main/java/org/gcube/common/scope/impl/DefaultScopeProviderImpl.java b/src/main/java/org/gcube/common/scope/impl/DefaultScopeProvider.java similarity index 89% rename from src/main/java/org/gcube/common/scope/impl/DefaultScopeProviderImpl.java rename to src/main/java/org/gcube/common/scope/impl/DefaultScopeProvider.java index f58ceb2..107a859 100644 --- a/src/main/java/org/gcube/common/scope/impl/DefaultScopeProviderImpl.java +++ b/src/main/java/org/gcube/common/scope/impl/DefaultScopeProvider.java @@ -13,16 +13,16 @@ import org.slf4j.LoggerFactory; * @see ScopeProviderScanner * */ -public class DefaultScopeProviderImpl implements ScopeProvider { +public class DefaultScopeProvider implements ScopeProvider { /** System property for scope */ public static final String SCOPE_PROPERTY = "gcube.scope"; - private static Logger log = LoggerFactory.getLogger(DefaultScopeProviderImpl.class); + private static Logger log = LoggerFactory.getLogger(DefaultScopeProvider.class); private InheritableThreadLocal scopes = new InheritableThreadLocal(); - protected DefaultScopeProviderImpl() {}; + protected DefaultScopeProvider() {}; @Override public String get() { diff --git a/src/main/java/org/gcube/common/scope/impl/ScopeProviderScanner.java b/src/main/java/org/gcube/common/scope/impl/ScopeProviderScanner.java index 9aacacb..14aa106 100644 --- a/src/main/java/org/gcube/common/scope/impl/ScopeProviderScanner.java +++ b/src/main/java/org/gcube/common/scope/impl/ScopeProviderScanner.java @@ -1,13 +1,11 @@ package org.gcube.common.scope.impl; -import java.util.Set; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ServiceLoader; -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; @@ -31,31 +29,27 @@ public class ScopeProviderScanner { 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); + ScopeProvider impl = null; - if (defaultProvider==null) { - log.info("using default scope provider"); - defaultProvider = new DefaultScopeProviderImpl(); + ServiceLoader loader = ServiceLoader.load(ScopeProvider.class); + + Iterator iterator = loader.iterator(); + List impls = new ArrayList(); + + while(iterator.hasNext()) + impls.add(iterator.next()); + + if (impls.size()==0) { + impl = new DefaultScopeProvider(); } + else if (impls.size()>1) + throw new Exception("mis-configured environment: detected multiple default providers "+impls); + else + impl=impls.get(0); + + log.info("using scope provider "+impl); - return defaultProvider; + return impl; } catch (Exception e) { diff --git a/src/test/jarone/META-INF/services/org.gcube.common.scope.api.ScopeProvider b/src/test/jarone/META-INF/services/org.gcube.common.scope.api.ScopeProvider new file mode 100644 index 0000000..eb42e74 --- /dev/null +++ b/src/test/jarone/META-INF/services/org.gcube.common.scope.api.ScopeProvider @@ -0,0 +1 @@ +org.acme.AlternativeProvider \ No newline at end of file diff --git a/src/test/jarone/org/acme/AlternativeProvider.java b/src/test/jarone/org/acme/AlternativeProvider.java new file mode 100644 index 0000000..951f697 --- /dev/null +++ b/src/test/jarone/org/acme/AlternativeProvider.java @@ -0,0 +1,26 @@ +package org.acme; + + +import org.gcube.common.scope.api.ScopeProvider; + +public class AlternativeProvider implements ScopeProvider { + + @Override + public String get() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void set(String scope) { + // TODO Auto-generated method stub + + } + + @Override + public void reset() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/test/jartwo/META-INF/services/org.gcube.common.scope.api.ScopeProvider b/src/test/jartwo/META-INF/services/org.gcube.common.scope.api.ScopeProvider new file mode 100644 index 0000000..5acfde2 --- /dev/null +++ b/src/test/jartwo/META-INF/services/org.gcube.common.scope.api.ScopeProvider @@ -0,0 +1 @@ +org.acme2.YetAnotherAlternativeProvider \ No newline at end of file diff --git a/src/test/jartwo/org/acme2/YetAnotherAlternativeProvider.java b/src/test/jartwo/org/acme2/YetAnotherAlternativeProvider.java new file mode 100644 index 0000000..679ede0 --- /dev/null +++ b/src/test/jartwo/org/acme2/YetAnotherAlternativeProvider.java @@ -0,0 +1,25 @@ +package org.acme2; + +import org.gcube.common.scope.api.ScopeProvider; + +public class YetAnotherAlternativeProvider implements ScopeProvider { + + @Override + public String get() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void set(String scope) { + // TODO Auto-generated method stub + + } + + @Override + public void reset() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/test/java/org/gcube/common/scope/BadConfigurationTest.java b/src/test/java/org/gcube/common/scope/BadConfigurationTest.java new file mode 100644 index 0000000..e5b8a6c --- /dev/null +++ b/src/test/java/org/gcube/common/scope/BadConfigurationTest.java @@ -0,0 +1,56 @@ +package org.gcube.common.scope; + +import static org.junit.Assert.*; + +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; + +import org.gcube.common.scope.api.ScopeProvider; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class BadConfigurationTest { + + private ClassLoader loader; + + @Before + public void init() { + loader = Thread.currentThread().getContextClassLoader(); + } + + @Test + public void multipleAlternativeProvidersCannotBeConfigured() { + + try { + addJarsToClasspath("alternativeprovider.jar","yetanotheralternativeprovider.jar"); + ScopeProvider.instance.set("shouldfail"); + + } + catch(Error e) { + return; + } + + fail(); + } + + private void addJarsToClasspath(String ... jars) { + + List jarUrls = new ArrayList(); + for (String jar : jars) + jarUrls.add(loader.getResource(jar)); + + URLClassLoader urlClassLoader + = new URLClassLoader(jarUrls.toArray(new URL[0]),loader); + + + Thread.currentThread().setContextClassLoader(urlClassLoader); + } + + @After + public void teardown() { + Thread.currentThread().setContextClassLoader(loader); + } +} diff --git a/src/test/java/org/gcube/common/scope/ConfigurationTest.java b/src/test/java/org/gcube/common/scope/ConfigurationTest.java index c4b5f34..8d7738e 100644 --- a/src/test/java/org/gcube/common/scope/ConfigurationTest.java +++ b/src/test/java/org/gcube/common/scope/ConfigurationTest.java @@ -4,44 +4,44 @@ import static org.junit.Assert.*; import java.net.URL; import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; import org.gcube.common.scope.api.ScopeProvider; import org.junit.After; +import org.junit.Before; import org.junit.Test; public class ConfigurationTest { - private ClassLoader loader = Thread.currentThread().getContextClassLoader(); + private ClassLoader loader; + + @Before + public void init() { + loader = Thread.currentThread().getContextClassLoader(); + } @Test public void alternativeProvidersCanBeConfigured() { - addJarToClasspath("alternativeprovider.jar"); + addJarsToClasspath("alternativeprovider.jar"); - assertEquals("AlternativeScopeProvider",ScopeProvider.instance.getClass().getSimpleName()); + assertEquals("AlternativeProvider",ScopeProvider.instance.getClass().getSimpleName()); } - @Test - public void multipleAlternativeProvidersCannotBeConfigured() { - - try { - addJarToClasspath("multiplealternativeproviders.jar"); - ScopeProvider.instance.set("shouldfail"); - fail(); - } - catch(Error e) {} - - } - private void addJarToClasspath(String jar) { - - URL jarURL = loader.getResource(jar); + + private void addJarsToClasspath(String ... jars) { + List jarUrls = new ArrayList(); + for (String jar : jars) + jarUrls.add(loader.getResource(jar)); + URLClassLoader urlClassLoader - = new URLClassLoader(new URL[]{jarURL},loader); + = new URLClassLoader(jarUrls.toArray(new URL[0]),loader); + Thread.currentThread().setContextClassLoader(urlClassLoader); - } @After diff --git a/src/test/resources/alternativeprovider.jar b/src/test/resources/alternativeprovider.jar index 4ca4cbc..67e497d 100644 Binary files a/src/test/resources/alternativeprovider.jar and b/src/test/resources/alternativeprovider.jar differ diff --git a/src/test/resources/multiplealternativeproviders.jar b/src/test/resources/multiplealternativeproviders.jar deleted file mode 100644 index 9be5e0e..0000000 Binary files a/src/test/resources/multiplealternativeproviders.jar and /dev/null differ diff --git a/src/test/resources/yetanotheralternativeprovider.jar b/src/test/resources/yetanotheralternativeprovider.jar new file mode 100644 index 0000000..cceb2fe Binary files /dev/null and b/src/test/resources/yetanotheralternativeprovider.jar differ