Adding UI extensibility
[aai/sparky-be.git] / src / main / java / org / onap / aai / sparky / autosuggestion / sync / AutosuggestionSynchronizer.java
@@ -20,7 +20,7 @@
  *
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
  */
-package org.onap.aai.sparky.synchronizer;
+package org.onap.aai.sparky.autosuggestion.sync;
 
 import static java.util.concurrent.CompletableFuture.supplyAsync;
 
@@ -40,25 +40,32 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Supplier;
 
+import org.onap.aai.cl.api.Logger;
+import org.onap.aai.cl.eelf.LoggerFactory;
+import org.onap.aai.cl.mdc.MdcContext;
+import org.onap.aai.restclient.client.OperationResult;
 import org.onap.aai.sparky.config.oxm.OxmEntityDescriptor;
+import org.onap.aai.sparky.config.oxm.OxmEntityLookup;
+import org.onap.aai.sparky.config.oxm.SuggestionEntityDescriptor;
+import org.onap.aai.sparky.config.oxm.SuggestionEntityLookup;
 import org.onap.aai.sparky.dal.NetworkTransaction;
 import org.onap.aai.sparky.dal.aai.config.ActiveInventoryConfig;
 import org.onap.aai.sparky.dal.rest.HttpMethod;
-import org.onap.aai.sparky.dal.rest.OperationResult;
 import org.onap.aai.sparky.logging.AaiUiMsgs;
-import org.onap.aai.sparky.synchronizer.config.SynchronizerConfiguration;
-import org.onap.aai.sparky.synchronizer.entity.SelfLinkDescriptor;
-import org.onap.aai.sparky.synchronizer.entity.SuggestionSearchEntity;
-import org.onap.aai.sparky.synchronizer.enumeration.OperationState;
-import org.onap.aai.sparky.synchronizer.enumeration.SynchronizerState;
-import org.onap.aai.sparky.synchronizer.task.PerformActiveInventoryRetrieval;
-import org.onap.aai.sparky.synchronizer.task.PerformElasticSearchPut;
-import org.onap.aai.sparky.synchronizer.task.PerformElasticSearchRetrieval;
+import org.onap.aai.sparky.sync.AbstractEntitySynchronizer;
+import org.onap.aai.sparky.sync.IndexSynchronizer;
+import org.onap.aai.sparky.sync.SynchronizerConstants;
+import org.onap.aai.sparky.sync.config.ElasticSearchSchemaConfig;
+import org.onap.aai.sparky.sync.config.NetworkStatisticsConfig;
+import org.onap.aai.sparky.sync.entity.SelfLinkDescriptor;
+import org.onap.aai.sparky.sync.entity.SuggestionSearchEntity;
+import org.onap.aai.sparky.sync.enumeration.OperationState;
+import org.onap.aai.sparky.sync.enumeration.SynchronizerState;
+import org.onap.aai.sparky.sync.task.PerformActiveInventoryRetrieval;
+import org.onap.aai.sparky.sync.task.PerformElasticSearchPut;
+import org.onap.aai.sparky.sync.task.PerformElasticSearchRetrieval;
 import org.onap.aai.sparky.util.NodeUtils;
 import org.onap.aai.sparky.util.SuggestionsPermutation;
-import org.onap.aai.cl.api.Logger;
-import org.onap.aai.cl.eelf.LoggerFactory;
-import org.onap.aai.cl.mdc.MdcContext;
 import org.slf4j.MDC;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -114,10 +121,11 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
    * @param indexName the index name
    * @throws Exception the exception
    */
-  public AutosuggestionSynchronizer(String indexName) throws Exception {
-    super(LOG, "ASES-" + indexName.toUpperCase(), 2, 5, 5, indexName); // multiple Autosuggestion
-                                                                       // Entity Synchronizer will
-                                                                       // run for different indices
+  public AutosuggestionSynchronizer(ElasticSearchSchemaConfig schemaConfig, int internalSyncWorkers,
+      int aaiWorkers, int esWorkers, NetworkStatisticsConfig aaiStatConfig,
+      NetworkStatisticsConfig esStatConfig) throws Exception {
+    super(LOG, "ASES-" + schemaConfig.getIndexName().toUpperCase(), internalSyncWorkers, aaiWorkers,
+        esWorkers, schemaConfig.getIndexName(), aaiStatConfig, esStatConfig);
 
     this.allWorkEnumerated = false;
     this.selflinks = new ConcurrentLinkedDeque<SelfLinkDescriptor>();
@@ -137,8 +145,8 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
    */
   private OperationState collectAllTheWork() {
     final Map<String, String> contextMap = MDC.getCopyOfContextMap();
-    Map<String, OxmEntityDescriptor> descriptorMap =
-        oxmModelLoader.getSuggestionSearchEntityDescriptors();
+    Map<String, SuggestionEntityDescriptor> descriptorMap =
+        SuggestionEntityLookup.getInstance().getSuggestionSearchEntityDescriptors();
 
     if (descriptorMap.isEmpty()) {
       LOG.error(AaiUiMsgs.ERROR_LOADING_OXM_SUGGESTIBLE_ENTITIES);
@@ -166,7 +174,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
             MDC.setContextMap(contextMap);
             OperationResult typeLinksResult = null;
             try {
-              typeLinksResult = aaiDataProvider.getSelfLinksByEntityType(key);
+              typeLinksResult = aaiAdapter.getSelfLinksByEntityType(key);
               aaiWorkOnHand.decrementAndGet();
               processEntityTypeSelfLinks(typeLinksResult);
             } catch (Exception exc) {
@@ -221,7 +229,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
   /*
    * (non-Javadoc)
    * 
-   * @see org.onap.aai.sparky.synchronizer.IndexSynchronizer#doSync()
+   * @see org.openecomp.sparky.synchronizer.IndexSynchronizer#doSync()
    */
   @Override
   public OperationState doSync() {
@@ -252,7 +260,6 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
         String message = "Could not deserialize JSON (representing operation result) as node tree. "
             + "Operation result = " + jsonResult + ". " + exc.getLocalizedMessage();
         LOG.error(AaiUiMsgs.JSON_PROCESSING_ERROR, message);
-        return;
       }
 
       JsonNode resultData = rootNode.get("result-data");
@@ -274,7 +281,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
 
           if (resourceType != null && resourceLink != null) {
 
-            descriptor = oxmModelLoader.getEntityDescriptor(resourceType);
+            descriptor = OxmEntityLookup.getInstance().getEntityDescriptors().get(resourceType);
 
             if (descriptor == null) {
               LOG.error(AaiUiMsgs.MISSING_ENTITY_DESCRIPTOR, resourceType);
@@ -282,7 +289,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
               continue;
             }
             selflinks.add(new SelfLinkDescriptor(resourceLink,
-                SynchronizerConfiguration.NODES_ONLY_MODIFIER, resourceType));
+                SynchronizerConstants.NODES_ONLY_MODIFIER, resourceType));
 
 
           }
@@ -305,7 +312,8 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
 
       if (linkDescriptor.getSelfLink() != null && linkDescriptor.getEntityType() != null) {
 
-        descriptor = oxmModelLoader.getEntityDescriptor(linkDescriptor.getEntityType());
+        descriptor = OxmEntityLookup.getInstance().getEntityDescriptors()
+            .get(linkDescriptor.getEntityType());
 
         if (descriptor == null) {
           LOG.error(AaiUiMsgs.MISSING_ENTITY_DESCRIPTOR, linkDescriptor.getEntityType());
@@ -321,7 +329,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
 
         aaiWorkOnHand.incrementAndGet();
 
-        supplyAsync(new PerformActiveInventoryRetrieval(txn, aaiDataProvider), aaiExecutor)
+        supplyAsync(new PerformActiveInventoryRetrieval(txn, aaiAdapter), aaiExecutor)
             .whenComplete((result, error) -> {
 
               aaiWorkOnHand.decrementAndGet();
@@ -354,9 +362,10 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
    * 
    * @return List of all valid suggestion attributes(key's)
    */
-  public List<String> getSuggestionFromReponse(JsonNode node, String entityName) {
+  public List<String> getSuggestableAttrNamesFromReponse(JsonNode node, String entityName) {
     List<String> suggestableAttr = new ArrayList<String>();
-    HashMap<String, String> desc = oxmModelLoader.getOxmModel().get(entityName);
+    HashMap<String, String> desc =
+        SuggestionEntityLookup.getInstance().getSuggestionSearchEntityOxmModel().get(entityName);
     String attr = desc.get("suggestibleAttributes");
     suggestableAttr = Arrays.asList(attr.split(","));
     List<String> suggestableValue = new ArrayList<>();
@@ -389,17 +398,19 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
         String entityName = txn.getDescriptor().getEntityName();
         JsonNode entityNode = mapper.readTree(jsonResult);
 
-        SuggestionsPermutation suggPermutation = new SuggestionsPermutation();
-        ArrayList<ArrayList<String>> uniqueLists = suggPermutation
-            .getSuggestionsPermutation(getSuggestionFromReponse(entityNode, entityName));
+        List<String> availableSuggestableAttrName =
+            getSuggestableAttrNamesFromReponse(entityNode, entityName);
 
+        ArrayList<ArrayList<String>> uniqueLists =
+            SuggestionsPermutation.getNonEmptyUniqueLists(availableSuggestableAttrName);
         // Now we have a list of all possible permutations for the status that are
         // defined for this entity type. Try inserting a document for every combination.
         for (ArrayList<String> uniqueList : uniqueLists) {
-          SuggestionSearchEntity sse = new SuggestionSearchEntity(oxmModelLoader);
+
+          SuggestionSearchEntity sse =
+              new SuggestionSearchEntity(SuggestionEntityLookup.getInstance());
           sse.setSuggestableAttr(uniqueList);
-          sse.setPayloadFromResponse(entityNode);
-          sse.setLink(txn.getLink());
+          sse.setFilterBasedPayloadFromResponse(entityNode, entityName, uniqueList);
           sse.setLink(ActiveInventoryConfig.extractResourcePath(txn.getLink()));
           populateSuggestionSearchEntityDocument(sse, jsonResult, txn);
           // The unique id for the document will be created at derive fields
@@ -422,7 +433,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
 
               esWorkOnHand.incrementAndGet();
 
-              supplyAsync(new PerformElasticSearchRetrieval(n2, esDataProvider), esExecutor)
+              supplyAsync(new PerformElasticSearchRetrieval(n2, elasticSearchAdapter), esExecutor)
                   .whenComplete((result, error) -> {
 
                     esWorkOnHand.decrementAndGet();
@@ -457,7 +468,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
     List<String> primaryKeyValues = new ArrayList<String>();
     String pkeyValue = null;
 
-    for (String keyName : resultDescriptor.getPrimaryKeyAttributeName()) {
+    for (String keyName : resultDescriptor.getPrimaryKeyAttributeNames()) {
       pkeyValue = NodeUtils.getNodeFieldAsText(entityNode, keyName);
       if (pkeyValue != null) {
         primaryKeyValues.add(pkeyValue);
@@ -516,7 +527,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
       try {
         String jsonPayload = null;
 
-        jsonPayload = sse.getIndexDocumentJson();
+        jsonPayload = sse.getAsJson();
         if (link != null && jsonPayload != null) {
 
           NetworkTransaction updateElasticTxn = new NetworkTransaction();
@@ -526,7 +537,8 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
           updateElasticTxn.setOperationType(HttpMethod.PUT);
 
           esWorkOnHand.incrementAndGet();
-          supplyAsync(new PerformElasticSearchPut(jsonPayload, updateElasticTxn, esDataProvider),
+          supplyAsync(
+              new PerformElasticSearchPut(jsonPayload, updateElasticTxn, elasticSearchAdapter),
               esPutExecutor).whenComplete((result, error) -> {
 
                 esWorkOnHand.decrementAndGet();
@@ -612,7 +624,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
            * called incrementAndGet when queuing the failed PUT!
            */
 
-          supplyAsync(new PerformElasticSearchRetrieval(retryTransaction, esDataProvider),
+          supplyAsync(new PerformElasticSearchRetrieval(retryTransaction, elasticSearchAdapter),
               esExecutor).whenComplete((result, error) -> {
 
                 esWorkOnHand.decrementAndGet();
@@ -673,7 +685,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
   /*
    * (non-Javadoc)
    * 
-   * @see org.onap.aai.sparky.synchronizer.IndexSynchronizer#getStatReport(boolean)
+   * @see org.openecomp.sparky.synchronizer.IndexSynchronizer#getStatReport(boolean)
    */
   @Override
   public String getStatReport(boolean showFinalReport) {
@@ -684,7 +696,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
   /*
    * (non-Javadoc)
    * 
-   * @see org.onap.aai.sparky.synchronizer.IndexSynchronizer#shutdown()
+   * @see org.openecomp.sparky.synchronizer.IndexSynchronizer#shutdown()
    */
   @Override
   public void shutdown() {
@@ -713,7 +725,7 @@ public class AutosuggestionSynchronizer extends AbstractEntitySynchronizer
   /*
    * (non-Javadoc)
    * 
-   * @see org.onap.aai.sparky.synchronizer.AbstractEntitySynchronizer#clearCache()
+   * @see org.openecomp.sparky.synchronizer.AbstractEntitySynchronizer#clearCache()
    */
   @Override
   public void clearCache() {