Handle variables in server declaration (#614)

This commit is contained in:
Jérémie Bresson
2018-07-23 06:20:41 +02:00
committed by GitHub
parent 4156bb9f01
commit d42ff75ceb
2 changed files with 80 additions and 2 deletions

View File

@@ -19,6 +19,8 @@ package org.openapitools.codegen.utils;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.servers.Server;
import io.swagger.v3.oas.models.servers.ServerVariable;
import io.swagger.v3.oas.models.servers.ServerVariables;
import org.openapitools.codegen.CodegenConfig;
import org.slf4j.Logger;
@@ -26,12 +28,17 @@ import org.slf4j.LoggerFactory;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class URLPathUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(URLPathUtils.class);
public static final String LOCAL_HOST = "http://localhost";
public static final Pattern VARIABLE_PATTERN = Pattern.compile("\\{([^\\}]+)\\}");
public static URL getServerURL(OpenAPI openAPI) {
final List<Server> servers = openAPI.getServers();
@@ -40,8 +47,40 @@ public class URLPathUtils {
return getDefaultUrl();
}
// TODO need a way to obtain all server URLs
final Server server = servers.get(0);
String url = sanitizeUrl(server.getUrl());
return getServerURL(servers.get(0));
}
static URL getServerURL(final Server server) {
String url = server.getUrl();
ServerVariables variables = server.getVariables();
if(variables == null) {
variables = new ServerVariables();
}
Set<String> replacedVariables = new HashSet<>();
Matcher matcher = VARIABLE_PATTERN.matcher(url);
while(matcher.find()) {
if(!replacedVariables.contains(matcher.group())) {
ServerVariable variable = variables.get(matcher.group(1));
String replacement;
if(variable != null) {
if(variable.getDefault() != null) {
replacement = variable.getDefault();
} else if(variable.getEnum() != null && !variable.getEnum().isEmpty()) {
replacement = variable.getEnum().get(0);
} else {
LOGGER.warn("No value found for variable '{}' in server definition '{}', default to empty string.", matcher.group(1), server.getUrl());
replacement = "";
}
} else {
LOGGER.warn("No variable '{}' found in server definition '{}', default to empty string.", matcher.group(1), server.getUrl());
replacement = "";
}
url = url.replace(matcher.group(), replacement);
replacedVariables.add(matcher.group());
matcher = VARIABLE_PATTERN.matcher(url);
}
}
url = sanitizeUrl(url);
try {
return new URL(url);

View File

@@ -19,11 +19,14 @@ package org.openapitools.codegen.utils;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.servers.Server;
import io.swagger.v3.oas.models.servers.ServerVariable;
import io.swagger.v3.oas.models.servers.ServerVariables;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.net.URL;
import java.util.Arrays;
public class URLPathUtilsTest {
@@ -75,4 +78,40 @@ public class URLPathUtilsTest {
Assert.assertEquals(URLPathUtils.getServerURL(openAPI).toString(), t[1]);
}
}
@Test
public void testGetServerURLWithVariables() throws Exception {
Server s1 = new Server().url("http://localhost:{port}/").variables(new ServerVariables().addServerVariable("port", new ServerVariable()._default("8080").description("the server port")));
Assert.assertEquals(URLPathUtils.getServerURL(s1).toString(), "http://localhost:8080/");
Server s2 = new Server().url("http://{version}.test.me/{version}").variables(new ServerVariables().addServerVariable("version", new ServerVariable()._default("v1")));
Assert.assertEquals(URLPathUtils.getServerURL(s2).toString(), "http://v1.test.me/v1");
Server s3 = new Server().url("http://localhost:{port}/{version}").variables(
new ServerVariables().addServerVariable("version", new ServerVariable()._default("v4"))
.addServerVariable("port", new ServerVariable()._default("8080"))
.addServerVariable("other", new ServerVariable()._default("something"))
);
Assert.assertEquals(URLPathUtils.getServerURL(s3).toString(), "http://localhost:8080/v4");
Server s4 = new Server().url("http://91.161.147.64/{targetEnv}").variables(new ServerVariables().addServerVariable("targetEnv", new ServerVariable().description("target environment")._enum(Arrays.asList("dev", "int", "prd"))._default("prd")));
Assert.assertEquals(URLPathUtils.getServerURL(s4).toString(), "http://91.161.147.64/prd");
Server s5 = new Server().url("https://api.stats.com/{country1}").variables(new ServerVariables().addServerVariable("country1", new ServerVariable()._enum(Arrays.asList("france", "germany", "italy"))));
Assert.assertEquals(URLPathUtils.getServerURL(s5).toString(), "https://api.stats.com/france");
Server s6 = new Server().url("https://api.example.com/{wrong}");
Assert.assertEquals(URLPathUtils.getServerURL(s6).toString(), "https://api.example.com/");
Server s7 = new Server().url("https://api.example.com/{wrong}").variables(new ServerVariables());
Assert.assertEquals(URLPathUtils.getServerURL(s7).toString(), "https://api.example.com/");
Server s8 = new Server().url("https://api.example.com/{wrong}").variables(new ServerVariables().addServerVariable("other", new ServerVariable()._default("something")));
Assert.assertEquals(URLPathUtils.getServerURL(s8).toString(), "https://api.example.com/");
Server s9 = new Server().url("https://{user}.example.com/{version}").variables(
new ServerVariables().addServerVariable("version", new ServerVariable()._default("v1"))
.addServerVariable("user", new ServerVariable()._default("{user}")));
Assert.assertEquals(URLPathUtils.getServerURL(s9).toString(), "https://{user}.example.com/v1");
}
}