This is an automated email from the ASF dual-hosted git repository.
smolnar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git
The following commit(s) were added to refs/heads/master by this push:
new 998e720 KNOX-2296 - Passing down the service URL field when building
up a service model (#290)
998e720 is described below
commit 998e720776d4b36f0440876664e84a712b8a5933
Author: Sandor Molnar <[email protected]>
AuthorDate: Wed Mar 18 08:56:34 2020 +0100
KNOX-2296 - Passing down the service URL field when building up a service
model (#290)
---
gateway-service-definitions/pom.xml | 5 +-
.../knox/gateway/service/definition/Metadata.java | 20 ++
gateway-service-metadata/pom.xml | 4 +
.../service/metadata/KnoxMetadataResource.java | 15 +-
.../gateway/service/metadata/ServiceModel.java | 83 ++++++--
.../service/metadata/TopologyInformation.java | 14 +-
.../metadata/TopologyInformationWrapper.java | 3 +-
.../gateway/service/metadata/ServiceModelTest.java | 234 +++++++++++++++++++++
8 files changed, 346 insertions(+), 32 deletions(-)
diff --git a/gateway-service-definitions/pom.xml
b/gateway-service-definitions/pom.xml
index b414738..a0ed81a 100644
--- a/gateway-service-definitions/pom.xml
+++ b/gateway-service-definitions/pom.xml
@@ -47,7 +47,10 @@
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
</dependency>
-
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ </dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
diff --git
a/gateway-service-definitions/src/main/java/org/apache/knox/gateway/service/definition/Metadata.java
b/gateway-service-definitions/src/main/java/org/apache/knox/gateway/service/definition/Metadata.java
index da642f7..960971d 100644
---
a/gateway-service-definitions/src/main/java/org/apache/knox/gateway/service/definition/Metadata.java
+++
b/gateway-service-definitions/src/main/java/org/apache/knox/gateway/service/definition/Metadata.java
@@ -20,6 +20,11 @@ package org.apache.knox.gateway.service.definition;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
@XmlType(name = "metadata")
public class Metadata {
@@ -64,4 +69,19 @@ public class Metadata {
this.description = description;
}
+ @Override
+ public boolean equals(Object obj) {
+ return EqualsBuilder.reflectionEquals(obj, this);
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this,
ToStringStyle.SHORT_PREFIX_STYLE);
+ }
+
}
diff --git a/gateway-service-metadata/pom.xml b/gateway-service-metadata/pom.xml
index 29638ab..e51d66f 100644
--- a/gateway-service-metadata/pom.xml
+++ b/gateway-service-metadata/pom.xml
@@ -63,6 +63,10 @@
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
</dependency>
diff --git
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/KnoxMetadataResource.java
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/KnoxMetadataResource.java
index f66418f..9c82b0f 100644
---
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/KnoxMetadataResource.java
+++
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/KnoxMetadataResource.java
@@ -28,14 +28,13 @@ import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
-import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.Set;
+import java.util.TreeSet;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.DefaultValue;
@@ -194,11 +193,12 @@ public class KnoxMetadataResource {
final TopologyService topologyService =
gatewayServices.getService(ServiceType.TOPOLOGY_SERVICE);
for (Topology topology : topologyService.getTopologies()) {
if (!hiddenTopologies.contains(topology.getName()) && (topologyName ==
null || topology.getName().equalsIgnoreCase(topologyName))) {
- List<ServiceModel> apiServices = new ArrayList<>();
- List<ServiceModel> uiServices = new ArrayList<>();
+ Set<ServiceModel> apiServices = new HashSet<>();
+ Set<ServiceModel> uiServices = new HashSet<>();
topology.getServices().stream().filter(service ->
!UNREAL_SERVICES.contains(service.getRole())).forEach(service -> {
service.getUrls().forEach(serviceUrl -> {
- ServiceModel serviceModel = getServiceModel(request,
config.getGatewayPath(), topology.getName(), service,
getServiceMetadata(serviceDefinitionRegistry, service));
+ ServiceModel serviceModel = getServiceModel(request,
config.getGatewayPath(), topology.getName(), service,
getServiceMetadata(serviceDefinitionRegistry, service),
+ serviceUrl);
if (ServiceModel.Type.UI == serviceModel.getType()) {
uiServices.add(serviceModel);
} else {
@@ -206,7 +206,7 @@ public class KnoxMetadataResource {
}
});
});
- topologies.addTopology(topology.getName(), apiServices, uiServices);
+ topologies.addTopology(topology.getName(), new
TreeSet<>(apiServices), new TreeSet<>(uiServices));
}
}
}
@@ -221,13 +221,14 @@ public class KnoxMetadataResource {
return serviceDefinition.isPresent() ?
serviceDefinition.get().getService().getMetadata() : null;
}
- private ServiceModel getServiceModel(HttpServletRequest request, String
gatewayPath, String topologyName, Service service, Metadata serviceMetadata) {
+ private ServiceModel getServiceModel(HttpServletRequest request, String
gatewayPath, String topologyName, Service service, Metadata serviceMetadata,
String serviceUrl) {
final ServiceModel serviceModel = new ServiceModel();
serviceModel.setRequest(request);
serviceModel.setGatewayPath(gatewayPath);
serviceModel.setTopologyName(topologyName);
serviceModel.setService(service);
serviceModel.setServiceMetadata(serviceMetadata);
+ serviceModel.setServiceUrl(serviceUrl);
return serviceModel;
}
diff --git
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/ServiceModel.java
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/ServiceModel.java
index c54352b..5d05762 100644
---
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/ServiceModel.java
+++
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/ServiceModel.java
@@ -17,6 +17,7 @@
*/
package org.apache.knox.gateway.service.metadata;
+import java.io.UncheckedIOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Locale;
@@ -27,22 +28,31 @@ import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
import org.apache.knox.gateway.service.definition.Metadata;
import org.apache.knox.gateway.topology.Service;
@XmlRootElement(name = "service")
@XmlAccessorType(XmlAccessType.NONE)
-public class ServiceModel {
+public class ServiceModel implements Comparable<ServiceModel> {
+
+ static final String SERVICE_URL_TEMPLATE = "%s://%s:%s/%s/%s%s";
+ static final String HIVE_SERVICE_NAME = "HIVE";
+ static final String HIVE_SERVICE_URL_TEMPLATE =
"jdbc:hive2://%s:%d/;?hive.server2.transport.mode=http;hive.server2.thrift.http.path=/%s/%s%s";
public enum Type {
API, UI, UNKNOWN
};
- protected HttpServletRequest request;
- protected String topologyName;
- protected String gatewayPath;
- protected Service service;
- protected Metadata serviceMetadata;
+ private HttpServletRequest request;
+ private String topologyName;
+ private String gatewayPath;
+ private Service service;
+ private Metadata serviceMetadata;
+ private String serviceUrl;
public void setRequest(HttpServletRequest request) {
this.request = request;
@@ -64,6 +74,10 @@ public class ServiceModel {
this.serviceMetadata = serviceMetadata;
}
+ public void setServiceUrl(String serviceUrl) {
+ this.serviceUrl = serviceUrl;
+ }
+
@XmlElement
public String getServiceName() {
return this.service == null ? "" : service.getRole();
@@ -103,28 +117,67 @@ public class ServiceModel {
}
@XmlElement
- public String getServiceUrl() throws MalformedURLException {
+ public String getServiceUrl() {
String context = getContext();
- if ("HIVE".equals(getServiceName())) {
- return String.format(Locale.ROOT,
"jdbc:hive2://%s:%d/;?hive.server2.transport.mode=http;hive.server2.thrift.http.path=/%s/%s%s",
request.getServerName(),
- request.getServerPort(), gatewayPath, topologyName, context);
+ if (HIVE_SERVICE_NAME.equals(getServiceName())) {
+ return String.format(Locale.ROOT, HIVE_SERVICE_URL_TEMPLATE,
request.getServerName(), request.getServerPort(), gatewayPath, topologyName,
context);
} else {
final String backendUrlString = getBackendServiceUrl();
if (context.indexOf("{{BACKEND_HOST}}") > -1) {
context = context.replace("{{BACKEND_HOST}}", backendUrlString);
}
if (context.indexOf("{{SCHEME}}") > -1 || context.indexOf("{{HOST}}") >
-1 || context.indexOf("{{PORT}}") > -1) {
- final URL backendUrl = new URL(backendUrlString);
+ try {
+ final URL backendUrl = new URL(backendUrlString);
context = context.replace("{{SCHEME}}", backendUrl.getProtocol());
context = context.replace("{{HOST}}", backendUrl.getHost());
context = context.replace("{{PORT}}",
String.valueOf(backendUrl.getPort()));
+ } catch (MalformedURLException e) {
+ throw new UncheckedIOException("Error while converting " +
backendUrlString + " to a URL", e);
+ }
}
- return String.format(Locale.ROOT, "%s://%s:%s/%s/%s%s",
request.getScheme(), request.getServerName(), request.getServerPort(),
gatewayPath, topologyName, context);
+ return String.format(Locale.ROOT, SERVICE_URL_TEMPLATE,
request.getScheme(), request.getServerName(), request.getServerPort(),
gatewayPath, topologyName, context);
}
}
- protected String getBackendServiceUrl() {
- final String serviceUrl = service == null ? "" : service.getUrl();
- return serviceUrl == null ? "" : serviceUrl;
+ String getBackendServiceUrl() {
+ final String backendServiceUrl = serviceUrl == null ? (service == null ?
"" : service.getUrl()) : serviceUrl;
+ return backendServiceUrl == null ? "" : backendServiceUrl;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (obj == null || (obj.getClass() != getClass())) {
+ return false;
+ }
+ final ServiceModel serviceModel = (ServiceModel) obj;
+ return new EqualsBuilder().append(topologyName,
serviceModel.topologyName).append(gatewayPath,
serviceModel.gatewayPath).append(getServiceName(),
serviceModel.getServiceName())
+ .append(getVersion(),
serviceModel.getVersion()).append(serviceMetadata,
serviceModel.serviceMetadata).append(getServiceUrl(),
serviceModel.getServiceUrl()).isEquals();
}
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(17,
37).append(topologyName).append(gatewayPath).append(getServiceName()).append(getVersion()).append(serviceMetadata).append(getServiceUrl())
+ .toHashCode();
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,
ToStringStyle.SHORT_PREFIX_STYLE).append(topologyName).append(gatewayPath).append(getServiceName()).append(getVersion())
+ .append(serviceMetadata).append(getServiceUrl()).toString();
+ }
+
+ @Override
+ public int compareTo(ServiceModel other) {
+ final int byServiceName =
getServiceName().compareTo(other.getServiceName());
+ if (byServiceName == 0) {
+ final int byVersion = getVersion().compareTo(getVersion());
+ return byVersion == 0 ?
getBackendServiceUrl().compareTo(other.getBackendServiceUrl()) : byVersion;
+ }
+ return byServiceName;
+ }
+
}
diff --git
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformation.java
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformation.java
index 0ede6e7..067d73a 100644
---
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformation.java
+++
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformation.java
@@ -17,7 +17,7 @@
*/
package org.apache.knox.gateway.service.metadata;
-import java.util.List;
+import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
@@ -31,11 +31,11 @@ public class TopologyInformation {
@XmlElement(name = "service")
@XmlElementWrapper(name = "apiServices")
- private List<ServiceModel> apiServices;
+ private Set<ServiceModel> apiServices;
@XmlElement(name = "service")
@XmlElementWrapper(name = "uiServices")
- private List<ServiceModel> uiServices;
+ private Set<ServiceModel> uiServices;
public String getTopologyName() {
return topologyName;
@@ -45,19 +45,19 @@ public class TopologyInformation {
this.topologyName = topologyName;
}
- public List<ServiceModel> getApiServices() {
+ public Set<ServiceModel> getApiServices() {
return apiServices;
}
- public void setApiServices(List<ServiceModel> apiServices) {
+ public void setApiServices(Set<ServiceModel> apiServices) {
this.apiServices = apiServices;
}
- public List<ServiceModel> getUiServices() {
+ public Set<ServiceModel> getUiServices() {
return uiServices;
}
- public void setUiServices(List<ServiceModel> uiServices) {
+ public void setUiServices(Set<ServiceModel> uiServices) {
this.uiServices = uiServices;
}
diff --git
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformationWrapper.java
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformationWrapper.java
index 6846c34..0e9177b 100644
---
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformationWrapper.java
+++
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformationWrapper.java
@@ -18,7 +18,6 @@
package org.apache.knox.gateway.service.metadata;
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType;
@@ -37,7 +36,7 @@ public class TopologyInformationWrapper {
return topologies;
}
- public void addTopology(String name, List<ServiceModel> apiServices,
List<ServiceModel> uiServices) {
+ public void addTopology(String name, Set<ServiceModel> apiServices,
Set<ServiceModel> uiServices) {
final TopologyInformation topology = new TopologyInformation();
topology.setTopologyName(name);
topology.setApiServices(apiServices);
diff --git
a/gateway-service-metadata/src/test/java/org/apache/knox/gateway/service/metadata/ServiceModelTest.java
b/gateway-service-metadata/src/test/java/org/apache/knox/gateway/service/metadata/ServiceModelTest.java
new file mode 100644
index 0000000..c50132e
--- /dev/null
+++
b/gateway-service-metadata/src/test/java/org/apache/knox/gateway/service/metadata/ServiceModelTest.java
@@ -0,0 +1,234 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.knox.gateway.service.metadata;
+
+import static
org.apache.knox.gateway.service.metadata.ServiceModel.HIVE_SERVICE_NAME;
+import static
org.apache.knox.gateway.service.metadata.ServiceModel.HIVE_SERVICE_URL_TEMPLATE;
+import static
org.apache.knox.gateway.service.metadata.ServiceModel.SERVICE_URL_TEMPLATE;
+import static org.junit.Assert.assertEquals;
+
+import java.util.Locale;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.knox.gateway.service.definition.Metadata;
+import org.apache.knox.gateway.topology.Service;
+import org.apache.knox.gateway.topology.Version;
+import org.easymock.EasyMock;
+import org.junit.Test;
+
+public class ServiceModelTest {
+
+ private static final String SERVER_SCHEME = "https";
+ private static final String SERVER_NAME = "localhost";
+ private static final int SERVER_PORT = 8443;
+
+ @Test
+ public void shouldReturnEmptyStringAsServiceNameIfServiceNotSet() throws
Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ assertEquals("", serviceModel.getServiceName());
+ }
+
+ @Test
+ public void shouldReturnTheGivenServiceRoleWhenFetchingServiceName() throws
Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final Service service = EasyMock.createNiceMock(Service.class);
+ serviceModel.setService(service);
+ final String roleName = "sampleRole";
+ EasyMock.expect(service.getRole()).andReturn(roleName).anyTimes();
+ EasyMock.replay(service);
+ assertEquals(roleName, serviceModel.getServiceName());
+ }
+
+ @Test
+ public void shouldReturnEmptyStringAsServiceVersionIfServiceNotSet() throws
Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ assertEquals("", serviceModel.getVersion());
+ }
+
+ @Test
+ public void
shouldReturnEmptyStringAsServiceVersionIfServiceVersionIsNotSet() throws
Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final Service service = EasyMock.createNiceMock(Service.class);
+ serviceModel.setService(service);
+ assertEquals("", serviceModel.getVersion());
+ }
+
+ @Test
+ public void shouldReturnTheGivenServiceVersionWhenFetchingVersion() throws
Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final Service service = EasyMock.createNiceMock(Service.class);
+ serviceModel.setService(service);
+ final Version version = new Version(1, 2, 3);
+ EasyMock.expect(service.getVersion()).andReturn(version).anyTimes();
+ EasyMock.replay(service);
+ assertEquals(version.toString(), serviceModel.getVersion());
+ }
+
+ @Test
+ public void shouldReturnServiceRoleAsShortDescriptionIfMetadataIsNotSet()
throws Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final Service service = EasyMock.createNiceMock(Service.class);
+ serviceModel.setService(service);
+ EasyMock.expect(service.getRole()).andReturn("sampleRole").anyTimes();
+ EasyMock.replay(service);
+ assertEquals("Samplerole", serviceModel.getShortDescription());
+ }
+
+ @Test
+ public void shouldReturnShortDescriptionFromMetadataIfMetadataIsSet() throws
Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final Metadata metadata = EasyMock.createNiceMock(Metadata.class);
+ serviceModel.setServiceMetadata(metadata);
+ final String shortDesc = "shortDescription";
+ EasyMock.expect(metadata.getShortDesc()).andReturn(shortDesc).anyTimes();
+ EasyMock.replay(metadata);
+ assertEquals(shortDesc, serviceModel.getShortDescription());
+ }
+
+ @Test
+ public void shouldReturnUnknownTypeIfMetadataIsNotSet() throws Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ assertEquals(ServiceModel.Type.UNKNOWN, serviceModel.getType());
+ }
+
+ @Test
+ public void shouldReturnTypeFromMetadataIfMetadataIsSet() throws Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final Metadata metadata = EasyMock.createNiceMock(Metadata.class);
+ serviceModel.setServiceMetadata(metadata);
+ final ServiceModel.Type type = ServiceModel.Type.API;
+ EasyMock.expect(metadata.getType()).andReturn(type.name()).anyTimes();
+ EasyMock.replay(metadata);
+ assertEquals(type, serviceModel.getType());
+ }
+
+ @Test
+ public void shouldUseServiceNameAsContextIfMetadataIsNotSet() throws
Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final Service service = EasyMock.createNiceMock(Service.class);
+ serviceModel.setService(service);
+ EasyMock.expect(service.getRole()).andReturn("sampleRole").anyTimes();
+ EasyMock.replay(service);
+ assertEquals("/samplerole/", serviceModel.getContext());
+ }
+
+ @Test
+ public void shouldReturnContextFromMetadataIfMetadataIsSet() throws
Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final Metadata metadata = EasyMock.createNiceMock(Metadata.class);
+ serviceModel.setServiceMetadata(metadata);
+ final String context = "/testContext";
+ EasyMock.expect(metadata.getContext()).andReturn(context).anyTimes();
+ EasyMock.replay(metadata);
+ assertEquals(context + "/", serviceModel.getContext());
+ }
+
+ @Test
+ public void shouldReturnProperHiveServiceUrl() throws Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final String gatewayPath = "gateway";
+ final String topologyName = "sandbox";
+ serviceModel.setGatewayPath(gatewayPath);
+ serviceModel.setTopologyName(topologyName);
+ serviceModel.setRequest(setUpHttpRequestMock());
+ final Service service = EasyMock.createNiceMock(Service.class);
+ serviceModel.setService(service);
+ EasyMock.expect(service.getRole()).andReturn(HIVE_SERVICE_NAME).anyTimes();
+ EasyMock.replay(service);
+ assertEquals(String.format(Locale.ROOT, HIVE_SERVICE_URL_TEMPLATE,
SERVER_NAME, SERVER_PORT, gatewayPath, topologyName, "/hive/"),
serviceModel.getServiceUrl());
+ }
+
+ public HttpServletRequest setUpHttpRequestMock() {
+ final HttpServletRequest httpServletRequestMock =
EasyMock.createNiceMock(HttpServletRequest.class);
+
EasyMock.expect(httpServletRequestMock.getScheme()).andReturn(SERVER_SCHEME).anyTimes();
+
EasyMock.expect(httpServletRequestMock.getServerName()).andReturn(SERVER_NAME).anyTimes();
+
EasyMock.expect(httpServletRequestMock.getServerPort()).andReturn(SERVER_PORT).anyTimes();
+ EasyMock.replay(httpServletRequestMock);
+ return httpServletRequestMock;
+ }
+
+ @Test
+ public void shouldReturnSimpleServiceUrl() throws Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final String gatewayPath = "gateway";
+ final String topologyName = "sandbox";
+ serviceModel.setGatewayPath(gatewayPath);
+ serviceModel.setTopologyName(topologyName);
+ serviceModel.setRequest(setUpHttpRequestMock());
+ final Metadata metadata = EasyMock.createNiceMock(Metadata.class);
+ serviceModel.setServiceMetadata(metadata);
+ final String context = "/testContext";
+ EasyMock.expect(metadata.getContext()).andReturn(context).anyTimes();
+ EasyMock.replay(metadata);
+ assertEquals(String.format(Locale.ROOT, SERVICE_URL_TEMPLATE,
SERVER_SCHEME, SERVER_NAME, SERVER_PORT, gatewayPath, topologyName, context +
"/"), serviceModel.getServiceUrl());
+ }
+
+ @Test
+ public void shouldReturnServiceUrlWithBackendHostPlaceholder() throws
Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final String gatewayPath = "gateway";
+ final String topologyName = "sandbox";
+ serviceModel.setGatewayPath(gatewayPath);
+ serviceModel.setTopologyName(topologyName);
+ serviceModel.setRequest(setUpHttpRequestMock());
+
+ final Service service = EasyMock.createNiceMock(Service.class);
+ serviceModel.setService(service);
+ EasyMock.expect(service.getRole()).andReturn("service").anyTimes();
+ final String backendHost = "https://localhost:5555";
+ EasyMock.expect(service.getUrl()).andReturn(backendHost); // backend host
comes from the service object
+ final Metadata metadata = EasyMock.createNiceMock(Metadata.class);
+ serviceModel.setServiceMetadata(metadata);
+ final String context = "/testContext?backendHost={{BACKEND_HOST}}";
+ EasyMock.expect(metadata.getContext()).andReturn(context).anyTimes();
+ EasyMock.replay(service, metadata);
+ assertEquals(String.format(Locale.ROOT, SERVICE_URL_TEMPLATE,
SERVER_SCHEME, SERVER_NAME, SERVER_PORT, gatewayPath, topologyName,
+ context.replace("{{BACKEND_HOST}}", backendHost) + "/"),
serviceModel.getServiceUrl());
+
+ final String serviceUrl = "https://serviceHost:8888";
+ serviceModel.setServiceUrl(serviceUrl); // backend host comes from the
given service URL
+ assertEquals(
+ String.format(Locale.ROOT, SERVICE_URL_TEMPLATE, SERVER_SCHEME,
SERVER_NAME, SERVER_PORT, gatewayPath, topologyName,
context.replace("{{BACKEND_HOST}}", serviceUrl) + "/"),
+ serviceModel.getServiceUrl());
+ }
+
+ @Test
+ public void shouldReturnServiceUrlWithSchemeHostAndPortPlaceholders() throws
Exception {
+ final ServiceModel serviceModel = new ServiceModel();
+ final String gatewayPath = "gateway";
+ final String topologyName = "sandbox";
+ serviceModel.setGatewayPath(gatewayPath);
+ serviceModel.setTopologyName(topologyName);
+ serviceModel.setRequest(setUpHttpRequestMock());
+
+ final Service service = EasyMock.createNiceMock(Service.class);
+ serviceModel.setService(service);
+ EasyMock.expect(service.getRole()).andReturn("service").anyTimes();
+ EasyMock.expect(service.getUrl()).andReturn("https://localhost:5555");
+
+ final Metadata metadata = EasyMock.createNiceMock(Metadata.class);
+ serviceModel.setServiceMetadata(metadata);
+ final String context =
"/testContext?scheme={{SCHEME}}&host={{HOST}}&port={{PORT}}";
+ EasyMock.expect(metadata.getContext()).andReturn(context).anyTimes();
+
+ EasyMock.replay(service, metadata);
+ assertEquals(String.format(Locale.ROOT, SERVICE_URL_TEMPLATE,
SERVER_SCHEME, SERVER_NAME, SERVER_PORT, gatewayPath, topologyName,
+ context.replace("{{SCHEME}}", "https").replace("{{HOST}}",
"localhost").replace("{{PORT}}", "5555") + "/"), serviceModel.getServiceUrl());
+ }
+}