GERONIMO-6618 Apply service loader mediator to key modules useful for microprofile: Validation 2.0

Signed-off-by: Raymond Auge <rotty3000@apache.org>

git-svn-id: https://svn.apache.org/repos/asf/geronimo/specs/trunk@1838205 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/geronimo-validation_2.0_spec/pom.xml b/geronimo-validation_2.0_spec/pom.xml
index cfaac6d..c86cd4b 100644
--- a/geronimo-validation_2.0_spec/pom.xml
+++ b/geronimo-validation_2.0_spec/pom.xml
@@ -59,15 +59,6 @@
         <url>http://svn.apache.org/viewcvs.cgi/geronimo/specs/trunk/geronimo-validation_1.1_spec/</url>
     </scm>
 
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-osgi-locator</artifactId>
-            <version>1.0</version>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
     <build>
         <pluginManagement>
             <plugins>
@@ -111,13 +102,14 @@
                         <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor>
                         <Specification-Version>2.0</Specification-Version>
                         <Export-Package>javax.validation*;version=2.0</Export-Package>
-                        <Import-Package>org.apache.geronimo.osgi.registry.api;resolution:=optional,*</Import-Package>
-                        <Private-Package>org.apache.geronimo.osgi.locator</Private-Package>
-                        <Bundle-Activator>org.apache.geronimo.osgi.locator.Activator</Bundle-Activator>
                         <Automatic-Module-Name>java.validation</Automatic-Module-Name>
                         <Provide-Capability><![CDATA[
                            osgi.contract;osgi.contract=JavaBeanValidation;uses:="${packages;NAMED;javax.*}";version:List<Version>='2.0,1.1,1.0'
                         ]]></Provide-Capability>
+                        <Require-Capability><![CDATA[
+                          osgi.serviceloader;filter:="(osgi.serviceloader=javax.validation.spi.ValidationProvider)";cardinality:=multiple,
+                          osgi.extender;filter:="(osgi.extender=osgi.serviceloader.processor)"
+                        ]]></Require-Capability>
                     </instructions>
                 </configuration>
             </plugin>
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validation.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validation.java
index a73bea6..50afe52 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validation.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validation.java
@@ -16,8 +16,6 @@
  */
 package javax.validation;
 
-import org.apache.geronimo.osgi.locator.ProviderLocator;
-
 import javax.validation.bootstrap.GenericBootstrap;
 import javax.validation.bootstrap.ProviderSpecificBootstrap;
 import javax.validation.spi.BootstrapState;
@@ -26,6 +24,7 @@
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.ServiceLoader;
 import java.util.WeakHashMap;
 
 /**
@@ -200,23 +199,20 @@
             if (providers == null) {
                 // need to discover and load them for this class loader
                 providers = new ArrayList<>();
+                ClassLoader original = Thread.currentThread().getContextClassLoader();
                 try {
-                    List<Object> serviceProviders = ProviderLocator.getServices(ValidationProvider.class.getName(), this.getClass(), cl);
-                    for (Object provider : serviceProviders) {
-                        // create an instance to return
-                        providers.add((ValidationProvider<?>) provider);
+                    Thread.currentThread().setContextClassLoader(cl);
+                    for (ValidationProvider<?> validationProvider : ServiceLoader.load(ValidationProvider.class)) {
+                        providers.add(validationProvider);
                     }
-                } catch (ClassNotFoundException e) {
-                    throw new ValidationException("Failed to load provider", e);
-                } catch (InstantiationException e) {
-                    throw new ValidationException("Failed to instantiate provider", e);
-                } catch (IllegalAccessException e) {
-                    throw new ValidationException("Failed to access provider", e);
                 } catch (ClassCastException e) {
                     throw new ValidationException("Invalid provider definition", e);
                 } catch (Exception e) {
                     throw new ValidationException("Failed to instantiate provider", e);
                 }
+                finally {
+                    Thread.currentThread().setContextClassLoader(original);
+                }
 
                 // cache the discovered providers
                 providerCache.put(cl, providers);