GERONIMO-6570 fixing SeContainerInitializer#newInstance to ensure we fail with multiple implementations
git-svn-id: https://svn.apache.org/repos/asf/geronimo/specs/trunk@1800562 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/geronimo-jcdi_2.0_spec/src/main/java/javax/enterprise/inject/se/SeContainerInitializer.java b/geronimo-jcdi_2.0_spec/src/main/java/javax/enterprise/inject/se/SeContainerInitializer.java
index 6504061..2c2976d 100644
--- a/geronimo-jcdi_2.0_spec/src/main/java/javax/enterprise/inject/se/SeContainerInitializer.java
+++ b/geronimo-jcdi_2.0_spec/src/main/java/javax/enterprise/inject/se/SeContainerInitializer.java
@@ -21,6 +21,7 @@
import java.lang.annotation.Annotation;
+import java.util.Iterator;
import java.util.Map;
import java.util.ServiceLoader;
@@ -43,18 +44,23 @@
*/
public static SeContainerInitializer newInstance()
{
- ServiceLoader<SeContainerInitializer> serviceLoader =
- ServiceLoader.load(SeContainerInitializer.class, SeContainerInitializer.class.getClassLoader());
- long exactSize = serviceLoader.spliterator().getExactSizeIfKnown();
- if(exactSize == 0)
+ // TODO: OSGi support -> ProviderLocator or is there something better these days?
+ final Iterator<SeContainerInitializer> serviceLoader =
+ ServiceLoader.load(SeContainerInitializer.class, SeContainerInitializer.class.getClassLoader())
+ .iterator();
+
+ if (!serviceLoader.hasNext())
{
throw new IllegalStateException("No valid implementation of SeContainerInitializer found via ServiceLoader");
}
- else if(exactSize > 1)
+
+ final SeContainerInitializer initializer = serviceLoader.next();
+ if (serviceLoader.hasNext())
{
- throw new IllegalStateException("Multiple implementations ("+exactSize+") of SeContainerInitializer found via ServiceLoader");
+ throw new IllegalStateException("Multiple implementations of SeContainerInitializer found via ServiceLoader");
}
- return serviceLoader.iterator().next();
+
+ return initializer;
}
/**