From 2751514439832ddeb4e3b871ac94e8bd0fa54a08 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Wed, 15 Aug 2018 09:19:58 +0200
Subject: [PATCH] add attribute for potentially valid implementations

---
 .../src/main/jastadd/solution/Checking.jrag   | 72 +++++++++++++++++++
 1 file changed, 72 insertions(+)

diff --git a/jastadd-mquat-base/src/main/jastadd/solution/Checking.jrag b/jastadd-mquat-base/src/main/jastadd/solution/Checking.jrag
index fc58798..e630503 100644
--- a/jastadd-mquat-base/src/main/jastadd/solution/Checking.jrag
+++ b/jastadd-mquat-base/src/main/jastadd/solution/Checking.jrag
@@ -136,4 +136,76 @@ aspect Checking {
     throw new RuntimeException("Objective could not be computed!");
   }
 
+
+  syn java.util.List<Implementation> Component.locallyValidImplementations(Request request) {
+    java.util.List<Implementation> locallyValidImplementations = new java.util.ArrayList<>();
+
+    for (Implementation implementation : this.getImplementationList()) {
+      Assignment assignment = new Assignment();
+      assignment.setTopLevel(true);
+      assignment.setRequest(request);
+      assignment.setImplementation(implementation);
+      boolean fitting = true;
+      for (Clause clause : request.getConstraintList()) {
+        if (clause.isRequiringClause() && clause.getDesignator().isSoftwareDesignator()) {
+          if (!clause.checkUsing(assignment)) {
+            fitting = false;
+            logger.info("found a not fitting top level impl");
+            break;
+          }
+        }
+      }
+
+      if (fitting) {
+        locallyValidImplementations.add(implementation);
+      }
+
+    }
+    return locallyValidImplementations;
+  }
+
+  syn java.util.List<Implementation> Component.locallyValidImplementations(Request request, Implementation parentImplementation, Instance instance) {
+    Assignment assignment = new Assignment();
+    assignment.setTopLevel(false);
+    assignment.setRequest(request);
+    assignment.setImplementation(parentImplementation);
+
+    java.util.List<Implementation> locallyValidImplementations = new java.util.ArrayList<>();
+
+      for (Implementation implementation : this.getImplementationList()) {
+        Assignment subAssignment = new Assignment();
+        subAssignment.setTopLevel(false);
+        subAssignment.setRequest(assignment.getRequest());
+        subAssignment.setImplementation(implementation);
+        ComponentMapping mapping = new ComponentMapping(instance, subAssignment);
+        int mappingIndex = 0;
+        for (; mappingIndex < assignment.getNumComponentMapping(); mappingIndex++) {
+          if (assignment.getComponentMapping(mappingIndex).getInstance() == instance) {
+            break;
+          }
+        }
+        assignment.setComponentMapping(mapping, mappingIndex);
+        boolean fitting = true;
+        for (Clause clause : assignment.getImplementation().getClauseList()) {
+          if (clause.isRequiringClause() && clause.getDesignator().isSoftwareDesignator()) {
+            if (clause.getDesignator().asSoftwareDesignator().getInstanceRef().getRef() == instance) {
+              if (!clause.checkUsing(assignment)) {
+                fitting = false;
+                logger.info("found a not fitting impl");
+                break;
+              }
+            }
+
+          }
+        }
+        assignment.getComponentMappingList().removeChild(mappingIndex);
+
+        if (fitting) {
+          locallyValidImplementations.add(implementation);
+        }
+
+      }
+      return locallyValidImplementations;
+  }
+
 }
-- 
GitLab