Merge "AAFcli.java -Declare "value" on a separate line"
[aaf/authz.git] / cadi / aaf / src / main / java / org / onap / aaf / cadi / register / RegistrationCreator.java
index 7e519c5..de006ae 100644 (file)
@@ -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.
 
 package org.onap.aaf.cadi.register;
 
-import java.net.Inet4Address;
 import java.net.UnknownHostException;
 import java.util.List;
 
 import org.onap.aaf.cadi.Access;
+import org.onap.aaf.cadi.Access.Level;
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.aaf.Defaults;
 import org.onap.aaf.cadi.config.Config;
+import org.onap.aaf.cadi.config.RegistrationPropHolder;
 import org.onap.aaf.cadi.util.Split;
 
 import locate.v1_0.MgmtEndpoint;
+import locate.v1_0.MgmtEndpoint.SpecialPorts;
 import locate.v1_0.MgmtEndpoints;
 
 public class RegistrationCreator {
-    private static final String MUST_BE_DEFINED = " must be defined\n";
-       private Access access;
-    
+    private Access access;
+
     public RegistrationCreator(Access access) {
-       this.access = access;
+        this.access = access;
     }
-    
-    public MgmtEndpoints create(final int port) throws CadiException {
-       MgmtEndpoints me = new MgmtEndpoints();
-       List<MgmtEndpoint> lme = me.getMgmtEndpoint();
-       MgmtEndpoint defData = null;
-       MgmtEndpoint locate = null;
-
 
-       StringBuilder errs = new StringBuilder();
-       try {
-               String hostname = access.getProperty(Config.HOSTNAME, null);
-               if (hostname==null) {
-                       hostname = Inet4Address.getLocalHost().getHostName();
-               }
-               if (hostname==null) {
-                       errs.append(Config.HOSTNAME);
-                       errs.append(MUST_BE_DEFINED);
-               }
+    public MgmtEndpoints create(final int port) throws CadiException {
+        MgmtEndpoints me = new MgmtEndpoints();
+        List<MgmtEndpoint> lme = me.getMgmtEndpoint();
+        MgmtEndpoint defData = null;
+        MgmtEndpoint locate = null;
 
-               Float latitude=null;
-               String slatitude = access.getProperty(Config.CADI_LATITUDE, null);
-               if(slatitude == null) {
-                       errs.append(Config.CADI_LATITUDE);
-                       errs.append(MUST_BE_DEFINED);
-               } else {
-                       latitude = Float.parseFloat(slatitude);
-               }
+        try {
+            String dot_le;
+            String version=null;
+            String defProtocol="https";
 
-               Float longitude=null;
-               String slongitude = access.getProperty(Config.CADI_LONGITUDE, null);
-               if(slongitude == null) {
-                       errs.append(Config.CADI_LONGITUDE);
-                       errs.append(MUST_BE_DEFINED);
-               } else {
-                       longitude = Float.parseFloat(slongitude);
-               }
+            RegistrationPropHolder ph = new RegistrationPropHolder(access, port);
 
-               if(errs.length()>0) {
-                       throw new CadiException(errs.toString());
-               }
+            String firstPrivateHostname = null;
+            // Now, loop through by Container
+            for(String le : Split.splitTrim(',', ph.lcontainer)) {
+                if(le.isEmpty()) {
+                    dot_le = le;
+                } else {
+                    dot_le = "."+le;
+                }
 
-               String dot_le;
-               String ns;
-               String version=null;
-               String lentries = access.getProperty(Config.AAF_LOCATOR_CONTAINER, null);
-               if(lentries==null) {
-                       lentries="";
-               } else {
-                       lentries=',' + lentries; // "" makes a blank default Public Entry
-               }
+                for(String entry : Split.splitTrim(',', ph.lentries)) {
+                    if(defData==null) {
+                        defData = locate = new MgmtEndpoint();
 
-               String defaultName = null;
-               String str;
-               int public_port = port;
-               // Note: only one of the ports can be public...  Therefore, only the la
-               for(String le : Split.splitTrim(',', lentries)) {
-                       dot_le = le.isEmpty()?"":"."+le;
-                               str = access.getProperty(Config.AAF_LOCATOR_PUBLIC_PORT+dot_le, null);
-                               if(str!=null) { // Get Public Port
-                                       public_port = Integer.decode(str);
-                               }
-               }
-               
-               String public_hostname = hostname;
-               for(String le : Split.splitTrim(',', lentries)) {
-                       dot_le = le.isEmpty()?"":"."+le;
-                               String ph = access.getProperty(Config.AAF_LOCATOR_PUBLIC_HOSTNAME+dot_le,null);
-                               if( ph != null) {
-                                       public_hostname=ph;
-                               }
-               }
-               
-               String default_fqdn = access.getProperty(Config.AAF_LOCATOR_FQDN, public_hostname);
-               
+                        version = access.getProperty(Config.AAF_LOCATOR_VERSION, Defaults.AAF_VERSION);
+                        locate.setProtocol(defProtocol = access.getProperty(Config.AAF_LOCATOR_PROTOCOL,defProtocol));
+                        List<String> ls = locate.getSubprotocol();
+                        for(String sp : Split.splitTrim(',', access.getProperty(Config.AAF_LOCATOR_SUBPROTOCOL,""))) {
+                            ls.add(sp);
+                        }
+                        locate.setLatitude(ph.latitude);
+                        locate.setLongitude(ph.longitude);
 
-               // Now, loop through by Container
-               for(String le : Split.splitTrim(',', lentries)) {
-                       // Add variable entries
-                       String names;
-                       if(le.length()>0) {
-                               dot_le = '.' + le;
-                               names = access.getProperty(Config.AAF_LOCATOR_NAMES+dot_le,null);
-                               if(names==null) {
-                                       // Go for Default
-                                       names = access.getProperty(Config.AAF_LOCATOR_NAMES,"");
-                               }
-                       } else {
-                               dot_le = "";
-                               names=access.getProperty(Config.AAF_LOCATOR_NAMES,dot_le);
-                       }
-                       
-                       for(String name : Split.splitTrim(',', names)) {
-                               if(defData==null) {
-                                       defData = locate = new MgmtEndpoint();
+                    } else {
+                        locate = copy(defData);
+                    }
 
-                                       defaultName = name;
-                                       version = access.getProperty(Config.AAF_LOCATOR_VERSION, Defaults.AAF_VERSION);
-                                       locate.setProtocol(access.getProperty(Config.AAF_LOCATOR_PROTOCOL,null));
-                                       List<String> ls = locate.getSubprotocol();
-                                       for(String sp : Split.splitTrim(',', access.getProperty(Config.AAF_LOCATOR_SUBPROTOCOL,""))) {
-                                               ls.add(sp);     
-                                       }
-                                       locate.setLatitude(latitude);
-                                       locate.setLongitude(longitude);
+                    locate.setName(ph.getEntryName(entry,dot_le));
+                    /* Cover the situation where there is a Container, and multiple locator Entries,
+                     * the first of which is the only real private FQDN
+                     * example: oauth
+                     *      aaf_locator_entries=oauth,token,introspect
+                     *
+                     *      Entries for token and introspect, but they point to oauth service.
+                     */
+                    String locateHostname;
+                    if(le.isEmpty()) {
+                        locateHostname=ph.getEntryFQDN(entry, dot_le);
+                    } else if(firstPrivateHostname==null) {
+                        firstPrivateHostname=locateHostname=ph.getEntryFQDN(entry, dot_le);
+                    } else {
+                        locateHostname=firstPrivateHostname;
+                    }
 
-                               } else {
-                                       locate = copy(defData);
-                               }
-                               
-                               str = access.getProperty(Config.HOSTNAME+dot_le, null);
-                               if(str==null) {
-                                       str = access.getProperty(Config.HOSTNAME, hostname);
-                               }
-                               locate.setHostname(hostname);
-                               
-                               ns = access.getProperty(Config.AAF_LOCATOR_NS+dot_le,null);
-                               if(ns==null) {
-                                       ns = access.getProperty(Config.AAF_LOCATOR_NS,"");
-                               }
-                               switch(ns) {
-                                       case Defaults.AAF_NS:
-                                               ns = access.getProperty(Config.AAF_ROOT_NS, "");
-                                               // Fallthrough on purpose.
-                               }
+                    locate.setHostname(locateHostname);
+                    locate.setPort(ph.getEntryPort(dot_le));
 
-                               String ns_dot;
-                               if(ns.isEmpty()) {
-                                       ns_dot = ns;
-                               } else {
-                                       ns_dot = ns + '.';
-                               }
+                    String specificVersion = access.getProperty(Config.AAF_LOCATOR_VERSION + dot_le,null);
+                    if(specificVersion == null && locate == defData) {
+                        specificVersion = version;
+                    }
+                    if(specificVersion!=null) {
+                        String split[] = Split.splitTrim('.', specificVersion);
+                        String deply[]= Split.splitTrim('.', access.getProperty(Config.AAF_DEPLOYED_VERSION, ""));
+                        locate.setMajor(best(split,deply,0));
+                        locate.setMinor(best(split,deply,1));
+                        locate.setPatch(best(split,deply,2));
+                        locate.setPkg(best(split,deply,3));
+                    }
 
-                               String container_id = access.getProperty(Config.AAF_LOCATOR_CONTAINER_ID+dot_le, "");
-                               if(!container_id.isEmpty()) {
-                                       ns_dot = container_id + '.' + ns_dot;
-                               }
+                    String protocol = access.getProperty(Config.AAF_LOCATOR_PROTOCOL + dot_le, defProtocol);
+                    if (protocol!=null) {
+                        locate.setProtocol(protocol);
+                        List<String> ls = locate.getSubprotocol();
+                        // ls cannot be null, per generated getSubprotocol code
+                        if(ls.isEmpty()) {
+                            String subprotocols = access.getProperty(Config.AAF_LOCATOR_SUBPROTOCOL + dot_le, null);
+                            if(subprotocols==null) {
+                                subprotocols = access.getProperty(Config.CADI_PROTOCOLS, null);
+                            }
+                            if(subprotocols!=null) {
+                                for (String s : Split.split(',', subprotocols)) {
+                                    ls.add(s);
+                                }
+                            } else {
+                                access.printf(Level.ERROR, "%s is required for Locator Registration of %s",
+                                        Config.AAF_LOCATOR_SUBPROTOCOL,Config.AAF_LOCATOR_PROTOCOL);
+                            }
+                        }
+                        lme.add(locate);
+                    } else {
+                        access.printf(Level.ERROR, "%s is required for Locator Registration",Config.AAF_LOCATOR_PROTOCOL);
+                    }
+                }
+            }
+        } catch (NumberFormatException | UnknownHostException e) {
+            throw new CadiException("Error extracting Data from Properties for Registrar",e);
+        }
 
-                               if(!le.isEmpty()) {
-                                       ns_dot = le + '.' + ns_dot;
-                               }
+        if(access.willLog(Level.INFO)) {
+            access.log(Level.INFO, print(new StringBuilder(),me.getMgmtEndpoint()));
+        }
+        return me;
+    }
 
-                               if(name.isEmpty()) {
-                                               locate.setName(ns_dot + defaultName);
-                               } else {
-                                       locate.setName(ns_dot + name);
-                               }
+    /*
+     * Find the best version between Actual Interface and Deployed version
+     */
+    private int best(String[] split, String[] deploy, int i) {
+        StringBuilder sb = new StringBuilder();
+        char c;
+        String s;
+        if(split.length>i) {
+            s=split[i];
+            for(int j=0;j<s.length();++j) {
+                if(Character.isDigit(c=s.charAt(j))) {
+                    sb.append(c);
+                } else {
+                    break;
+                }
+            }
+        }
 
-                               if(dot_le.isEmpty()) {
-                                       locate.setHostname(access.getProperty(Config.AAF_LOCATOR_FQDN, default_fqdn));
-                               } else {
-                                       str =  access.getProperty(Config.AAF_LOCATOR_FQDN+dot_le, null);
-                                       if(str==null) {
-                                               locate.setHostname(default_fqdn);
-                                       } else {
-                                               String container_ns = access.getProperty(Config.AAF_LOCATOR_CONTAINER_NS+dot_le, "");
-                                               str = str.replace("%CNS", container_ns);
-                                               String container = access.getProperty(Config.AAF_LOCATOR_CONTAINER+dot_le, "");
-                                               str = str.replace("%C", container);
-                                               str = str.replace("%NS", ns);
-                                               str = str.replace("%N", name);
-                                               str = str.replace("%DF", default_fqdn);
-                                               str = str.replace("%PH", public_hostname);
-                                               locate.setHostname(str);
-                                       }
-                               }
-                               
-                               if(le.isEmpty()) {
-                                       locate.setPort(public_port);
-                               } else {
-                                       locate.setPort(port);
-                               }
+        if(sb.length()==0 && deploy.length>i) {
+            s=deploy[i];
+            for(int j=0;j<s.length();++j) {
+                if(Character.isDigit(c=s.charAt(j))) {
+                    sb.append(c);
+                } else {
+                    break;
+                }
+            }
+        }
 
-                               String specificVersion = access.getProperty(Config.AAF_LOCATOR_VERSION + dot_le,null);
-                               if(specificVersion == null && locate == defData) {
-                                       specificVersion = version;
-                               }
-                               if(specificVersion!=null) {
-                                       String split[] = Split.splitTrim('.', specificVersion);
-                                       locate.setPkg(split.length>3?Integer.parseInt(split[3]):0);
-                                       locate.setPatch(split.length>2?Integer.parseInt(split[2]):0);
-                                       locate.setMinor(split.length>1?Integer.parseInt(split[1]):0);
-                                       locate.setMajor(split.length>0?Integer.parseInt(split[0]):0);
-                               }
+        return sb.length()==0?0:Integer.parseInt(sb.toString());
+    }
 
-                               String protocol = access.getProperty(Config.AAF_LOCATOR_PROTOCOL + dot_le, null);
-                               if (protocol!=null) {
-                                       locate.setProtocol(protocol);
-                                       String subprotocols = access.getProperty(Config.AAF_LOCATOR_SUBPROTOCOL + dot_le, null);
-                                       if(subprotocols!=null) {
-                                               List<String> ls = locate.getSubprotocol();
-                                               for (String s : Split.split(',', subprotocols)) {
-                                                       ls.add(s);
-                                               }
-                                       }
-                               }
-                               lme.add(locate);
-                       }
-               }
-       } catch (NumberFormatException | UnknownHostException e) {
-               throw new CadiException("Error extracting Data from Properties for Registrar",e);
-       }
+    private StringBuilder print(StringBuilder sb, List<MgmtEndpoint> lme) {
+        int cnt = 0;
+        for(MgmtEndpoint m : lme) {
+            print(sb,cnt++,m);
+        }
+        return sb;
+    }
 
-       return me;
+    private void print(StringBuilder out, int cnt, MgmtEndpoint mep) {
+        out.append("\nManagement Endpoint - ");
+        out.append(cnt);
+        out.append("\n\tName:       ");
+        out.append(mep.getName());
+        out.append("\n\tHostname:   ");
+        out.append(mep.getHostname());
+        out.append("\n\tLatitude:   ");
+        out.append(mep.getLatitude());
+        out.append("\n\tLongitude:  ");
+        out.append(mep.getLongitude());
+        out.append("\n\tVersion:    ");
+        out.append(mep.getMajor());
+        out.append('.');
+        out.append(mep.getMinor());
+        out.append('.');
+        out.append(mep.getPatch());
+        out.append('.');
+        out.append(mep.getPkg());
+        out.append("\n\tPort:       ");
+        out.append(mep.getPort());
+        out.append("\n\tProtocol:   ");
+        out.append(mep.getProtocol());
+        out.append("\n\tSpecial Ports:");
+        for( SpecialPorts sp : mep.getSpecialPorts()) {
+            out.append("\n\t\tName:       ");
+            out.append(sp.getName());
+            out.append("\n\t\tPort:       ");
+            out.append(sp.getPort());
+            out.append("\n\t\tProtocol:   ");
+            out.append(sp.getProtocol());
+            out.append("\n\t\t  Versions: ");
+            boolean first = true;
+            for(String s : sp.getProtocolVersions()) {
+                if(first) {
+                    first = false;
+                } else {
+                    out.append(',');
+                }
+                out.append(s);
+            }
+        }
+        boolean first = true;
+        out.append("\n\tSubProtocol: ");
+        for(String s : mep.getSubprotocol()) {
+            if(first) {
+                first = false;
+            } else {
+                out.append(',');
+            }
+            out.append(s);
+        }
     }
-       
+
     private MgmtEndpoint copy(MgmtEndpoint mep) {
-               MgmtEndpoint out = new MgmtEndpoint();
-               out.setName(mep.getName());
-               out.setHostname(mep.getHostname());
-               out.setLatitude(mep.getLatitude());
-               out.setLongitude(mep.getLongitude());
-               out.setMajor(mep.getMajor());
-               out.setMinor(mep.getMinor());
-               out.setPkg(mep.getPkg());
-               out.setPatch(mep.getPatch());
-               out.setPort(mep.getPort());
-               out.setProtocol(mep.getProtocol());
-               out.getSpecialPorts().addAll(mep.getSpecialPorts());
-               out.getSubprotocol().addAll(mep.getSubprotocol());
-               return out;
-       }
+        MgmtEndpoint out = new MgmtEndpoint();
+        out.setName(mep.getName());
+        out.setHostname(mep.getHostname());
+        out.setLatitude(mep.getLatitude());
+        out.setLongitude(mep.getLongitude());
+        out.setMajor(mep.getMajor());
+        out.setMinor(mep.getMinor());
+        out.setPatch(mep.getPatch());
+        out.setPkg(mep.getPkg());
+        out.setPort(mep.getPort());
+        out.setProtocol(mep.getProtocol());
+        out.getSpecialPorts().addAll(mep.getSpecialPorts());
+        out.getSubprotocol().addAll(mep.getSubprotocol());
+        return out;
+    }
 }