package com.workshare.msnos.core.protocols.ip; import java.net.MalformedURLException; import java.net.URL; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.workshare.msnos.core.Iden; import com.workshare.msnos.usvc.IMicroservice; import com.workshare.msnos.usvc.api.RestApi; public class HttpEndpoint extends BaseEndpoint { private static final Logger log = LoggerFactory.getLogger(HttpEndpoint.class); private final String url; private final transient Iden target; public HttpEndpoint(IMicroservice remote, RestApi api) { this(extractNetwork(remote, api), api.getUrl(), remote.getAgent().getIden()); } public HttpEndpoint(Network host, String url) { this(host, url, Iden.NULL); } public HttpEndpoint(Network host, String url, Iden target) { super(Type.HTTP, host, extractPort(url)); if (target == null) throw new IllegalArgumentException("Target cannot be null: please use Iden.NULL instead, thanks :)"); this.url = url; this.target = target; } public String getUrl() { return url; } public Iden getTarget() { return target; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + url.hashCode(); result = prime * result + target.hashCode(); return result; } @Override public boolean equals(Object obj) { try { HttpEndpoint other = (HttpEndpoint) obj; return super.equals(other) && url.equals(other.url) && target.equals(other.target); } catch (Exception ignore) { return false; } } // @Override // public String toString() { // JsonObject json = (JsonObject)Json.toJsonTree(this); // json.add("target", Json.toJsonTree(target)); // return json.toString(); // } // // private static short extractPort(String urlString) { URL url; try { url = new URL(urlString); final int port = url.getPort(); return (port == -1) ? Type.HTTP.defaultPort() : (short)port; } catch (MalformedURLException e) { log.warn("Malformed URL received: "+urlString, e); throw new IllegalArgumentException("Malformed URL: "+urlString); } } private static Network extractNetwork(IMicroservice remote, RestApi api) { String host = api.getHost(); Set<Endpoint> ends = remote.getAgent().getEndpoints(); for (Endpoint ep : ends) { if (ep.getNetwork().getHostString().equals(host)) return ep.getNetwork(); } throw new IllegalArgumentException("Network not found for api host ["+api.getHost()+"}"); } public Endpoint withTarget(Iden target) { return new HttpEndpoint(this.getNetwork(), this.getUrl(), target); } }