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