/*
* Copyright 2015 Netflix, Inc.
*
* Licensed 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 com.netflix.discovery.shared.resolver;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author Tomasz Bak
*/
public class DefaultEndpoint implements EurekaEndpoint {
protected final String networkAddress;
protected final int port;
protected final boolean isSecure;
protected final String relativeUri;
protected final String serviceUrl;
public DefaultEndpoint(String serviceUrl) {
this.serviceUrl = serviceUrl;
try {
URL url = new URL(serviceUrl);
this.networkAddress = url.getHost();
this.port = url.getPort();
this.isSecure = "https".equals(url.getProtocol());
this.relativeUri = url.getPath();
} catch (Exception e) {
throw new IllegalArgumentException("Malformed serviceUrl: " + serviceUrl);
}
}
public DefaultEndpoint(String networkAddress, int port, boolean isSecure, String relativeUri) {
this.networkAddress = networkAddress;
this.port = port;
this.isSecure = isSecure;
this.relativeUri = relativeUri;
StringBuilder sb = new StringBuilder()
.append(isSecure ? "https" : "http")
.append("://")
.append(networkAddress);
if (port >= 0) {
sb.append(':')
.append(port);
}
if (relativeUri != null) {
if (!relativeUri.startsWith("/")) {
sb.append('/');
}
sb.append(relativeUri);
}
this.serviceUrl = sb.toString();
}
@Override
public String getServiceUrl() {
return serviceUrl;
}
@Deprecated
@Override
public String getHostName() {
return networkAddress;
}
@Override
public String getNetworkAddress() {
return networkAddress;
}
@Override
public int getPort() {
return port;
}
@Override
public boolean isSecure() {
return isSecure;
}
@Override
public String getRelativeUri() {
return relativeUri;
}
public static List<EurekaEndpoint> createForServerList(
List<String> hostNames, int port, boolean isSecure, String relativeUri) {
if (hostNames.isEmpty()) {
return Collections.emptyList();
}
List<EurekaEndpoint> eurekaEndpoints = new ArrayList<>(hostNames.size());
for (String hostName : hostNames) {
eurekaEndpoints.add(new DefaultEndpoint(hostName, port, isSecure, relativeUri));
}
return eurekaEndpoints;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof DefaultEndpoint)) return false;
DefaultEndpoint that = (DefaultEndpoint) o;
if (isSecure != that.isSecure) return false;
if (port != that.port) return false;
if (networkAddress != null ? !networkAddress.equals(that.networkAddress) : that.networkAddress != null) return false;
if (relativeUri != null ? !relativeUri.equals(that.relativeUri) : that.relativeUri != null) return false;
if (serviceUrl != null ? !serviceUrl.equals(that.serviceUrl) : that.serviceUrl != null) return false;
return true;
}
@Override
public int hashCode() {
int result = networkAddress != null ? networkAddress.hashCode() : 0;
result = 31 * result + port;
result = 31 * result + (isSecure ? 1 : 0);
result = 31 * result + (relativeUri != null ? relativeUri.hashCode() : 0);
result = 31 * result + (serviceUrl != null ? serviceUrl.hashCode() : 0);
return result;
}
@Override
public int compareTo(Object that) {
return serviceUrl.compareTo(((DefaultEndpoint) that).getServiceUrl());
}
@Override
public String toString() {
return "DefaultEndpoint{ serviceUrl='" + serviceUrl + '}';
}
}