From 4d89df11da2b5c1d6023345383d6b358ed6de065 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Fri, 1 Aug 2014 10:46:21 +0200 Subject: [PATCH] SONAR-4898 fix compatibility with Java 6 --- .../org/sonar/process/ProcessWrapper.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/server/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java b/server/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java index 54c242e8e57..2eda4b939a0 100644 --- a/server/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java +++ b/server/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java @@ -41,11 +41,13 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.InetAddress; -import java.net.MalformedURLException; +import java.net.NetworkInterface; +import java.net.SocketException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -210,7 +212,7 @@ public class ProcessWrapper extends Thread implements Terminable { + separator + "bin" + separator + "java"; } - private List buildJMXOptions() throws UnknownHostException { + private List buildJMXOptions() throws Exception { if (jmxPort < 1) { throw new IllegalStateException("JMX port is not set"); } @@ -219,7 +221,7 @@ public class ProcessWrapper extends Thread implements Terminable { "-Dcom.sun.management.jmxremote.port=" + jmxPort, "-Dcom.sun.management.jmxremote.authenticate=false", "-Dcom.sun.management.jmxremote.ssl=false", - "-Djava.rmi.server.hostname=" + localhost()); + "-Djava.rmi.server.hostname=" + loopbackAddress()); } private List buildClasspath() { @@ -245,9 +247,10 @@ public class ProcessWrapper extends Thread implements Terminable { * Wait for JMX RMI to be ready. Return null */ @CheckForNull - private ProcessMXBean waitForJMX() throws UnknownHostException, MalformedURLException { - String path = "/jndi/rmi://" + localhost() + ":" + jmxPort + "/jmxrmi"; - JMXServiceURL jmxUrl = new JMXServiceURL("rmi", localhost(), jmxPort, path); + private ProcessMXBean waitForJMX() throws Exception { + String loopbackAddress = loopbackAddress(); + String path = "/jndi/rmi://" + loopbackAddress + ":" + jmxPort + "/jmxrmi"; + JMXServiceURL jmxUrl = new JMXServiceURL("rmi", loopbackAddress, jmxPort, path); for (int i = 0; i < 5; i++) { try { @@ -265,8 +268,20 @@ public class ProcessWrapper extends Thread implements Terminable { return null; } - private String localhost() { - return InetAddress.getLoopbackAddress().getHostAddress(); + private String loopbackAddress() throws SocketException { + Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); + while (ifaces.hasMoreElements()) + { + NetworkInterface iface = ifaces.nextElement(); + Enumeration addresses = iface.getInetAddresses(); + while (addresses.hasMoreElements()) { + InetAddress addr = addresses.nextElement(); + if (addr.isLoopbackAddress()) { + return addr.getHostAddress(); + } + } + } + throw new IllegalStateException("Can not find loopback address"); } @Override -- 2.39.5