From a40854963937c1d6272667e7d41f055da786388f Mon Sep 17 00:00:00 2001 From: Niels Vistisen Date: Fri, 30 Jul 2021 12:41:44 +0200 Subject: [PATCH 1/3] WIP: Global and System declarations removed (not compilable) --- src/main/java/ecdar/abstractions/Project.java | 59 ++----------------- .../java/ecdar/backend/EcdarDocument.java | 6 -- .../controllers/ProjectPaneController.java | 16 ----- .../java/ecdar/mutation/ExportHandler.java | 2 - .../mutation/TestCaseGenerationHandler.java | 2 - 5 files changed, 5 insertions(+), 80 deletions(-) diff --git a/src/main/java/ecdar/abstractions/Project.java b/src/main/java/ecdar/abstractions/Project.java index 5ffac4b7..b7b0f5ee 100644 --- a/src/main/java/ecdar/abstractions/Project.java +++ b/src/main/java/ecdar/abstractions/Project.java @@ -21,8 +21,6 @@ * A project of models. */ public class Project { - private final static String GLOBAL_DCL_FILENAME = "GlobalDeclarations"; - private final static String SYSTEM_DCL_FILENAME = "SystemDeclarations"; private final static String QUERIES_FILENAME = "Queries"; private final static String JSON_FILENAME_EXTENSION = ".json"; private static final String FOLDER_NAME_COMPONENTS = "Components"; @@ -33,16 +31,12 @@ public class Project { private final ObservableList components; private final ObservableList systems; private final ObservableList testPlans; - private final ObjectProperty globalDeclarations; - private final ObjectProperty systemDeclarations; public Project() { queries = FXCollections.observableArrayList(); components = FXCollections.observableArrayList(); systems = FXCollections.observableArrayList(); testPlans = FXCollections.observableArrayList(); - globalDeclarations = new SimpleObjectProperty<>(new Declarations("Global Declarations")); - systemDeclarations = new SimpleObjectProperty<>(new Declarations("System Declarations")); } public ObservableList getQueries() { @@ -61,22 +55,6 @@ public ObservableList getTestPlans() { return testPlans; } - public Declarations getGlobalDeclarations() { - return globalDeclarations.get(); - } - - public void setGlobalDeclarations(final Declarations declarations) { - globalDeclarations.set(declarations); - } - - public Declarations getSystemDeclarations() { - return systemDeclarations.get(); - } - - public void setSystemDeclarations(final Declarations declarations) { - systemDeclarations.set(declarations); - } - /** * Serializes and stores this as JSON files at a given directory. * @param directory object containing path to the desired directory to store at @@ -90,20 +68,6 @@ public void serialize(final File directory) throws IOException { FileUtils.forceMkdir(new File(Ecdar.projectDirectory.getValue() + File.separator + FOLDER_NAME_SYSTEMS)); FileUtils.forceMkdir(new File(Ecdar.projectDirectory.getValue() + File.separator + FOLDER_NAME_TESTS)); - { - // Save global declarations - final Writer globalWriter = getSaveFileWriter(GLOBAL_DCL_FILENAME); - getNewGson().toJson(getGlobalDeclarations().serialize(), globalWriter); - globalWriter.close(); - } - - { - // Save system declarations - final Writer systemDclWriter = getSaveFileWriter(SYSTEM_DCL_FILENAME); - getNewGson().toJson(getSystemDeclarations().serialize(), systemDclWriter); - systemDclWriter.close(); - } - // Save components for (final Component component : getComponents()) { final Writer writer = getSaveFileWriter(component.getName(), FOLDER_NAME_COMPONENTS); @@ -206,21 +170,11 @@ public void deserialize(final File projectFolder) throws IOException { private void deserializeFileHelper(final File file) throws IOException { final String fileContent = Files.toString(file, Charset.defaultCharset()); - switch (file.getName()) { - case GLOBAL_DCL_FILENAME + JSON_FILENAME_EXTENSION: - final JsonObject globalJsonObj = new JsonParser().parse(fileContent).getAsJsonObject(); - setGlobalDeclarations(new Declarations(globalJsonObj)); - break; - case SYSTEM_DCL_FILENAME + JSON_FILENAME_EXTENSION: - final JsonObject sysJsonObj = new JsonParser().parse(fileContent).getAsJsonObject(); - setSystemDeclarations(new Declarations(sysJsonObj)); - break; - case QUERIES_FILENAME + JSON_FILENAME_EXTENSION: - new JsonParser().parse(fileContent).getAsJsonArray().forEach(jsonElement -> { - final Query newQuery = new Query((JsonObject) jsonElement); - getQueries().add(newQuery); - }); - break; + if ((QUERIES_FILENAME + JSON_FILENAME_EXTENSION).equals(file.getName())) { + new JsonParser().parse(fileContent).getAsJsonArray().forEach(jsonElement -> { + final Query newQuery = new Query((JsonObject) jsonElement); + getQueries().add(newQuery); + }); } } @@ -361,9 +315,6 @@ public void reset() { * Be sure to disable code analysis before call and enable after call. */ public void clean() { - getGlobalDeclarations().clearDeclarationsText(); - getSystemDeclarations().clearDeclarationsText(); - queries.clear(); components.clear(); diff --git a/src/main/java/ecdar/backend/EcdarDocument.java b/src/main/java/ecdar/backend/EcdarDocument.java index 2ae09c95..68737271 100644 --- a/src/main/java/ecdar/backend/EcdarDocument.java +++ b/src/main/java/ecdar/backend/EcdarDocument.java @@ -66,12 +66,6 @@ private void generateXmlDocument(final Project project) throws BackendException for (final Component component : project.getComponents()) { generateAndAddTemplate(component); } - - // Set global declarations - xmlDocument.setProperty(DECLARATION_PROPERTY_TAG, project.getGlobalDeclarations().getDeclarationsText()); - - // Set the system declaration - xmlDocument.setProperty(SYSTEM_DCL_TAG, project.getSystemDeclarations().getDeclarationsText()); } /** diff --git a/src/main/java/ecdar/controllers/ProjectPaneController.java b/src/main/java/ecdar/controllers/ProjectPaneController.java index 9974d6f7..1da20e99 100644 --- a/src/main/java/ecdar/controllers/ProjectPaneController.java +++ b/src/main/java/ecdar/controllers/ProjectPaneController.java @@ -47,22 +47,6 @@ public class ProjectPaneController implements Initializable { @Override public void initialize(final URL location, final ResourceBundle resources) { - // Bind global declarations and add mouse event - final FilePresentation globalDclPresentation = new FilePresentation(Ecdar.getProject().getGlobalDeclarations()); - globalDclPresentation.setOnMousePressed(event -> { - event.consume(); - EcdarController.getActiveCanvasPresentation().getController().setActiveModel(Ecdar.getProject().getGlobalDeclarations()); - }); - filesList.getChildren().add(globalDclPresentation); - - // Bind system declarations and add mouse event - final FilePresentation systemDclPresentation = new FilePresentation(Ecdar.getProject().getSystemDeclarations()); - systemDclPresentation.setOnMousePressed(event -> { - event.consume(); - EcdarController.getActiveCanvasPresentation().getController().setActiveModel(Ecdar.getProject().getSystemDeclarations()); - }); - filesList.getChildren().add(systemDclPresentation); - Ecdar.getProject().getComponents().addListener(new ListChangeListener() { @Override public void onChanged(final Change c) { diff --git a/src/main/java/ecdar/mutation/ExportHandler.java b/src/main/java/ecdar/mutation/ExportHandler.java index 8fee2c4e..4572e460 100644 --- a/src/main/java/ecdar/mutation/ExportHandler.java +++ b/src/main/java/ecdar/mutation/ExportHandler.java @@ -139,9 +139,7 @@ private static void storeMutantXml(final MutationTestCase testCase) throws Backe // make a project with the mutant final Project project = new Project(); project.getComponents().add(mutant); - project.setGlobalDeclarations(Ecdar.getProject().getGlobalDeclarations()); mutant.updateIOList(); // Update io in order to get the right system declarations for the mutant - project.setSystemDeclarations(new SimpleComponentsSystemDeclarations(mutant)); BackendHelper.storeBackendModel(project, "mutants" + File.separator + "xml", testCase.getId()); } diff --git a/src/main/java/ecdar/mutation/TestCaseGenerationHandler.java b/src/main/java/ecdar/mutation/TestCaseGenerationHandler.java index e11399d3..e089a13b 100644 --- a/src/main/java/ecdar/mutation/TestCaseGenerationHandler.java +++ b/src/main/java/ecdar/mutation/TestCaseGenerationHandler.java @@ -149,9 +149,7 @@ private void generateTestCase(final MutationTestCase testCase, final int tries) final Project project = new Project(); mutant.setName(MutationTestPlanController.MUTANT_NAME); project.getComponents().addAll(testModel, mutant); - project.setGlobalDeclarations(Ecdar.getProject().getGlobalDeclarations()); mutant.updateIOList(); // Update io in order to get the right system declarations for the mutant - project.setSystemDeclarations(new SimpleComponentsSystemDeclarations(testModel, mutant)); new Thread(() -> { try { From 6789b2b4626a2f3eef96afa85911011855e7ac31 Mon Sep 17 00:00:00 2001 From: Niels Vistisen Date: Wed, 4 Aug 2021 13:03:43 +0200 Subject: [PATCH 2/3] WIP: Initial implementation --- .../java/ecdar/abstractions/Component.java | 40 ++++++++++++++++++- .../controllers/CanvasShellController.java | 1 + 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/main/java/ecdar/abstractions/Component.java b/src/main/java/ecdar/abstractions/Component.java index db099a8e..19e4dc67 100644 --- a/src/main/java/ecdar/abstractions/Component.java +++ b/src/main/java/ecdar/abstractions/Component.java @@ -19,6 +19,7 @@ import javafx.collections.ObservableList; import javafx.collections.transformation.FilteredList; import javafx.util.Pair; +import jdk.swing.interop.SwingInterOpUtils; import org.apache.commons.lang3.tuple.Triple; import java.util.*; @@ -895,7 +896,13 @@ public List getLocalVariables() { * @return Triples containing (left) name of the variable, (middle) lower bound, (right) upper bound */ public List> getLocalVariablesWithBounds() { - final List> typedefs = Ecdar.getProject().getGlobalDeclarations().getTypedefs(); + final List> types = new ArrayList<>(); + + final Matcher typeDefMatcher = Pattern.compile(".*typedef\\s+int\\s*\\[(\\d+)\\s*,\\s*(\\d+)]\\s*(\\w*)\\s*;.*").matcher(getTypeDefsFromAllComponents()); + + while (typeDefMatcher.find()) { + types.add(Triple.of(typeDefMatcher.group(3), Integer.parseInt(typeDefMatcher.group(1)), Integer.parseInt(typeDefMatcher.group(2)))); + } final List> locals = new ArrayList<>(); @@ -903,7 +910,7 @@ public List> getLocalVariablesWithBounds() { final Matcher matcher = Pattern.compile("^\\s*(\\w+)\\s+(\\w+)(\\W|$)").matcher(statement); if (!matcher.find()) return; - final Optional> typedef = typedefs.stream() + final Optional> typedef = types.stream() .filter(def -> def.getLeft().equals(matcher.group(1))).findAny(); if (!typedef.isPresent()) return; @@ -913,6 +920,35 @@ public List> getLocalVariablesWithBounds() { return locals; } + private String getTypeDefsFromAllComponents() { + final StringBuilder typeDefs = new StringBuilder("broadcast chan "); + final ArrayList channels = new ArrayList<>(); + + Ecdar.getProject().getComponents().forEach(c -> { + c.outputStrings.forEach(output -> { + if (!channels.contains(output)) { + channels.add(output); + } + }); + + c.inputStrings.forEach(input -> { + if (!channels.contains(input)) { + channels.add(input); + } + }); + }); + + for (String chan : channels) { + typeDefs.append(chan).append(", "); + } + + if (typeDefs.toString().endsWith("chan ")) return ""; + + typeDefs.delete(typeDefs.length() - 2, typeDefs.length()).append(";"); + + return typeDefs.toString(); + } + /** * Gets the first occurring universal location in this component. * @return the first universal location, or null if none exists diff --git a/src/main/java/ecdar/controllers/CanvasShellController.java b/src/main/java/ecdar/controllers/CanvasShellController.java index 2abf7cb3..0e419ace 100644 --- a/src/main/java/ecdar/controllers/CanvasShellController.java +++ b/src/main/java/ecdar/controllers/CanvasShellController.java @@ -1,6 +1,7 @@ package ecdar.controllers; import com.jfoenix.controls.JFXRippler; +import ecdar.Ecdar; import ecdar.abstractions.Component; import ecdar.presentations.CanvasPresentation; import ecdar.utility.helpers.ZoomHelper; From 7a1e907c8edb43085e89558271fccf100cd10b65 Mon Sep 17 00:00:00 2001 From: Niels Vistisen Date: Thu, 12 Aug 2021 16:04:34 +0200 Subject: [PATCH 3/3] Global Declaration re-added --- .../java/ecdar/abstractions/Component.java | 40 +------------------ src/main/java/ecdar/abstractions/Project.java | 36 ++++++++++++++--- .../java/ecdar/backend/EcdarDocument.java | 3 ++ .../controllers/CanvasShellController.java | 2 - .../controllers/ProjectPaneController.java | 8 ++++ .../java/ecdar/mutation/ExportHandler.java | 3 +- .../mutation/TestCaseGenerationHandler.java | 3 +- 7 files changed, 48 insertions(+), 47 deletions(-) diff --git a/src/main/java/ecdar/abstractions/Component.java b/src/main/java/ecdar/abstractions/Component.java index 19e4dc67..db099a8e 100644 --- a/src/main/java/ecdar/abstractions/Component.java +++ b/src/main/java/ecdar/abstractions/Component.java @@ -19,7 +19,6 @@ import javafx.collections.ObservableList; import javafx.collections.transformation.FilteredList; import javafx.util.Pair; -import jdk.swing.interop.SwingInterOpUtils; import org.apache.commons.lang3.tuple.Triple; import java.util.*; @@ -896,13 +895,7 @@ public List getLocalVariables() { * @return Triples containing (left) name of the variable, (middle) lower bound, (right) upper bound */ public List> getLocalVariablesWithBounds() { - final List> types = new ArrayList<>(); - - final Matcher typeDefMatcher = Pattern.compile(".*typedef\\s+int\\s*\\[(\\d+)\\s*,\\s*(\\d+)]\\s*(\\w*)\\s*;.*").matcher(getTypeDefsFromAllComponents()); - - while (typeDefMatcher.find()) { - types.add(Triple.of(typeDefMatcher.group(3), Integer.parseInt(typeDefMatcher.group(1)), Integer.parseInt(typeDefMatcher.group(2)))); - } + final List> typedefs = Ecdar.getProject().getGlobalDeclarations().getTypedefs(); final List> locals = new ArrayList<>(); @@ -910,7 +903,7 @@ public List> getLocalVariablesWithBounds() { final Matcher matcher = Pattern.compile("^\\s*(\\w+)\\s+(\\w+)(\\W|$)").matcher(statement); if (!matcher.find()) return; - final Optional> typedef = types.stream() + final Optional> typedef = typedefs.stream() .filter(def -> def.getLeft().equals(matcher.group(1))).findAny(); if (!typedef.isPresent()) return; @@ -920,35 +913,6 @@ public List> getLocalVariablesWithBounds() { return locals; } - private String getTypeDefsFromAllComponents() { - final StringBuilder typeDefs = new StringBuilder("broadcast chan "); - final ArrayList channels = new ArrayList<>(); - - Ecdar.getProject().getComponents().forEach(c -> { - c.outputStrings.forEach(output -> { - if (!channels.contains(output)) { - channels.add(output); - } - }); - - c.inputStrings.forEach(input -> { - if (!channels.contains(input)) { - channels.add(input); - } - }); - }); - - for (String chan : channels) { - typeDefs.append(chan).append(", "); - } - - if (typeDefs.toString().endsWith("chan ")) return ""; - - typeDefs.delete(typeDefs.length() - 2, typeDefs.length()).append(";"); - - return typeDefs.toString(); - } - /** * Gets the first occurring universal location in this component. * @return the first universal location, or null if none exists diff --git a/src/main/java/ecdar/abstractions/Project.java b/src/main/java/ecdar/abstractions/Project.java index b7b0f5ee..b4db434c 100644 --- a/src/main/java/ecdar/abstractions/Project.java +++ b/src/main/java/ecdar/abstractions/Project.java @@ -21,6 +21,7 @@ * A project of models. */ public class Project { + private final static String GLOBAL_DCL_FILENAME = "GlobalDeclarations"; private final static String QUERIES_FILENAME = "Queries"; private final static String JSON_FILENAME_EXTENSION = ".json"; private static final String FOLDER_NAME_COMPONENTS = "Components"; @@ -31,12 +32,14 @@ public class Project { private final ObservableList components; private final ObservableList systems; private final ObservableList testPlans; + private final ObjectProperty globalDeclarations; public Project() { queries = FXCollections.observableArrayList(); components = FXCollections.observableArrayList(); systems = FXCollections.observableArrayList(); testPlans = FXCollections.observableArrayList(); + globalDeclarations = new SimpleObjectProperty<>(new Declarations("Global Declarations")); } public ObservableList getQueries() { @@ -55,6 +58,14 @@ public ObservableList getTestPlans() { return testPlans; } + public Declarations getGlobalDeclarations() { + return globalDeclarations.get(); + } + + public void setGlobalDeclarations(final Declarations declarations) { + globalDeclarations.set(declarations); + } + /** * Serializes and stores this as JSON files at a given directory. * @param directory object containing path to the desired directory to store at @@ -68,6 +79,13 @@ public void serialize(final File directory) throws IOException { FileUtils.forceMkdir(new File(Ecdar.projectDirectory.getValue() + File.separator + FOLDER_NAME_SYSTEMS)); FileUtils.forceMkdir(new File(Ecdar.projectDirectory.getValue() + File.separator + FOLDER_NAME_TESTS)); + { + // Save global declarations + final Writer globalWriter = getSaveFileWriter(GLOBAL_DCL_FILENAME); + getNewGson().toJson(getGlobalDeclarations().serialize(), globalWriter); + globalWriter.close(); + } + // Save components for (final Component component : getComponents()) { final Writer writer = getSaveFileWriter(component.getName(), FOLDER_NAME_COMPONENTS); @@ -170,11 +188,17 @@ public void deserialize(final File projectFolder) throws IOException { private void deserializeFileHelper(final File file) throws IOException { final String fileContent = Files.toString(file, Charset.defaultCharset()); - if ((QUERIES_FILENAME + JSON_FILENAME_EXTENSION).equals(file.getName())) { - new JsonParser().parse(fileContent).getAsJsonArray().forEach(jsonElement -> { - final Query newQuery = new Query((JsonObject) jsonElement); - getQueries().add(newQuery); - }); + switch (file.getName()) { + case GLOBAL_DCL_FILENAME + JSON_FILENAME_EXTENSION: + final JsonObject globalJsonObj = new JsonParser().parse(fileContent).getAsJsonObject(); + setGlobalDeclarations(new Declarations(globalJsonObj)); + break; + case QUERIES_FILENAME + JSON_FILENAME_EXTENSION: + new JsonParser().parse(fileContent).getAsJsonArray().forEach(jsonElement -> { + final Query newQuery = new Query((JsonObject) jsonElement); + getQueries().add(newQuery); + }); + break; } } @@ -315,6 +339,8 @@ public void reset() { * Be sure to disable code analysis before call and enable after call. */ public void clean() { + getGlobalDeclarations().clearDeclarationsText(); + queries.clear(); components.clear(); diff --git a/src/main/java/ecdar/backend/EcdarDocument.java b/src/main/java/ecdar/backend/EcdarDocument.java index 68737271..9f5c72ec 100644 --- a/src/main/java/ecdar/backend/EcdarDocument.java +++ b/src/main/java/ecdar/backend/EcdarDocument.java @@ -66,6 +66,9 @@ private void generateXmlDocument(final Project project) throws BackendException for (final Component component : project.getComponents()) { generateAndAddTemplate(component); } + + // Set global declarations + xmlDocument.setProperty(DECLARATION_PROPERTY_TAG, project.getGlobalDeclarations().getDeclarationsText()); } /** diff --git a/src/main/java/ecdar/controllers/CanvasShellController.java b/src/main/java/ecdar/controllers/CanvasShellController.java index 0e419ace..dbd956bd 100644 --- a/src/main/java/ecdar/controllers/CanvasShellController.java +++ b/src/main/java/ecdar/controllers/CanvasShellController.java @@ -1,10 +1,8 @@ package ecdar.controllers; import com.jfoenix.controls.JFXRippler; -import ecdar.Ecdar; import ecdar.abstractions.Component; import ecdar.presentations.CanvasPresentation; -import ecdar.utility.helpers.ZoomHelper; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.layout.Pane; diff --git a/src/main/java/ecdar/controllers/ProjectPaneController.java b/src/main/java/ecdar/controllers/ProjectPaneController.java index 1da20e99..5454bfa7 100644 --- a/src/main/java/ecdar/controllers/ProjectPaneController.java +++ b/src/main/java/ecdar/controllers/ProjectPaneController.java @@ -47,6 +47,14 @@ public class ProjectPaneController implements Initializable { @Override public void initialize(final URL location, final ResourceBundle resources) { + // Bind global declarations and add mouse event + final FilePresentation globalDclPresentation = new FilePresentation(Ecdar.getProject().getGlobalDeclarations()); + globalDclPresentation.setOnMousePressed(event -> { + event.consume(); + EcdarController.getActiveCanvasPresentation().getController().setActiveModel(Ecdar.getProject().getGlobalDeclarations()); + }); + filesList.getChildren().add(globalDclPresentation); + Ecdar.getProject().getComponents().addListener(new ListChangeListener() { @Override public void onChanged(final Change c) { diff --git a/src/main/java/ecdar/mutation/ExportHandler.java b/src/main/java/ecdar/mutation/ExportHandler.java index 4572e460..0e6bff8a 100644 --- a/src/main/java/ecdar/mutation/ExportHandler.java +++ b/src/main/java/ecdar/mutation/ExportHandler.java @@ -136,9 +136,10 @@ void start() { private static void storeMutantXml(final MutationTestCase testCase) throws BackendException, IOException, URISyntaxException { final Component mutant = testCase.getMutant(); - // make a project with the mutant + // Make a project with the mutant final Project project = new Project(); project.getComponents().add(mutant); + project.setGlobalDeclarations(Ecdar.getProject().getGlobalDeclarations()); mutant.updateIOList(); // Update io in order to get the right system declarations for the mutant BackendHelper.storeBackendModel(project, "mutants" + File.separator + "xml", testCase.getId()); diff --git a/src/main/java/ecdar/mutation/TestCaseGenerationHandler.java b/src/main/java/ecdar/mutation/TestCaseGenerationHandler.java index e089a13b..fdc51b69 100644 --- a/src/main/java/ecdar/mutation/TestCaseGenerationHandler.java +++ b/src/main/java/ecdar/mutation/TestCaseGenerationHandler.java @@ -145,10 +145,11 @@ public int getMaxConcurrentJobs() { private void generateTestCase(final MutationTestCase testCase, final int tries) { final Component mutant = testCase.getMutant(); - // make a project with the test model and the mutant + // Make a project with the test model and the mutant final Project project = new Project(); mutant.setName(MutationTestPlanController.MUTANT_NAME); project.getComponents().addAll(testModel, mutant); + project.setGlobalDeclarations(Ecdar.getProject().getGlobalDeclarations()); mutant.updateIOList(); // Update io in order to get the right system declarations for the mutant new Thread(() -> {