Improve the performance of resoures microservice
[aai/aai-common.git] / aai-core / src / main / java / org / onap / aai / introspection / MoxyLoader.java
index cf81349..fa52d62 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2018 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.introspection;
 
@@ -25,6 +23,7 @@ import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 import com.google.common.base.CaseFormat;
 import com.google.common.collect.ImmutableMap;
+
 import org.eclipse.persistence.dynamic.DynamicEntity;
 import org.eclipse.persistence.jaxb.UnmarshallerProperties;
 import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
@@ -32,24 +31,21 @@ import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
 import org.onap.aai.introspection.exceptions.AAIUnmarshallingException;
 import org.onap.aai.logging.ErrorLogHelper;
+import org.onap.aai.logging.LogFormatTools;
+import org.onap.aai.nodes.NodeIngestor;
 import org.onap.aai.restcore.MediaType;
+import org.onap.aai.schema.enums.ObjectMetadata;
+import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.workarounds.NamingExceptions;
-import org.w3c.dom.Document;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-import javax.xml.XMLConstants;
+import org.springframework.stereotype.Component;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Unmarshaller;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.stream.StreamSource;
-import java.io.IOException;
-import java.io.StringReader;
+import java.io.*;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 public class MoxyLoader extends Loader {
 
@@ -57,27 +53,32 @@ public class MoxyLoader extends Loader {
        private EELFLogger LOGGER = EELFManager.getInstance().getLogger(MoxyLoader.class);
        private Map<String, Introspector> allObjs = null;
 
-       /**
-        * Instantiates a new moxy loader.
-        *
-        * @param version the version
-        * @param llBuilder the ll builder
-        */
-       protected MoxyLoader(Version version) {
+       private Map<SchemaVersion, MoxyLoader> moxyLoaderFactory;
+
+       private NodeIngestor nodeIngestor;
+
+       private Set<String> namedProps;
+
+       public MoxyLoader(SchemaVersion version, NodeIngestor nodeIngestor) {
                super(version, ModelType.MOXY);
+               this.nodeIngestor = nodeIngestor;
                process(version);
        }
 
+       public MoxyLoader getMoxyLoader(SchemaVersion v) {
+               return moxyLoaderFactory.get(v);
+
+       }
        /**
         * {@inheritDoc}
-        * @throws AAIUnknownObjectException 
+        * @throws AAIUnknownObjectException
         */
        @Override
        public Introspector introspectorFromName(String name) throws AAIUnknownObjectException {
 
                return IntrospectorFactory.newInstance(ModelType.MOXY, objectFromName(name));
        }
-       
+
        /**
         * {@inheritDoc}
         */
@@ -96,7 +97,7 @@ public class MoxyLoader extends Loader {
                } else {
                        upperCamel = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, sanitizedName);
                }
-               
+
                try {
                        final DynamicEntity result = jaxbContext.newDynamicEntity(upperCamel);
 
@@ -113,17 +114,19 @@ public class MoxyLoader extends Loader {
         * {@inheritDoc}
         */
        @Override
-       protected void process(Version version) {
-               ModelInjestor injestor = ModelInjestor.getInstance();
-               jaxbContext = injestor.getContextForVersion(version);
-               
+       protected void process(SchemaVersion version) {
+               /*
+                * We need to have just same JaxbContext for each version
+                */
+               jaxbContext = nodeIngestor.getContextForVersion(version);
+
        }
 
        /**
         * {@inheritDoc}
         */
        @Override
-       public Introspector unmarshal(String type, String json, MediaType mediaType) throws AAIUnmarshallingException {         
+       public Introspector unmarshal(String type, String json, MediaType mediaType) throws AAIUnmarshallingException {
                try {
                        final Object clazz = objectFromName(type);
                        final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
@@ -144,7 +147,7 @@ public class MoxyLoader extends Loader {
                        throw new AAIUnmarshallingException("Could not unmarshall: " + e.getMessage(), e);
                }
        }
-       
+
        @Override
        public Map<String, Introspector> getAllObjects() {
                if (this.allObjs != null) {
@@ -157,40 +160,59 @@ public class MoxyLoader extends Loader {
                                        Introspector introspector = this.introspectorFromName(objName);
                                        map.put(introspector.getDbName(), introspector);
                                } catch (AAIUnknownObjectException e) {
-                                       LOGGER.warn("Unexpected AAIUnknownObjectException while running getAllObjects()", e);
+                                       LOGGER.warn("Unexpected AAIUnknownObjectException while running getAllObjects() " + LogFormatTools.getStackTop(e));
                                }
                        }
                        allObjs = map.build();
                        return allObjs;
                }
        }
-       
+
        private Set<String> objectsInVersion() {
-               final Set<String> result = new HashSet<>();
+                Set<String> result = new HashSet<>();
 
                try {
-                       final DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
-                       final String fileName = ModelInjestor.getInstance().getOXMFileName(getVersion());
-
-                       docFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+                result = nodeIngestor.getObjectsInVersion(getVersion());
 
-                       final DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
-                       final Document doc = docBuilder.parse(fileName);
-                       final NodeList list = doc.getElementsByTagName("java-type");
-
-                       for (int i = 0; i < list.getLength(); i++) {
-                               result.add(list.item(i).getAttributes().getNamedItem("name").getNodeValue());
-                       }
-               } catch (ParserConfigurationException | SAXException | IOException e) {
-                       LOGGER.warn("Exception while enumerating objects for API version " + getVersion() + " (returning partial results)", e);
+               } catch (Exception e) {
+                       LOGGER.warn("Exception while enumerating objects for API version " + getVersion() + " (returning partial results) " + LogFormatTools.getStackTop(e));
                }
 
                //result.remove("EdgePropNames");
                return result;
        }
-       
+
+       @Override
+       public Set<String> getNamedPropNodes(){
+
+        if(namedProps == null){
+               namedProps = getAllObjects()
+                .entrySet()
+                .stream()
+                .filter(
+                    (entry) -> entry.getValue().getMetadata(ObjectMetadata.NAME_PROPS) != null
+                ).map(entry -> entry.getKey()).collect(Collectors.toSet());
+        }
+
+        return namedProps;
+    }
        public DynamicJAXBContext getJAXBContext() {
                return this.jaxbContext;
        }
 
+       /*
+        * Im keeping this for now - Just in case
+        */
+       /*private static class Helper {
+               private static final Map<SchemaVersion, MoxyLoader> INSTANCEMAP = new ConcurrentHashMap<>();
+
+               private Helper() {}
+
+               private static MoxyLoader getLoaderBySchemaVersion(SchemaVersion v) {
+                       if (!INSTANCEMAP.containsKey(v)) {
+                               INSTANCEMAP.put(v, new MoxyLoader(v, nodeIngestor));
+                       }
+                       return INSTANCEMAP.get(v);
+               }
+       }*/
 }