Merge "Update to use Schema Service"
[aai/gizmo.git] / src / main / java / org / onap / schema / OxmModelLoader.java
index 948914c..fb41fc9 100644 (file)
  */
 package org.onap.schema;
 
+import com.google.common.base.CaseFormat;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-
+import javax.annotation.PostConstruct;
 import javax.ws.rs.core.Response.Status;
-
 import org.eclipse.persistence.dynamic.DynamicType;
 import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
 import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
 import org.onap.aai.cl.eelf.LoggerFactory;
 import org.onap.aai.nodes.NodeIngestor;
-import org.onap.aai.setup.ConfigTranslator;
-import org.onap.aai.setup.SchemaLocationsBean;
-import org.onap.aai.setup.Version;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.setup.Translator;
 import org.onap.crud.exception.CrudException;
 import org.onap.crud.logging.CrudServiceMsgs;
-import org.onap.schema.util.SchemaIngestPropertyReader;
-
-import com.google.common.base.CaseFormat;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
+@Component
 public class OxmModelLoader {
 
-    private static Map<String, DynamicJAXBContext> versionContextMap =
-            new ConcurrentHashMap<>();
-    
-    private static Map<String, HashMap<String, DynamicType>> xmlElementLookup = new ConcurrentHashMap<String, HashMap<String, DynamicType>>();
+    private static Translator translator;
+    private static NodeIngestor nodeIngestor;
+
+    private static Map<String, DynamicJAXBContext> versionContextMap = new ConcurrentHashMap<>();
+    private static Map<String, HashMap<String, DynamicType>> xmlElementLookup = new ConcurrentHashMap<>();
 
-    static final Pattern p = Pattern.compile("aai_oxm_(.*).xml");
-    static final Pattern versionPattern = Pattern.compile("V(\\d*)");
+    final static Pattern versionPattern = Pattern.compile("(?i)v(\\d*)");
 
     private static org.onap.aai.cl.api.Logger logger =
             LoggerFactory.getInstance().getLogger(OxmModelLoader.class.getName());
 
-    private OxmModelLoader() {
+    private OxmModelLoader() { }
+
+    @Autowired
+    public OxmModelLoader(Translator translator, NodeIngestor nodeIngestor) {
+       OxmModelLoader.translator = translator;
+       OxmModelLoader.nodeIngestor = nodeIngestor;
+    }
+
+    @PostConstruct
+    public void init() throws CrudException {
+       OxmModelLoader.loadModels();
     }
 
     /**
@@ -69,28 +77,22 @@ public class OxmModelLoader {
      * @throws IOException
      *
      */
-    public static synchronized void loadModels() throws CrudException {
-        SchemaIngestPropertyReader schemaIngestPropertyReader = new SchemaIngestPropertyReader();
-
-        SchemaLocationsBean schemaLocationsBean = new SchemaLocationsBean();
-        schemaLocationsBean.setNodeDirectory(schemaIngestPropertyReader.getNodeDir());
-        ConfigTranslator configTranslator = new OxmModelConfigTranslator(schemaLocationsBean);
-        NodeIngestor nodeIngestor = new NodeIngestor(configTranslator);
+    public synchronized static void loadModels() throws CrudException {
 
         if (logger.isDebugEnabled()) {
             logger.debug("Loading OXM Models");
         }
 
-        for (Version oxmVersion : Version.values()) {
+        for (SchemaVersion oxmVersion : translator.getSchemaVersions().getVersions()) {
             DynamicJAXBContext jaxbContext = nodeIngestor.getContextForVersion(oxmVersion);
             if (jaxbContext != null) {
-                loadModel(oxmVersion.toString().toLowerCase(), jaxbContext);
+                loadModel(oxmVersion.toString(), jaxbContext);
             }
         }
     }
 
 
-    private static synchronized void loadModel(String oxmVersion, DynamicJAXBContext jaxbContext) {
+    private synchronized static void loadModel(String oxmVersion, DynamicJAXBContext jaxbContext) {
         versionContextMap.put(oxmVersion, jaxbContext);
         loadXmlLookupMap(oxmVersion, jaxbContext);
         logger.info(CrudServiceMsgs.LOADED_OXM_FILE, oxmVersion);
@@ -111,7 +113,7 @@ public class OxmModelLoader {
         if (versionContextMap == null || versionContextMap.isEmpty()) {
             loadModels();
         } else if (!versionContextMap.containsKey(version)) {
-                       logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "Error loading oxm model: " + version);
+            logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "Error loading oxm model: " + version);
             throw new CrudException("Error loading oxm model: " + version, Status.INTERNAL_SERVER_ERROR);
         }
 
@@ -128,8 +130,7 @@ public class OxmModelLoader {
         // If there are still no models available, then there's not much we can do...
         if (versionContextMap.isEmpty()) {
                        logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "No available OXM schemas to get latest version for.");
-            throw new CrudException("No available OXM schemas to get latest version for.",
-                    Status.INTERNAL_SERVER_ERROR);
+            throw new CrudException("No available OXM schemas to get latest version for.", Status.INTERNAL_SERVER_ERROR);
         }
 
         // Iterate over the available model versions to determine which is the most
@@ -138,10 +139,10 @@ public class OxmModelLoader {
         String latestVersionStr = null;
         for (String versionKey : versionContextMap.keySet()) {
 
-            Matcher matcher = versionPattern.matcher(versionKey.toUpperCase());
+            Matcher matcher = versionPattern.matcher(versionKey);
             if (matcher.find()) {
 
-                int currentVersion = Integer.parseInt(matcher.group(1));
+                int currentVersion = Integer.valueOf(matcher.group(1));
 
                 if ((latestVersion == null) || (currentVersion > latestVersion)) {
                     latestVersion = currentVersion;
@@ -153,38 +154,6 @@ public class OxmModelLoader {
         return latestVersionStr;
     }
 
-    /**
-     * Retrieves the list of all Loaded OXM versions.
-     *
-     * @return - A List of Strings of all loaded OXM versions.
-     *
-     * @throws CrudException
-     */
-    public static List<String> getLoadedOXMVersions() throws CrudException {
-
-        // If we haven't already loaded in the available OXM models, then do so now.
-        if (versionContextMap == null || versionContextMap.isEmpty()) {
-            loadModels();
-        }
-
-        // If there are still no models available, then there's not much we can do...
-        if (versionContextMap.isEmpty()) {
-            logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "No available OXM schemas to get versions for.");
-            throw new CrudException("No available OXM schemas to get versions for.",
-                    Status.INTERNAL_SERVER_ERROR);
-        }
-
-        List<String> versions = new ArrayList<String> ();
-        for (String versionKey : versionContextMap.keySet()) {
-
-            Matcher matcher = versionPattern.matcher(versionKey.toUpperCase());
-            if (matcher.find()) {
-                versions.add ( "V" + matcher.group ( 1 ) );
-            }
-        }
-        return versions;
-    }
-
     /**
      * Retrieves the map of all JAXB context objects that have been created by importing the
      * available OXM model schemas.
@@ -203,59 +172,89 @@ public class OxmModelLoader {
     public static void setVersionContextMap(Map<String, DynamicJAXBContext> versionContextMap) {
         OxmModelLoader.versionContextMap = versionContextMap;
     }
-    
-   
+
+
     public static void loadXmlLookupMap(String version, DynamicJAXBContext jaxbContext )  {
-      
-      @SuppressWarnings("rawtypes")
-      List<Descriptor> descriptorsList = jaxbContext.getXMLContext().getDescriptors();     
-      HashMap<String,DynamicType> types = new HashMap<String,DynamicType>();
 
-      for (@SuppressWarnings("rawtypes")
-      Descriptor desc : descriptorsList) {
+        @SuppressWarnings("rawtypes")
+        List<Descriptor> descriptorsList = jaxbContext.getXMLContext().getDescriptors();
+        HashMap<String, DynamicType> types = new HashMap<String, DynamicType>();
 
-        DynamicType entity = jaxbContext.getDynamicType(desc.getAlias());
-        String entityName = desc.getDefaultRootElement();
-        types.put(entityName, entity);
-      }
-      xmlElementLookup.put(version, types);
-    }
-    
-    
-  public static DynamicType getDynamicTypeForVersion(String version, String type) throws CrudException {
+        for (@SuppressWarnings("rawtypes")
+        Descriptor desc : descriptorsList) {
 
-    DynamicType dynamicType;
-    // If we haven't already loaded in the available OXM models, then do so now.
-    if (versionContextMap == null || versionContextMap.isEmpty()) {
-      loadModels();
-    } else if (!versionContextMap.containsKey(version)) {
-      logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "Error loading oxm model: " + version);
-      throw new CrudException("Error loading oxm model: " + version, Status.INTERNAL_SERVER_ERROR);
+            DynamicType entity = jaxbContext.getDynamicType(desc.getAlias());
+            String entityName = desc.getDefaultRootElement();
+            types.put(entityName, entity);
+        }
+        xmlElementLookup.put(version, types);
     }
 
-    // First try to match the Java-type based on hyphen to camel case translation
-    String javaTypeName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, type);
-    dynamicType = versionContextMap.get(version).getDynamicType(javaTypeName);
 
-    //Attempt to lookup in xml elements
-    if (xmlElementLookup.containsKey(version)) {
-      if (dynamicType == null) {
-        // Try to lookup by xml root element by exact match
-        dynamicType = xmlElementLookup.get(version).get(type);
+  public static DynamicType getDynamicTypeForVersion(String version, String type) throws CrudException {
+
+      DynamicType dynamicType;
+      // If we haven't already loaded in the available OXM models, then do so now.
+      if (versionContextMap == null || versionContextMap.isEmpty()) {
+          loadModels();
+      } else if (!versionContextMap.containsKey(version)) {
+          logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "Error loading oxm model: " + version);
+          throw new CrudException("Error loading oxm model: " + version, Status.INTERNAL_SERVER_ERROR);
       }
 
-      if (dynamicType == null) {
-        // Try to lookup by xml root element by lowercase
-        dynamicType = xmlElementLookup.get(version).get(type.toLowerCase());
+      // First try to match the Java-type based on hyphen to camel case
+      // translation
+      String javaTypeName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, type);
+      dynamicType = versionContextMap.get(version).getDynamicType(javaTypeName);
+
+      if (xmlElementLookup.containsKey(version)) {
+          if (dynamicType == null) {
+              // Try to lookup by xml root element by exact match
+              dynamicType = xmlElementLookup.get(version).get(type);
+          }
+
+          if (dynamicType == null) {
+              // Try to lookup by xml root element by lowercase
+              dynamicType = xmlElementLookup.get(version).get(type.toLowerCase());
+          }
+
+          if (dynamicType == null) {
+              // Direct lookup as java-type name
+              dynamicType = versionContextMap.get(version).getDynamicType(type);
+          }
       }
 
-      if (dynamicType == null) {
-        // Direct lookup as java-type name
-        dynamicType = versionContextMap.get(version).getDynamicType(type);
+      return dynamicType;
+  }
+
+  /**
+   * Retrieves the list of all Loaded OXM versions.
+   *
+   * @return - A List of Strings of all loaded OXM versions.
+   *
+   * @throws CrudException
+   */
+  public static List<String> getLoadedOXMVersions() throws CrudException {
+
+      // If we haven't already loaded in the available OXM models, then do so now.
+      if (versionContextMap == null || versionContextMap.isEmpty()) {
+          loadModels();
       }
-    }
 
-    return dynamicType;
+      // If there are still no models available, then there's not much we can do...
+      if (versionContextMap.isEmpty()) {
+          logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "No available OXM schemas to get versions for.");
+          throw new CrudException("No available OXM schemas to get versions for.", Status.INTERNAL_SERVER_ERROR);
+      }
 
+      List<String> versions = new ArrayList<String>();
+      for (String versionKey : versionContextMap.keySet()) {
+
+          Matcher matcher = versionPattern.matcher(versionKey);
+          if (matcher.find()) {
+              versions.add ("V"+ matcher.group(1));
+          }
+      }
+      return versions;
   }
 }