From 59336a29a7c9377bfc2d32b10a3b9b65f8748479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Lesaint?= Date: Wed, 11 May 2016 16:26:58 +0200 Subject: [PATCH] SONAR-7534 implement Server#getUrl on the server side --- .../org/sonar/server/platform/ServerImpl.java | 39 ++++++++- .../sonar/server/platform/ServerImplTest.java | 83 ++++++++++++++++++- .../java/org/sonar/api/platform/Server.java | 4 +- 3 files changed, 121 insertions(+), 5 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java index 49c15d200891..5c7a8ecd6ada 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java @@ -45,14 +45,19 @@ 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 @@ private static Properties read(String filename) throws IOException { @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) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/platform/ServerImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/platform/ServerImplTest.java index 44bf6aa07b25..84b7c009c140 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/platform/ServerImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/platform/ServerImplTest.java @@ -23,6 +23,7 @@ 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 @@ 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 void is_secured_on_not_secured_server() throws Exception { @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"); + } } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/platform/Server.java b/sonar-plugin-api/src/main/java/org/sonar/api/platform/Server.java index 62b5915e136e..b77d46aacd2b 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/platform/Server.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/platform/Server.java @@ -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();