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 factoryImplClass = loadProviderFactoryClass(factoryImplClassName, classLoader); - final SCAClientFactory factory = instantiateSCAClientFactoryClass(factoryImplClass); - return factory; + final String[] factoryImplClassNames = discoverProviderFactoryImplClass(properties, classLoader); + for (String factoryImplClassName : factoryImplClassNames) { + final Class 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); }