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());
+  }
+}

Reply via email to