bug[TW19461]: Update syncConfigGroup rest call to use ApplicabilityBranchConfig structure

Change-Id: Ia13c1a0709872a0cd52db377674cee302a672553
Signed-off-by: Audrey Denk <audrey.e.denk@boeing.com>
diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/applicability/OrcsApplicabilityOps.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/applicability/OrcsApplicabilityOps.java
index 20aa5c8..8b26e78 100644
--- a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/applicability/OrcsApplicabilityOps.java
+++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/applicability/OrcsApplicabilityOps.java
@@ -1272,6 +1272,7 @@
             tx1.deleteTuple2(CoreTupleTypes.ViewApplicability, view, "ConfigurationGroup = " + currentGroup.getName());
             tx1.deleteTuple2(CoreTupleTypes.ViewApplicability, currentGroup, "Config = " + view.getName());
             tx1.commit();
+            syncConfigGroup(branch, currentGroup.getIdString(), account, results);
          }
 
          TransactionBuilder tx = orcsApi.getTransactionFactory().createTransaction(branch, user,
@@ -1280,6 +1281,8 @@
          tx.createApplicabilityForView(view, "ConfigurationGroup = " + cfgGroup.getName());
          tx.createApplicabilityForView(cfgGroup, "Config = " + view.getName());
          tx.commit();
+         syncConfigGroup(branch, cfgGroup.getIdString(), account, results);
+
       } catch (Exception ex) {
          results.error(Lib.exceptionToString(ex));
       }
@@ -1406,98 +1409,109 @@
                CoreRelationTypes.DefaultHierarchical_Parent, CoreArtifactTokens.PlCfgGroupsFolder).andNameEquals(
                   id).asArtifact();
       }
-
       if (cfgGroup.isValid()) {
          List<ArtifactReadable> views =
-            cfgGroup.getRelated(CoreRelationTypes.PlConfigurationGroup_BranchView).getList();
-         if (!views.isEmpty()) {
-            for (FeatureDefinition feature : getFeatureDefinitionData(branch)) {
+            orcsApi.getQueryFactory().fromBranch(branch).andIsOfType(CoreArtifactTypes.BranchView).andRelatedTo(
+               CoreRelationTypes.PlConfigurationGroup_Group, cfgGroup).asArtifacts();
+         ApplicabilityBranchConfig current = getConfig(branch, false);
+         ConfigurationGroupDefinition currentGroup =
+            current.getGroups().stream().filter(p -> p.getId().equals(id)).findFirst().get();
+         if (!currentGroup.getConfigurations().isEmpty()) {
+            for (ExtendedFeatureDefinition feature : current.getFeatures()) {
                String resultApp = null;
-               if (feature.getValues().contains("Included")) {
-                  resultApp = feature.getName() + " = Excluded";
-               }
-               List<String> memberValues = new ArrayList<>();
-               List<String> groupValues = new ArrayList<>();
-               for (ArtifactId viewId : views) {
-                  if (feature.isMultiValued()) {
-                     for (String appl : orcsApi.getQueryFactory().tupleQuery().getTuple2(
-                        CoreTupleTypes.ViewApplicability, branch, viewId)) {
+               List<String> memberApps = new ArrayList<>();
+               List<String> groupApps = new ArrayList<>();
+               String currentApp = "";
+               //applicability is the full text of [feature] = [value]
+               //the values stored in NameValuePair is just the right hand of the syntax
+               //in order to update the tuple the applicability must be constructed
 
-                        if (!memberValues.contains(appl) & appl.startsWith(
-                           feature.getName() + " =") & !appl.contains("|") & !appl.contains("&")) {
-                           //add to list of values on view
-                           memberValues.add(appl);
+               if (feature.isMultiValued()) {
+                  for (NameValuePair pair : feature.getConfigurations()) {
+
+                     //if the current name/value is for the group use this to populate the current apps in the group
+                     if (pair.getName().equals(cfgGroup.getName())) {
+                        for (String val : pair.getValues()) {
+                           groupApps.add(feature.getName() + " = " + val);
                         }
                      }
-                     for (String appl : orcsApi.getQueryFactory().tupleQuery().getTuple2(
-                        CoreTupleTypes.ViewApplicability, branch, cfgGroup)) {
+                     boolean isInGroup = !views.stream().noneMatch(v -> v.getName().equals(pair.getName()));
 
-                        if (!groupValues.contains(appl) & appl.startsWith(
-                           feature.getName() + " =") & !appl.contains("|") & !appl.contains("&")) {
-                           //add to list of values on view
-                           groupValues.add(appl);
+                     //if current name is not the group name populate the memberValues array which
+                     //represents what should be in the group
+                     if (isInGroup) {
+                        for (String val : pair.getValues()) {
+                           String applicability = feature.getName() + " = " + val;
+
+                           if (!memberApps.contains(applicability)) {
+                              memberApps.add(applicability);
+                           }
                         }
                      }
+                  }
+               } else {
+                  if (feature.getValues().contains("Included")) {
+                     resultApp = feature.getName() + " = Excluded";
+                  }
+                  for (NameValuePair pair : feature.getConfigurations()) {
+                     boolean isInGroup = false;
 
-                  } else {
-                     String applicability =
-                        orcsApi.getQueryFactory().applicabilityQuery().getExistingFeatureApplicability(branch, viewId,
-                           feature.getName());
-
-                     if (feature.getValues().contains("Included")) {
-                        if (applicability.equals(feature.getName() + " = Included")) {
-
-                           resultApp = applicability;
-                           break;
-                        }
+                     if (pair.getName().equals(cfgGroup.getName())) {
+                        currentApp = feature.getName() + " = " + pair.getValue();
                      } else {
-                        if (resultApp == null) {
-                           resultApp = applicability;
+                        isInGroup = !views.stream().noneMatch(v -> v.getName().equals(pair.getName()));
+                     }
+                     views.get(0).getName();
+                     if (isInGroup) {
+                        String applicability = feature.getName() + " = " + pair.getValue();
+                        if (feature.getValues().contains("Included")) {
+                           if (pair.getValue().equals("Included")) {
+
+                              resultApp = applicability;
+                              break;
+                           }
                         } else {
-                           if (!resultApp.equals(applicability)) {
-                              results.error(
-                                 "Updating Group: " + cfgGroup.getName() + " (" + views.toString() + "). Applicabilities differ for non-binary feature: " + feature.getName());
+                           if (resultApp == null) {
+                              resultApp = applicability;
+                           } else {
+                              if (!resultApp.equals(applicability)) {
+                                 results.error(
+                                    "Updating Group: " + cfgGroup.getName() + ". Applicabilities differ for non-binary feature: " + feature.getName());
+                              }
                            }
                         }
                      }
                   }
                }
-               if (!feature.isMultiValued() && results.isSuccess()) {
-                  String currentValue = orcsApi.getQueryFactory().applicabilityQuery().getExistingFeatureApplicability(
-                     branch, cfgGroup, feature.getName());
-                  if (!currentValue.equals(resultApp)) {
+
+               if (!feature.isMultiValued()) {
+
+                  if (!currentApp.equals(resultApp) && results.isSuccess()) {
                      TransactionBuilder tx =
                         orcsApi.getTransactionFactory().createTransaction(branch, user, "Set applicability for view");
-                     tx.deleteTuple2(CoreTupleTypes.ViewApplicability, cfgGroup, currentValue);
+                     tx.deleteTuple2(CoreTupleTypes.ViewApplicability, cfgGroup, currentApp);
                      tx.createApplicabilityForView(cfgGroup, resultApp);
                      tx.commit();
                   }
-               } else {
+               } else if (results.isSuccess()) {
                   TransactionBuilder tx2 =
                      orcsApi.getTransactionFactory().createTransaction(branch, user, "Set applicability for view");
 
-                  List<String> removeValues = new ArrayList<>(groupValues);
+                  List<String> removeValues = new ArrayList<>(groupApps);
                   //groupValues minus memberValues = values to remove
-                  removeValues.removeAll(memberValues);
+                  removeValues.removeAll(memberApps);
                   for (String val : removeValues) {
                      tx2.deleteTuple2(CoreTupleTypes.ViewApplicability, cfgGroup, val);
                   }
                   //memberValues minus groupValues = values to add
-                  memberValues.removeAll(groupValues);
-                  for (String val : memberValues) {
+                  memberApps.removeAll(groupApps);
+                  for (String val : memberApps) {
                      tx2.createApplicabilityForView(cfgGroup, val);
                   }
                   tx2.commit();
                }
             }
-            for (ArtifactId viewId : views) {
-               for (ApplicabilityToken applicabilityToken : orcsApi.getQueryFactory().applicabilityQuery().getViewApplicabilityTokens(
-                  viewId, branch)) {
-                  if (applicabilityToken.getName().contains("|") || applicabilityToken.getName().contains("&")) {
-                     createApplicabilityForView(cfgGroup, applicabilityToken.getName(), user, branch);
-                  }
-               }
-            }
+            updateCompoundApplicabilities(branch, cfgGroup, user, true);
          }
       } else {
          results.error("Invalid Configuration Group name.");