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