]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7534 implement Server#getUrl on the server side
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Wed, 11 May 2016 14:26:58 +0000 (16:26 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Thu, 12 May 2016 13:35:49 +0000 (15:35 +0200)
server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java
server/sonar-server/src/test/java/org/sonar/server/platform/ServerImplTest.java
sonar-plugin-api/src/main/java/org/sonar/api/platform/Server.java

index 49c15d20089131fa80881c6dee657dd34466495b..5c7a8ecd6adaf6f47338306ddf2175f1fec2392f 100644 (file)
@@ -45,14 +45,19 @@ import org.sonar.server.app.TomcatContexts;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static org.apache.commons.lang.StringUtils.isEmpty;
+import static org.apache.commons.lang.StringUtils.isNotEmpty;
 import static org.sonar.api.CoreProperties.SERVER_BASE_URL;
 import static org.sonar.api.CoreProperties.SERVER_BASE_URL_DEFAULT_VALUE;
 import static org.sonar.server.app.TomcatContexts.PROPERTY_CONTEXT;
 
 public final class ServerImpl extends Server implements Startable {
   private static final String PROPERTY_SONAR_CORE_STARTED_AT = "sonar.core.startedAt";
+  private static final int DEFAULT_HTTP_PORT = 80;
+  private static final String ALL_IPS_HOST = "0.0.0.0";
 
   private static final Logger LOG = Loggers.get(ServerImpl.class);
+  public static final int DEFAULT_PORT = 9000;
 
   private final Settings settings;
   private final String buildProperties;
@@ -193,7 +198,39 @@ public final class ServerImpl extends Server implements Startable {
 
   @Override
   public String getURL() {
-    return null;
+    String host = settings.getString("sonar.web.host");
+    int port = settings.getInt("sonar.web.port");
+    String context = settings.getString("sonar.web.context");
+
+    StringBuilder res = new StringBuilder();
+    res.append("http://");
+    appendHost(host, res);
+    appendPort(port, res);
+    appendContext(context, res);
+
+    return res.toString();
+  }
+
+  private static void appendHost(String host, StringBuilder res) {
+    if (isEmpty(host) || ALL_IPS_HOST.equals(host)) {
+      res.append("localhost");
+    } else {
+      res.append(host);
+    }
+  }
+
+  private static void appendPort(int port, StringBuilder res) {
+    if (port < 1) {
+      res.append(':').append(DEFAULT_PORT);
+    } else if (port != DEFAULT_HTTP_PORT) {
+      res.append(':').append(port);
+    }
+  }
+
+  private static void appendContext(String context, StringBuilder res) {
+    if (isNotEmpty(context)) {
+      res.append(context);
+    }
   }
 
   private String get(String key, String defaultValue) {
index 44bf6aa07b2528c10433da6dbb4654d7e1fd88f7..84b7c009c1405bba634a4e0e924183fca36a1b8a 100644 (file)
@@ -23,6 +23,7 @@ import java.io.File;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Random;
 import org.hamcrest.core.Is;
 import org.junit.Before;
 import org.junit.Rule;
@@ -38,6 +39,10 @@ import static org.junit.Assert.assertThat;
 
 public class ServerImplTest {
 
+  private static final String HOST_PROPERTY = "sonar.web.host";
+  private static final String PORT_PORPERTY = "sonar.web.port";
+  private static final String CONTEXT_PROPERTY = "sonar.web.context";
+
   @Rule
   public ExpectedException exception = ExpectedException.none();
   @Rule
@@ -203,15 +208,89 @@ public class ServerImplTest {
 
   @Test
   public void get_context_path_from_settings() {
-    settings.setProperty("sonar.web.context", "/my_path");
+    settings.setProperty(CONTEXT_PROPERTY, "/my_path");
     underTest.start();
     assertThat(underTest.getContextPath()).isEqualTo("/my_path");
   }
 
   @Test
   public void sanitize_context_path_from_settings() {
-    settings.setProperty("sonar.web.context", "/my_path///");
+    settings.setProperty(CONTEXT_PROPERTY, "/my_path///");
     underTest.start();
     assertThat(underTest.getContextPath()).isEqualTo("/my_path");
   }
+
+  @Test
+  public void getUrl_returns_http_localhost_9000_when_not_settings_are_set() {
+    assertThat(underTest.getURL()).isEqualTo("http://localhost:9000");
+  }
+
+  @Test
+  public void getUrl_returns_http_localhost_9000_when_host_set_to_0_0_0_0() {
+    settings.setProperty(HOST_PROPERTY, "0.0.0.0");
+    assertThat(underTest.getURL()).isEqualTo("http://localhost:9000");
+  }
+
+  @Test
+  public void getUrl_returns_http_specified_host_9000_when_host_is_set() {
+    settings.setProperty(HOST_PROPERTY, "my_host");
+    assertThat(underTest.getURL()).isEqualTo("http://my_host:9000");
+  }
+
+  @Test
+  public void getUrl_returns_http_localhost_specified_port_when_port_is_set() {
+    settings.setProperty(PORT_PORPERTY, 951);
+    assertThat(underTest.getURL()).isEqualTo("http://localhost:951");
+  }
+
+  @Test
+  public void getUrl_returns_http_localhost_no_port_when_port_is_80() {
+    settings.setProperty(PORT_PORPERTY, 80);
+    assertThat(underTest.getURL()).isEqualTo("http://localhost");
+  }
+
+  @Test
+  public void getUrl_returns_http_localhost_9000_when_port_is_0() {
+    settings.setProperty(PORT_PORPERTY, 0);
+    assertThat(underTest.getURL()).isEqualTo("http://localhost:9000");
+  }
+
+  @Test
+  public void getUrl_returns_http_localhost_9000_when_port_is_less_then_0() {
+    settings.setProperty(PORT_PORPERTY, -(Math.abs(new Random().nextInt(256))));
+    assertThat(underTest.getURL()).isEqualTo("http://localhost:9000");
+  }
+
+  @Test
+  public void getUrl_throws_NFE_when_port_not_an_int() {
+    settings.setProperty(PORT_PORPERTY, "not a number");
+
+    exception.expect(NumberFormatException.class);
+
+    underTest.getURL();
+  }
+
+  @Test
+  public void getUrl_returns_http_localhost_900_specified_context_when_context_is_set() {
+    settings.setProperty(CONTEXT_PROPERTY, "sdsd");
+    assertThat(underTest.getURL()).isEqualTo("http://localhost:9000sdsd");
+  }
+
+  @Test
+  public void getUrl_returns_http_specified_host_no_port_when_host_is_set_and_port_is_80() {
+    settings.setProperty(HOST_PROPERTY, "foo");
+    settings.setProperty(PORT_PORPERTY, 80);
+    assertThat(underTest.getURL()).isEqualTo("http://foo");
+  }
+
+  @Test
+  public void getUrl_does_not_cache_returned_value() {
+    assertThat(underTest.getURL()).isEqualTo("http://localhost:9000");
+    settings.setProperty(HOST_PROPERTY, "foo");
+    assertThat(underTest.getURL()).isEqualTo("http://foo:9000");
+    settings.setProperty(PORT_PORPERTY, 666);
+    assertThat(underTest.getURL()).isEqualTo("http://foo:666");
+    settings.setProperty(CONTEXT_PROPERTY, "/bar");
+    assertThat(underTest.getURL()).isEqualTo("http://foo:666/bar");
+  }
 }
index 62b5915e136eb7ef8a7b5dfaa54549c44e432f8a..b77d46aacd2bb5bbaf6c8cd2fb9bc2d453a7637e 100644 (file)
@@ -70,8 +70,8 @@ public abstract class Server {
   public abstract boolean isSecured();
 
   /**
-   * @return the server URL when executed from batch, else null.
-   * @since 2.4
+   * @return the server URL
+   * @since since 2.4 on batch side only, since 5.6 on both batch side and server side
    */
   public abstract String getURL();