Integrate aai-schema-ingest library into aai-core
[aai/aai-common.git] / aai-schema-ingest / src / main / java / org / onap / aai / nodes / NodeIngestor.java
index bafc6b3..9523238 100644 (file)
@@ -1,8 +1,8 @@
-/** 
+/**
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-18 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,8 +16,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  * ============LICENSE_END=========================================================
- *
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.
  */
 
 package org.onap.aai.nodes;
@@ -27,14 +25,17 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.*;
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
-import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import javax.xml.XMLConstants;
 import javax.xml.bind.JAXBException;
@@ -45,11 +46,13 @@ import javax.xml.parsers.ParserConfigurationException;
 import org.eclipse.persistence.jaxb.JAXBContextProperties;
 import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
 import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory;
+
 import org.onap.aai.setup.ConfigTranslator;
-import org.onap.aai.setup.Version;
+import org.onap.aai.setup.SchemaVersion;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.w3c.dom.Document;
+import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
@@ -60,87 +63,133 @@ import com.google.common.base.CaseFormat;
  * NodeIngestor - ingests A&AI OXM files per given config, serves DynamicJAXBContext per version
  */
 public class NodeIngestor {
-       
-       private Map<Version, DynamicJAXBContext> versionContextMap = new EnumMap<>(Version.class);
-       private Map<Version, Set<String>> typesPerVersion = new EnumMap<>(Version.class);
-       
+
+
+       private Map<SchemaVersion, DynamicJAXBContext> versionContextMap = new TreeMap<>();
+       private Map<SchemaVersion, Set<String>> typesPerVersion = new TreeMap<>();
+       private Map<SchemaVersion, Document> schemaPerVersion = new TreeMap<>();
+       private static final Pattern classNamePattern = Pattern.compile("\\.(v\\d+)\\.");
+
+       private ConfigTranslator translator;
+
+
        @Autowired
        /**
         * Instantiates the NodeIngestor bean.
-        * 
+        *
         * @param translator - ConfigTranslator autowired in by Spring framework which
         * contains the configuration information needed to ingest the desired files.
         */
        public NodeIngestor(ConfigTranslator translator) {
-               Map<Version, List<String>> filesToIngest = translator.getNodeFiles();
-               
+               this.translator = translator;
+               Map<SchemaVersion, List<String>> filesToIngest = translator.getNodeFiles();
+
                try {
-                       for (Entry<Version, List<String>> verFiles : filesToIngest.entrySet()) {
-                               Version v = verFiles.getKey();
+                       for (Entry<SchemaVersion, List<String>> verFiles : filesToIngest.entrySet()) {
+                               SchemaVersion v = verFiles.getKey();
                                List<String> files = verFiles.getValue();
                                final DynamicJAXBContext ctx = ingest(files);
                                versionContextMap.put(v, ctx);
                                typesPerVersion.put(v, getAllNodeTypes(files));
+                               schemaPerVersion.put(v, createCombinedSchema(files, v));
                        }
                } catch (JAXBException | ParserConfigurationException | SAXException | IOException e) {
                        throw new ExceptionInInitializerError(e);
                }
        }
-       
+
        /**
         * Ingests the given OXM files into DynamicJAXBContext
-        * 
+        *
         * @param files - List<String> of full filenames (ie including the path) to be ingested
-        * 
+        *
         * @return DynamicJAXBContext including schema information from all given files
-        * 
+        *
         * @throws FileNotFoundException if an OXM file can't be found
         * @throws JAXBException if there's an error creating the DynamicJAXBContext
         */
        private DynamicJAXBContext ingest(List<String> files) throws FileNotFoundException, JAXBException {
                List<InputStream> streams = new ArrayList<>();
-               
+
                for (String name : files) {
                        streams.add(new FileInputStream(new File(name)));
                }
-               
-               Map<String, Object> properties = new HashMap<>(); 
+
+               Map<String, Object> properties = new HashMap<>();
                properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, streams);
                return DynamicJAXBContextFactory.createContextFromOXM(this.getClass().getClassLoader(), properties);
        }
-       
+
+
+
        private Set<String> getAllNodeTypes(List<String> files) throws ParserConfigurationException, SAXException, IOException {
                Set<String> types = new HashSet<>();
-               
                final DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
                docFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
                final DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
-               
+
+               ArrayList<Node> javaTypes = new ArrayList<Node>();
                for (String file : files) {
                        InputStream inputStream = new FileInputStream(file);
-                       
+
                        final Document doc = docBuilder.parse(inputStream);
                        final NodeList list = doc.getElementsByTagName("java-type");
-                       
+
                        for (int i = 0; i < list.getLength(); i++) {
                                String type = list.item(i).getAttributes().getNamedItem("name").getNodeValue();
+                               javaTypes.add(list.item(i));
                                types.add(CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, type));
                        }
                }
-               
+
                return types;
        }
+       
+       private Document createCombinedSchema(List<String> files,SchemaVersion v) throws ParserConfigurationException, SAXException, IOException {
+               final DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+               docFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+               final DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+               DocumentBuilder masterDocBuilder = docFactory.newDocumentBuilder();
+               Document combinedDoc = masterDocBuilder.parse(getShell(v));
+               NodeList masterList = combinedDoc.getElementsByTagName("java-types");
+               Node javaTypesContainer = masterList.getLength() == 0 ? combinedDoc.getDocumentElement() : masterList.item(0);
+               for (String file : files) {
+                       InputStream inputStream = new FileInputStream(file);
+                       
+                       final Document doc = docBuilder.parse(inputStream);
+                       final NodeList list = doc.getElementsByTagName("java-type");
+                       for (int i = 0; i < list.getLength(); i++) {
+                               Node copy = combinedDoc.importNode(list.item(i),true);
+                               javaTypesContainer.appendChild(copy);
+                       }
+               }               
+               return combinedDoc;
+       }
 
        /**
         * Gets the DynamicJAXBContext for the given version
-        * 
-        * @param Version v
+        *
+        * @param v
         * @return DynamicJAXBContext
         */
-       public DynamicJAXBContext getContextForVersion(Version v) {
+       public DynamicJAXBContext getContextForVersion(SchemaVersion v) {
                return versionContextMap.get(v);
        }
-       
+
+       /**
+        * Determines if the given version contains the given node type
+        *
+        * @param nodeType - node type to check, must be in lower hyphen form (ie "type-name")
+        * @param v - schema version to check against
+        * @return
+        */
+       public boolean hasNodeType(String nodeType, SchemaVersion v) {
+               return typesPerVersion.get(v).contains(nodeType);
+       }
+
+       public Set<String> getObjectsInVersion(SchemaVersion v){
+               return typesPerVersion.get(v);
+       }
        /**
         * Determines if the given version contains the given node type
         * 
@@ -148,7 +197,33 @@ public class NodeIngestor {
         * @param v
         * @return
         */
-       public boolean hasNodeType(String nodeType, Version v) {
-               return typesPerVersion.get(v).contains(nodeType);
+       public Document getSchema(SchemaVersion v) {
+               return schemaPerVersion.get(v);
+       }
+       
+       private InputStream getShell(SchemaVersion v) {
+               String source = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
+                               "<xml-bindings xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence/oxm\" package-name=\"inventory.aai.onap.org."+v.toString().toLowerCase()+"\" xml-mapping-metadata-complete=\"true\">\n" + 
+                               "       <xml-schema element-form-default=\"QUALIFIED\">\n" + 
+                               "               <xml-ns namespace-uri=\"http://org.onap.aai.inventory/"+v.toString().toLowerCase()+"\" />\n" + 
+                               "       </xml-schema>\n" + 
+                               "       <java-types>\n" + 
+                               "       </java-types>\\n" + 
+                               "</xml-bindings>";
+//             source.rep.replace("v11", v.toString());
+               return new ByteArrayInputStream(source.getBytes(StandardCharsets.UTF_8));
+       }
+               
+
+       public SchemaVersion getVersionFromClassName (String classname) {
+               Matcher m = classNamePattern.matcher(classname);
+               String version = null;
+               if (m.find()) {
+                       version = m.group(1);
+                       return new SchemaVersion(version);
+               } else {
+                   return translator.getSchemaVersions().getDefaultVersion();
+               }
        }
 }
+