From f2090c0d863b07e3bad8d16a3efddfad6ff77960 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Tue, 08 Oct 2013 14:16:54 +0000
Subject: [PATCH] Fix OPENDJ-346 Consider using java.util.ServiceLoader for loading extensions and requesting transport implementations This a a part of OPENDJ-175 - Decouple OpenDJ LDAP SDK from Grizzly  CR-2440

---
 opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/StaticUtils.java |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/StaticUtils.java b/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/StaticUtils.java
index f14ad93..1c5f81e 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/StaticUtils.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/StaticUtils.java
@@ -45,6 +45,7 @@
 import java.util.GregorianCalendar;
 import java.util.Iterator;
 import java.util.Locale;
+import java.util.ServiceLoader;
 import java.util.TimeZone;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -60,6 +61,8 @@
 import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
+import org.forgerock.opendj.ldap.ProviderNotFoundException;
+import org.forgerock.opendj.ldap.spi.Provider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -2256,4 +2259,47 @@
         // No implementation required.
     }
 
+    /**
+     * Find and returns a provider of one or more implementations.
+     * <p>
+     * The provider is loaded using the {@code ServiceLoader} facility.
+     *
+     * @param <P> type of provider
+     * @param providerClass
+     *          class of provider
+     * @param requestedProvider
+     *            name of provider to use, or {@code null} if no specific
+     *            provider is requested.
+     * @param classLoader
+     *            class loader to use to load the provider, or {@code null} to
+     *            use the default class loader.
+     * @return a provider
+     * @throws ProviderNotFoundException
+     *             if no provider is available or if the provider requested
+     *             using options is not found.
+     */
+    public static <P extends Provider> P getProvider(final Class<P> providerClass, final String requestedProvider,
+            final ClassLoader classLoader) {
+
+        ServiceLoader<P> loader = ServiceLoader.load(providerClass, classLoader);
+        StringBuilder providersFound = new StringBuilder();
+        for (P provider : loader) {
+            if (providersFound.length() > 0) {
+                providersFound.append(" ");
+            }
+            providersFound.append(provider.getName());
+            if (requestedProvider == null || provider.getName().equals(requestedProvider)) {
+                return provider;
+            }
+        }
+        if (providersFound.length() > 0) {
+            throw new ProviderNotFoundException(providerClass, requestedProvider, String.format(
+                    "The requested provider '%s' of type '%s' was not found. Available providers: %s",
+                    requestedProvider, providerClass.getName(), providersFound));
+        } else {
+            throw new ProviderNotFoundException(providerClass, requestedProvider, String.format(
+                    "There was no provider of type '%s' available.", providerClass.getName()));
+        }
+    }
+
 }

--
Gitblit v1.10.0