Index: src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinder.java
===================================================================
--- src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinder.java (revision 774735)
+++ src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinder.java (working copy)
@@ -9,9 +9,14 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.net.URI;
import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
import java.util.Properties;
+import org.oasisopen.sca.NoSuchDomainException;
import org.oasisopen.sca.SCARuntimeException;
import org.oasisopen.sca.client.SCAClientFactory;
@@ -55,17 +60,22 @@
* @throws SCARuntimeException Failed to create SCAClientFactory
* implementation.
*/
- public static SCAClientFactory find(Properties properties, ClassLoader classLoader) {
+ public static SCAClientFactory find(URI domainURI, Properties properties, ClassLoader classLoader) throws NoSuchDomainException {
if (classLoader == null) {
classLoader = getThreadContextClassLoader();
if (classLoader == null) {
classLoader = SCAClientFactoryFinder.class.getClassLoader();
}
}
- final String factoryImplClassName = discoverProviderFactoryImplClass(properties, classLoader);
- final Class extends SCAClientFactory> factoryImplClass = loadProviderFactoryClass(factoryImplClassName, classLoader);
- final SCAClientFactory factory = instantiateSCAClientFactoryClass(factoryImplClass);
- return factory;
+ final String[] factoryImplClassNames = discoverProviderFactoryImplClass(properties, classLoader);
+ for (String factoryImplClassName : factoryImplClassNames) {
+ final Class extends SCAClientFactory> factoryImplClass = loadProviderFactoryClass(factoryImplClassName, classLoader);
+ final SCAClientFactory factory = instantiateSCAClientFactoryClass(factoryImplClass);
+ if (factory.supportsDomain(domainURI)) {
+ return factory;
+ }
+ }
+ throw new NoSuchDomainException("No such domain or no available SCAClientFactory");
}
/**
@@ -87,18 +97,18 @@
* @throw SCARuntimeException Failed to find implementation for
* SCAClientFactory.
*/
- private static String discoverProviderFactoryImplClass(Properties properties, ClassLoader classLoader) throws SCARuntimeException {
+ private static String[] discoverProviderFactoryImplClass(Properties properties, ClassLoader classLoader) throws SCARuntimeException {
String providerClassName = checkPropertiesForSPIClassName(properties);
if (providerClassName != null) {
- return providerClassName;
+ return new String[]{ providerClassName };
}
providerClassName = checkPropertiesForSPIClassName(System.getProperties());
if (providerClassName != null) {
- return providerClassName;
+ return new String[]{ providerClassName };
}
- return checkMETAINFServicesForClassName(classLoader);
+ return checkMETAINFServicesForClassName(classLoader).toArray(new String[]{});
}
/**
@@ -128,34 +138,40 @@
* @return The class name for the SCAClientFactory implementation or
* null if not found.
*/
- private static String checkMETAINFServicesForClassName(ClassLoader cl) {
- final URL url = cl.getResource(SCA_CLIENT_FACTORY_PROVIDER_META_INF_SERVICE);
- if (url == null) {
- return null;
- }
-
- InputStream in = null;
+ private static List checkMETAINFServicesForClassName(ClassLoader cl) {
+ List names = new ArrayList();
try {
- in = url.openStream();
- BufferedReader reader = null;
- try {
- reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
+ final Enumeration urls = cl.getResources(SCA_CLIENT_FACTORY_PROVIDER_META_INF_SERVICE);
+ if (urls == null) {
+ return names;
+ }
- String line;
- while ((line = readNextLine(reader)) != null) {
- if (!line.startsWith("#") && line.length() > 0) {
- return line;
+ while (urls.hasMoreElements()) {
+ URL url = urls.nextElement();
+ InputStream in = null;
+ try {
+ in = url.openStream();
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
+
+ String line;
+ while ((line = readNextLine(reader)) != null) {
+ if (!line.startsWith("#") && line.length() > 0) {
+ names.add(line);
+ }
+ }
+ } finally {
+ closeStream(reader);
}
+ } finally {
+ closeStream(in);
}
- return null;
- } finally {
- closeStream(reader);
}
} catch (IOException ex) {
throw new SCARuntimeException("Failed to discover SCAClientFactory provider", ex);
- } finally {
- closeStream(in);
}
+ return names;
}
/**
Index: src/main/java/org/oasisopen/sca/client/SCAClientFactory.java
===================================================================
--- src/main/java/org/oasisopen/sca/client/SCAClientFactory.java (revision 774735)
+++ src/main/java/org/oasisopen/sca/client/SCAClientFactory.java (working copy)
@@ -4,8 +4,10 @@
*/
package org.oasisopen.sca.client;
+import java.net.URI;
import java.util.Properties;
+import org.oasisopen.sca.NoSuchDomainException;
import org.oasisopen.sca.client.impl.SCAClientFactoryFinder;
/**
@@ -31,9 +33,10 @@
* Services.
*
* @return A new SCAClient
+ * @throws NoSuchDomainException
*/
- public static SCAClient newInstance() {
- return newInstance(null, null);
+ public static SCAClient newInstance(URI domainURI) throws NoSuchDomainException {
+ return newInstance(domainURI, null, null);
}
/**
@@ -43,9 +46,10 @@
* @param properties Properties that may be used when creating a new
* instance of the SCAClient
* @return A new SCAClient instance
+ * @throws NoSuchDomainException
*/
- public static SCAClient newInstance(Properties properties) {
- return newInstance(properties, null);
+ public static SCAClient newInstance(URI domainURI, Properties properties) throws NoSuchDomainException {
+ return newInstance(domainURI, properties, null);
}
/**
@@ -55,9 +59,10 @@
* @param classLoader ClassLoader that may be used when creating a new
* instance of the SCAClient
* @return A new SCAClient instance
+ * @throws NoSuchDomainException
*/
- public static SCAClient newInstance(ClassLoader classLoader) {
- return newInstance(null, classLoader);
+ public static SCAClient newInstance(URI domainURI, ClassLoader classLoader) throws NoSuchDomainException {
+ return newInstance(domainURI, null, classLoader);
}
/**
@@ -69,11 +74,12 @@
* @param classLoader ClassLoader that may be used when creating a new
* instance of the SCAClient
* @return A new SCAClient instance
+ * @throws NoSuchDomainException
*/
- public static SCAClient newInstance(Properties properties, ClassLoader classLoader) {
+ public static SCAClient newInstance(URI domainURI, Properties properties, ClassLoader classLoader) throws NoSuchDomainException {
final SCAClientFactory factory;
if (defaultFactory == null) {
- factory = SCAClientFactoryFinder.find(properties, classLoader);
+ factory = SCAClientFactoryFinder.find(domainURI, properties, classLoader);
} else {
factory = defaultFactory;
}
@@ -86,4 +92,6 @@
* @return A new SCAClient instance
*/
protected abstract SCAClient createSCAClient();
+
+ public abstract boolean supportsDomain(URI domainURI);
}