--- old/jdk/src/java.management/share/classes/javax/management/remote/JMXConnectorServerFactory.java 2017-02-02 11:14:02.000000000 +0000 +++ new/jdk/src/java.management/share/classes/javax/management/remote/JMXConnectorServerFactory.java 2017-02-02 11:14:02.000000000 +0000 @@ -30,13 +30,16 @@ import com.sun.jmx.remote.util.EnvHelp; import java.io.IOException; +import java.io.UncheckedIOException; import java.net.MalformedURLException; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; +import java.util.ServiceLoader.Provider; +import java.util.function.Predicate; import javax.management.MBeanServer; +import javax.management.remote.JMXConnectorFactory.ConnectorFactory; /** *

Factory to create JMX API connector servers. There @@ -205,43 +208,15 @@ } private static JMXConnectorServer - getConnectorServerAsService(ClassLoader loader, - JMXServiceURL url, - Map map, - MBeanServer mbs) + getConnectorServerAsService(ClassLoader loader, JMXServiceURL url, + Map map, MBeanServer mbs, + Predicate> filter) throws IOException { - Iterator providers = - JMXConnectorFactory. - getProviderIterator(JMXConnectorServerProvider.class, loader); - - IOException exception = null; - while (providers.hasNext()) { - try { - return providers.next().newJMXConnectorServer(url, map, mbs); - } catch (JMXProviderException e) { - throw e; - } catch (Exception e) { - if (logger.traceOn()) - logger.trace("getConnectorAsService", - "URL[" + url + - "] Service provider exception: " + e); - if (!(e instanceof MalformedURLException)) { - if (exception == null) { - if (e instanceof IOException) { - exception = (IOException) e; - } else { - exception = EnvHelp.initCause( - new IOException(e.getMessage()), e); - } - } - } - continue; - } - } - if (exception == null) - return null; - else - throw exception; + final ConnectorFactory + factory = (p) -> p.newJMXConnectorServer(url, map, mbs); + return JMXConnectorFactory.getConnectorAsService( + JMXConnectorServerProvider.class, + loader, url, filter, factory); } /** @@ -309,18 +284,22 @@ loader); IOException exception = null; + JMXConnectorServer connection = null; if (provider == null) { + Predicate> systemProvider = + JMXConnectorFactory::isSystemProvider; // Loader is null when context class loader is set to null // and no loader has been provided in map. // com.sun.jmx.remote.util.Service class extracted from j2se // provider search algorithm doesn't handle well null classloader. if (loader != null) { try { - JMXConnectorServer connection = + connection = getConnectorServerAsService(loader, serviceURL, envcopy, - mbeanServer); + mbeanServer, + systemProvider.negate()); if (connection != null) return connection; } catch (JMXProviderException e) { @@ -329,13 +308,13 @@ exception = e; } } - provider = - JMXConnectorFactory.getProvider( - protocol, - PROTOCOL_PROVIDER_DEFAULT_PACKAGE, - JMXConnectorFactory.class.getClassLoader(), - providerClassName, - targetInterface); + connection = getConnectorServerAsService( + JMXConnectorFactory.class.getClassLoader(), + serviceURL, + Collections.unmodifiableMap(envcopy), + mbeanServer, + systemProvider); + if (connection != null) return connection; } if (provider == null) {