X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=cadi%2Fclient%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Faaf%2Fcadi%2Flocator%2FDNSLocator.java;h=c0b9f375f79689e1a30a34a73883b0c9a13ec23d;hb=1296352d8eafee57f982a4342ad79ada4aa56d28;hp=655a0c22bc90590d05c79b0c6b10843841ac3766;hpb=a20accc73189d8e5454cd26049c0e6fae75da16f;p=aaf%2Fauthz.git diff --git a/cadi/client/src/main/java/org/onap/aaf/cadi/locator/DNSLocator.java b/cadi/client/src/main/java/org/onap/aaf/cadi/locator/DNSLocator.java index 655a0c22..c0b9f375 100644 --- a/cadi/client/src/main/java/org/onap/aaf/cadi/locator/DNSLocator.java +++ b/cadi/client/src/main/java/org/onap/aaf/cadi/locator/DNSLocator.java @@ -7,9 +7,9 @@ * 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. @@ -27,184 +27,221 @@ import java.net.URI; import java.net.URISyntaxException; import org.onap.aaf.cadi.Access; -import org.onap.aaf.cadi.Locator; -import org.onap.aaf.cadi.LocatorException; import org.onap.aaf.cadi.Access.Level; +import org.onap.aaf.cadi.LocatorException; + +public class DNSLocator implements SizedLocator { + private static enum Status {UNTRIED, OK, INVALID, SLOW}; + private static final int CHECK_TIME = 3000; + + private String host, protocol; + private Access access; + private Host[] hosts; + private int startPort, endPort; + private String suffix; + + private int size = 1; // initial, until refreshed. + + public DNSLocator(Access access, String protocol, String host, String range) { + this.host = host; + this.protocol = protocol; + this.access = access; + int dash = range.indexOf('-'); + if (dash<0) { + startPort = endPort = Integer.parseInt(range); + } else { + startPort = Integer.parseInt(range.substring(0,dash)); + endPort = Integer.parseInt(range.substring(dash + 1)); + } + refresh(); + } + + public DNSLocator(Access access, String aaf_locate) throws LocatorException { + this.access = access; + if (aaf_locate==null) { + throw new LocatorException("Null passed into DNSLocator constructor"); + } + int start, defPort; + if (aaf_locate.startsWith("https://")) { + protocol = "https"; + start = 8; // https:// + defPort = 443; + } else if (aaf_locate.startsWith("http://")) { + protocol = "http"; + start = 7; // http:// + defPort = 80; + } else { + throw new LocatorException("DNSLocator accepts only https or http protocols. (requested URL " + aaf_locate + ')'); + } + host = parseHostAndPorts(aaf_locate, start, defPort); + refresh(); + } + + public static DNSLocator create(Access access, String url) throws LocatorException { + return new DNSLocator(access, url); + } + + @Override + public URI get(Item item) throws LocatorException { + return hosts[((DLItem)item).cnt].uri; + } + + @Override + public boolean hasItems() { + for (Host h : hosts) { + if (h.status==Status.OK) { + return true; + } + } + return false; + } + + @Override + public void invalidate(Item item) { + DLItem di = (DLItem)item; + hosts[di.cnt].status = Status.INVALID; + } + + @Override + public Item best() throws LocatorException { + // not a good "best" + for (int i=0;i 0) { + host = aaf_locate.substring(_start,colon); + start = colon + 1; + int left = aaf_locate.indexOf('[', start); + if (left > 0) { + int right = aaf_locate.indexOf(']', left + 1); + if (right < 0) { + throw new LocatorException("Missing closing bracket in DNSLocator constructor. (requested URL " + aaf_locate + ')'); + } else if (right == (left + 1)) { + throw new LocatorException("Missing ports in brackets in DNSLocator constructor. (requested URL " + aaf_locate + ')'); + } + int dash = aaf_locate.indexOf('-', left + 1); + if (dash == (right - 1) || dash == (left + 1)) { + throw new LocatorException("Missing ports in brackets in DNSLocator constructor. (requested URL " + aaf_locate + ')'); + } + if (dash < 0) { + startPort = endPort = Integer.parseInt(aaf_locate.substring(left + 1, right)); + } else { + startPort = Integer.parseInt(aaf_locate.substring(left + 1, dash)); + endPort = Integer.parseInt(aaf_locate.substring(dash + 1, right)); + } + slash = aaf_locate.indexOf('/', start); + if(slash>=0) { + suffix = aaf_locate.substring(slash); + } + + } else { + slash = aaf_locate.indexOf('/', start); + if (slash == start) { + throw new LocatorException("Missing port before '/' in DNSLocator constructor. (requested URL " + aaf_locate + ')'); + } + if (slash < 0) { + startPort = endPort = Integer.parseInt(aaf_locate.substring(start)); + } else { + startPort = endPort = Integer.parseInt(aaf_locate.substring(start, slash)); + suffix = aaf_locate.substring(slash); + } + } + } else { + slash = aaf_locate.indexOf('/', _start); + host = slash<_start?aaf_locate.substring(_start):aaf_locate.substring(_start,slash); + startPort = endPort = defaultPort; + } + + return host; + } + + private class Host { + private URI uri; + private InetAddress ia; + private Status status; + + public Host(InetAddress inetAddress, int port, String suffix) throws URISyntaxException { + ia = inetAddress; + uri = new URI(protocol,null,inetAddress.getCanonicalHostName(),port,suffix,null,null); + status = Status.UNTRIED; + } + + public String toString() { + return uri.toString() + " - " + status.name(); + } + } + + private class DLItem implements Item { + public DLItem(int i) { + cnt = i; + } + + private int cnt; + } + + public void destroy() {} -public class DNSLocator implements Locator { - private static enum Status {UNTRIED, OK, INVALID, SLOW}; - private static final int CHECK_TIME = 3000; - - private String host, protocol; - private Access access; - private Host[] hosts; - private int startPort, endPort; - private String suffix; - - public DNSLocator(Access access, String protocol, String host, String range) { - this.host = host; - this.protocol = protocol; - this.access = access; - int dash = range.indexOf('-'); - if(dash<0) { - startPort = endPort = Integer.parseInt(range); - } else { - startPort = Integer.parseInt(range.substring(0,dash)); - endPort = Integer.parseInt(range.substring(dash + 1)); - } - refresh(); - } - - public DNSLocator(Access access, String aaf_locate) throws LocatorException { - this.access = access; - if(aaf_locate==null) { - throw new LocatorException("Null passed into DNSLocator constructor"); - } - int start, port; - if(aaf_locate.startsWith("https:")) { - protocol = "https:"; - start = 9; // https:// - port = 443; - } else if(aaf_locate.startsWith("http:")) { - protocol = "http:"; - start = 8; // http:// - port = 80; - } else { - throw new LocatorException("DNSLocator accepts only https or http protocols. (requested URL " + aaf_locate + ')'); - } - - int colon = aaf_locate.indexOf(':',start); - int slash; - if(colon>0) { - start = colon+1; - int left = aaf_locate.indexOf('[',start); - if(left>0) { - int right = aaf_locate.indexOf(']',left+1); - if(right>0) { - int dash = aaf_locate.indexOf('-',left+1); - if(dash<0) { - startPort = endPort = Integer.parseInt(aaf_locate.substring(left+1,right)); - } else { - startPort = Integer.parseInt(aaf_locate.substring(left+1,dash)); - endPort = Integer.parseInt(aaf_locate.substring(dash + 1,right)); - } - } - - } else { - slash = aaf_locate.indexOf('/',colon+1); - if(slash<0) { - startPort = endPort = Integer.parseInt(aaf_locate.substring(start)); - } else { - startPort = endPort = Integer.parseInt(aaf_locate.substring(start,slash)); - } - } - } else { - startPort = endPort = port; - } - } - - @Override - public URI get(Item item) throws LocatorException { - return hosts[((DLItem)item).cnt].uri; - } - - @Override - public boolean hasItems() { - for(Host h : hosts) { - if(h.status==Status.OK) { - return true; - } - } - return false; - } - - @Override - public void invalidate(Item item) { - DLItem di = (DLItem)item; - hosts[di.cnt].status = Status.INVALID; - } - - @Override - public Item best() throws LocatorException { - // not a good "best" - for(int i=0;i