From 1c849ec1e56c11fd5636fab5bc2a7c4f9b5658ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Fuch=C3=9F?= Date: Fri, 12 Jan 2024 11:04:30 +0100 Subject: [PATCH] Try to merge (still wip) --- .../common/DiagramUtility.java | 4 +- .../common/JsonMapping.java | 36 ------------- .../core/api/diagramrecognition/Box.java | 43 ++++++++++++---- .../mcse/ardoco/core/common/JsonHandling.java | 26 ++++++++++ .../AbbreviationDisambiguationHelper.java | 8 +-- .../core/common/util/DbPediaHelper.java | 7 +-- .../ardoco/core/data/PipelineStepData.java | 24 ++------- .../AbbreviationDisambiguationHelperTest.java | 4 +- .../converter/JsonConverter.java | 10 ++-- .../ardoco/core/common/util/FilePrinter.java | 3 +- .../DiagramConsistency.java | 4 +- ...agramElementOccurrenceFinderInformant.java | 4 +- .../DiagramModelInconsistencyInformant.java | 4 +- .../informants/DiagramModelLinkInformant.java | 4 +- .../informants/DiagramProviderInformant.java | 27 ++++++++-- .../InconsistencyGroupingInformant.java | 4 +- .../InconsistencyRefinementInformant.java | 4 +- .../OccurrenceToDecisionInformant.java | 4 +- .../WeightedSimilarityInformant.java | 4 +- .../evaluation/DiagramLoadingTest.java | 22 +++++--- .../evaluation/EvaluationTestBase.java | 4 +- .../evaluation/data/AnnotatedDiagram.java | 8 +-- .../informants/DiagramConsistencyTest.java | 51 +++++++++++++++---- .../Stage1SyntheticDiagramTest.java | 9 ++-- .../informants/SyntheticTestBase.java | 19 ++++--- .../src/test/resources/.gitignore | 1 + .../diagramrecognition/model/DiagramImpl.kt | 19 +++++-- .../informants/UnwantedWordsFilter.java | 7 +-- .../generators/code/CodeExtractor.java | 20 ++------ .../agents/PDFExtractorTestCase.java | 8 +-- .../core/api/diagramrecognition/BoxGS.java | 3 +- .../api/diagramrecognition/DiagramGS.java | 4 +- .../ardoco/tests/eval/DiagramProject.java | 5 +- 33 files changed, 236 insertions(+), 168 deletions(-) delete mode 100644 framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramconsistency/common/JsonMapping.java create mode 100644 framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/JsonHandling.java diff --git a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramconsistency/common/DiagramUtility.java b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramconsistency/common/DiagramUtility.java index 3aea758ab..2c9b33d66 100644 --- a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramconsistency/common/DiagramUtility.java +++ b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramconsistency/common/DiagramUtility.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common; import java.util.List; @@ -108,7 +108,7 @@ public static List getContainedBoxes(Box box, SortedMap boxes) */ public static Box addBox(Diagram diagram, String text) { TextBox textBox = new TextBox(0, 0, 0, 0, 1.0, text, null); - Box box = new Box(String.valueOf(diagram.getBoxes().size()), new int[] { 0, 0, 0, 0 }, 1.0, null, List.of(textBox), null); + Box box = new Box(diagram, String.valueOf(diagram.getBoxes().size()), new int[] { 0, 0, 0, 0 }, 1.0, null, List.of(textBox), null); diagram.addBox(box); return box; diff --git a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramconsistency/common/JsonMapping.java b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramconsistency/common/JsonMapping.java deleted file mode 100644 index 6bd14552b..000000000 --- a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramconsistency/common/JsonMapping.java +++ /dev/null @@ -1,36 +0,0 @@ -/* Licensed under MIT 2023. */ -package edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * Utility class for getting {@link ObjectMapper}s. - */ -public final class JsonMapping { - /** - * Gets the default {@link ObjectMapper}. - */ - public static final ObjectMapper OBJECT_MAPPER = createObjectMapper(); - - private JsonMapping() { - - } - - private static ObjectMapper createObjectMapper() { - ObjectMapper oom = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .setSerializationInclusion(JsonInclude.Include.NON_NULL); - - oom.setVisibility(oom.getSerializationConfig() - .getDefaultVisibilityChecker() - .withFieldVisibility(JsonAutoDetect.Visibility.ANY) - .withGetterVisibility(JsonAutoDetect.Visibility.NONE) - .withSetterVisibility(JsonAutoDetect.Visibility.NONE) - .withIsGetterVisibility(JsonAutoDetect.Visibility.NONE) - .withCreatorVisibility(JsonAutoDetect.Visibility.ANY)); - - return oom; - } -} diff --git a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramrecognition/Box.java b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramrecognition/Box.java index e88f7c7ad..453b594d1 100644 --- a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramrecognition/Box.java +++ b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/api/diagramrecognition/Box.java @@ -32,11 +32,12 @@ public class Box extends DiagramElement implements Serializable { private List textBoxes = new ArrayList<>(); @JsonProperty("contained") private List containedBoxes = new ArrayList<>(); - private transient Color dominatingColor = null; + @JsonProperty("dominatingColor") + private Color dominatingColor = null; @JsonIgnore private SortedSet references = new TreeSet<>(); - private static String calculateUUID(int[] coordinates) { + protected static String calculateUUID(int[] coordinates) { return String.format("Box [%s]", getBoundingBoxConcat(coordinates)); } @@ -49,6 +50,26 @@ public static String getBoundingBoxConcat(int[] coordinates) { return Arrays.stream(coordinates).mapToObj((Integer::toString)).reduce((l, r) -> l + "-" + r).orElseThrow(); } + /** + * Create a new box that is detected on the image. + * + * @param diagram the diagram the box belongs to + * @param uuid the unique identifier of the box + * @param coordinates the coordinates of two corners of the box in pixel. (x1,y1,x2,y2) + * @param confidence a confidence value + * @param classification the classification (e.g., "LABEL"), see {@link Classification} for further details + * @param textBoxes the text boxes that are attached to this box + * @param dominatingColor a dominating color in the box (iff present) + */ + public Box(Diagram diagram, String uuid, int[] coordinates, double confidence, String classification, List textBoxes, Color dominatingColor) { + super(diagram, uuid); + this.coordinates = coordinates; + this.confidence = confidence; + this.classification = classification; + this.textBoxes = textBoxes; + this.dominatingColor = dominatingColor; + } + /** * Create a new box that is detected on the image. * @@ -71,18 +92,22 @@ public Box(Diagram diagram, int[] coordinates, double confidence, String classif /** * Create a new box that is detected on the image. * - * @param diagram the diagram this box belongs to - * @param coordinates the coordinates of two corners of the box in pixel. (x1,y1,x2,y2) - * @param confidence a confidence value - * @param classification the classification (e.g., "LABEL"), see {@link Classification} for further details + * @param diagram the diagram this box belongs to + * @param uuid the unique identifier of the box + * @param coordinates the coordinates of two corners of the box in pixel. (x1,y1,x2,y2) + * @param confidence a confidence value + * @param classification the classification (e.g., "LABEL"), see {@link Classification} for further details + * @param dominatingColor a dominating color in the box (iff present) */ @JsonCreator - public Box(@JacksonInject Diagram diagram, @JsonProperty("box") int[] coordinates, @JsonProperty("confidence") double confidence, - @JsonProperty("class") String classification) { - super(diagram, calculateUUID(coordinates)); + public Box(@JacksonInject Diagram diagram, @JsonProperty("uuid") String uuid, @JsonProperty("box") int[] coordinates, + @JsonProperty("confidence") double confidence, @JsonProperty("class") String classification, + @JsonProperty("dominatingColor") Color dominatingColor) { + super(diagram, uuid == null ? calculateUUID(coordinates) : uuid); this.coordinates = coordinates; this.confidence = confidence; this.classification = classification; + this.dominatingColor = dominatingColor; } /** diff --git a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/JsonHandling.java b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/JsonHandling.java new file mode 100644 index 000000000..5ef5027e2 --- /dev/null +++ b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/JsonHandling.java @@ -0,0 +1,26 @@ +/* Licensed under MIT 2024. */ +package edu.kit.kastel.mcse.ardoco.core.common; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; + +public final class JsonHandling { + private JsonHandling() { + throw new IllegalAccessError("Utility class"); + } + + public static ObjectMapper createObjectMapper() { + var objectMapper = new ObjectMapper(); + objectMapper.configure(SerializationFeature.INDENT_OUTPUT, false); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.setVisibility(objectMapper.getSerializationConfig() + .getDefaultVisibilityChecker() // + .withFieldVisibility(JsonAutoDetect.Visibility.ANY) // + .withGetterVisibility(JsonAutoDetect.Visibility.NONE) // + .withSetterVisibility(JsonAutoDetect.Visibility.NONE) // + .withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)); + return objectMapper; + } +} diff --git a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/AbbreviationDisambiguationHelper.java b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/AbbreviationDisambiguationHelper.java index 5c2604934..94d880cbd 100644 --- a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/AbbreviationDisambiguationHelper.java +++ b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/AbbreviationDisambiguationHelper.java @@ -1,6 +1,8 @@ /* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.common.util; +import static edu.kit.kastel.mcse.ardoco.core.common.JsonHandling.createObjectMapper; + import java.io.IOException; import java.io.PrintWriter; import java.util.*; @@ -13,8 +15,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.databind.ObjectMapper; - import edu.kit.kastel.mcse.ardoco.core.api.Disambiguation; /** @@ -212,7 +212,7 @@ static SortedSet crawlAcronymFinderCom(String abbreviation) { protected SortedMap read() throws CacheException { try { logger.info("Reading abbreviations file"); - var read = toMap(new ObjectMapper().readValue(getFile(), Disambiguation[].class)); + var read = toMap(createObjectMapper().readValue(getFile(), Disambiguation[].class)); logger.info("Found {} cached abbreviation", read.size()); return read; } catch (IOException e) { @@ -230,7 +230,7 @@ protected void write(SortedMap content) { Collection values = content.values(); try (PrintWriter out = new PrintWriter(getFile())) { //Parse before writing to the file, so we don't mess up the entire file due to a parsing error - String json = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(values); + String json = createObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(values); out.print(json); logger.info("Saved abbreviations file"); } catch (IOException e) { diff --git a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/DbPediaHelper.java b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/DbPediaHelper.java index 014fb8170..01d9dbbbf 100644 --- a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/DbPediaHelper.java +++ b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/DbPediaHelper.java @@ -1,6 +1,8 @@ /* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.common.util; +import static edu.kit.kastel.mcse.ardoco.core.common.JsonHandling.createObjectMapper; + import java.io.IOException; import java.io.PrintWriter; import java.util.List; @@ -13,7 +15,6 @@ import org.slf4j.LoggerFactory; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; /** * This class provides lists of computer- and software-related terminology. It retrieves the terminology from the DBPedia ontology using SPARQL queries. The @@ -151,7 +152,7 @@ private List runQuery(ParameterizedSparqlString query) { protected void write(DbPediaData r) { try (PrintWriter out = new PrintWriter(getFile())) { //Parse before writing to the file, so we don't mess up the entire file due to a parsing error - String json = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(r); + String json = createObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(r); out.print(json); logger.info("Saved {} file", getIdentifier()); } catch (IOException e) { @@ -168,7 +169,7 @@ protected DbPediaData getDefault() { protected DbPediaData read() throws CacheException { try { logger.info("Reading {} file", getIdentifier()); - return new ObjectMapper().readValue(getFile(), new TypeReference<>() { + return createObjectMapper().readValue(getFile(), new TypeReference<>() { }); } catch (IOException e) { logger.error("Error reading {} file", getIdentifier()); diff --git a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/data/PipelineStepData.java b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/data/PipelineStepData.java index b97967daa..82b46f59b 100644 --- a/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/data/PipelineStepData.java +++ b/framework/common/src/main/java/edu/kit/kastel/mcse/ardoco/core/data/PipelineStepData.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2022-2023. */ +/* Licensed under MIT 2022-2024. */ package edu.kit.kastel.mcse.ardoco.core.data; import java.io.Serializable; @@ -7,10 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; +import edu.kit.kastel.mcse.ardoco.core.common.JsonHandling; /** * This abstract class defines data that is used for the pipeline steps. @@ -36,7 +33,7 @@ default Optional asPipelineStepData(Class cla } default String serialize() { - var oom = createObjectMapper(); + var oom = JsonHandling.createObjectMapper(); try { return oom.writeValueAsString(this); } catch (Exception e) { @@ -46,7 +43,7 @@ default String serialize() { } default PipelineStepData deserialize(String data) { - var oom = createObjectMapper(); + var oom = JsonHandling.createObjectMapper(); try { return oom.readValue(data, this.getClass()); } catch (Exception e) { @@ -54,17 +51,4 @@ default PipelineStepData deserialize(String data) { return null; } } - - private static ObjectMapper createObjectMapper() { - var objectMapper = new ObjectMapper(); - objectMapper.configure(SerializationFeature.INDENT_OUTPUT, false); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - objectMapper.setVisibility(objectMapper.getSerializationConfig() - .getDefaultVisibilityChecker() // - .withFieldVisibility(JsonAutoDetect.Visibility.ANY) // - .withGetterVisibility(JsonAutoDetect.Visibility.NONE) // - .withSetterVisibility(JsonAutoDetect.Visibility.NONE) // - .withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)); - return objectMapper; - } } diff --git a/framework/common/src/test/java/edu/kit/kastel/mcse/ardoco/core/common/util/AbbreviationDisambiguationHelperTest.java b/framework/common/src/test/java/edu/kit/kastel/mcse/ardoco/core/common/util/AbbreviationDisambiguationHelperTest.java index 761dac657..cc54f05d5 100644 --- a/framework/common/src/test/java/edu/kit/kastel/mcse/ardoco/core/common/util/AbbreviationDisambiguationHelperTest.java +++ b/framework/common/src/test/java/edu/kit/kastel/mcse/ardoco/core/common/util/AbbreviationDisambiguationHelperTest.java @@ -1,6 +1,7 @@ /* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.common.util; +import static edu.kit.kastel.mcse.ardoco.core.common.JsonHandling.createObjectMapper; import static org.junit.jupiter.api.Assertions.*; import java.util.List; @@ -8,7 +9,6 @@ import org.junit.jupiter.api.Test; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import edu.kit.kastel.mcse.ardoco.core.api.Disambiguation; @@ -31,7 +31,7 @@ void get() { @Test void deserialize() throws JsonProcessingException { - var abbr = new ObjectMapper().readValue(dbJSON, Disambiguation.class); + var abbr = createObjectMapper().readValue(dbJSON, Disambiguation.class); assertEquals("DB", abbr.getAbbreviation()); assertTrue(abbr.getMeanings().containsAll(List.of("Database", "Decibel"))); assertEquals(2, abbr.getMeanings().size()); diff --git a/framework/text-provider-json/src/main/java/edu/kit/kastel/mcse/ardoco/core/textproviderjson/converter/JsonConverter.java b/framework/text-provider-json/src/main/java/edu/kit/kastel/mcse/ardoco/core/textproviderjson/converter/JsonConverter.java index b35d1ee97..5e5c8cd30 100644 --- a/framework/text-provider-json/src/main/java/edu/kit/kastel/mcse/ardoco/core/textproviderjson/converter/JsonConverter.java +++ b/framework/text-provider-json/src/main/java/edu/kit/kastel/mcse/ardoco/core/textproviderjson/converter/JsonConverter.java @@ -1,6 +1,8 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.textproviderjson.converter; +import static edu.kit.kastel.mcse.ardoco.core.common.JsonHandling.createObjectMapper; + import java.io.IOException; import java.io.InputStream; import java.util.List; @@ -40,7 +42,7 @@ private JsonConverter() { * @return whether the json string matches the text schema */ public static boolean validateJson(String json) throws IOException { - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = createObjectMapper(); JsonSchemaFactory schemaFactory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4); InputStream inputSchema = JsonConverter.class.getClassLoader().getResourceAsStream(SCHEMA_PATH); @@ -69,7 +71,7 @@ public static TextDto fromJsonString(String json) throws IOException, InvalidJso if (!validateJson(json)) { throw new InvalidJsonException("The json string is no valid text DTO."); } - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = createObjectMapper(); return objectMapper.readValue(json, TextDto.class); } @@ -80,7 +82,7 @@ public static TextDto fromJsonString(String json) throws IOException, InvalidJso * @return the JSON string or null */ public static String toJsonString(TextDto obj) throws IOException, InvalidJsonException { - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = createObjectMapper(); String jsonString = objectMapper.writeValueAsString(obj); if (!validateJson(jsonString)) { throw new InvalidJsonException("The text DTO could not be converted into a json string. No valid text Dto"); diff --git a/pipeline/pipeline-core/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/FilePrinter.java b/pipeline/pipeline-core/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/FilePrinter.java index 5193989a5..8b0f436e3 100644 --- a/pipeline/pipeline-core/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/FilePrinter.java +++ b/pipeline/pipeline-core/src/main/java/edu/kit/kastel/mcse/ardoco/core/common/util/FilePrinter.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2021-2023. */ +/* Licensed under MIT 2021-2024. */ package edu.kit.kastel.mcse.ardoco.core.common.util; import static edu.kit.kastel.mcse.ardoco.core.common.util.DataRepositoryHelper.getConnectionStates; @@ -392,6 +392,7 @@ public static void writeToFile(String filename, String text) { * @param text the text to write */ public static void writeToFile(Path file, String text) { + file.getParent().toFile().mkdirs(); try (BufferedWriter writer = Files.newBufferedWriter(file, UTF_8)) { writer.write(text); } catch (IOException e) { diff --git a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/DiagramConsistency.java b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/DiagramConsistency.java index 784a1bfa6..c54fa2232 100644 --- a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/DiagramConsistency.java +++ b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/DiagramConsistency.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency; import java.io.File; @@ -19,7 +19,7 @@ import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.agents.DiagramProviderAgent; import edu.kit.kastel.mcse.ardoco.core.execution.ArDoCo; import edu.kit.kastel.mcse.ardoco.core.execution.runner.ArDoCoRunner; -import edu.kit.kastel.mcse.ardoco.core.models.ArCoTLModelProviderAgent; +import edu.kit.kastel.mcse.ardoco.core.models.agents.ArCoTLModelProviderAgent; /** * A runner that checks the consistency of a diagram and the represented architecture/code model. diff --git a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramElementOccurrenceFinderInformant.java b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramElementOccurrenceFinderInformant.java index d2c0632d2..cd6b93827 100644 --- a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramElementOccurrenceFinderInformant.java +++ b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramElementOccurrenceFinderInformant.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.informants; import java.util.Set; @@ -72,7 +72,7 @@ public DiagramElementOccurrenceFinderInformant(DataRepository dataRepository) { } @Override - public void run() { + public void process() { if (this.skip) { return; } diff --git a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramModelInconsistencyInformant.java b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramModelInconsistencyInformant.java index af25c0e23..e6de3b3a6 100644 --- a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramModelInconsistencyInformant.java +++ b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramModelInconsistencyInformant.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.informants; import java.util.ArrayList; @@ -107,7 +107,7 @@ private static void checkRulesForLooseEntities(Map entities, Con } @Override - public void run() { + public void process() { DataRepository data = this.getDataRepository(); ModelStates models = data.getData(ModelStates.ID, ModelStates.class).orElse(null); diff --git a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramModelLinkInformant.java b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramModelLinkInformant.java index 8398e43fc..b4e37d7e0 100644 --- a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramModelLinkInformant.java +++ b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramModelLinkInformant.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.informants; import java.util.Map; @@ -79,7 +79,7 @@ public DiagramModelLinkInformant(DataRepository data) { } @Override - public void run() { + public void process() { if (this.skip) { return; } diff --git a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramProviderInformant.java b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramProviderInformant.java index 6bd0d7d6f..e119d1002 100644 --- a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramProviderInformant.java +++ b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramProviderInformant.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.informants; import java.io.File; @@ -9,9 +9,14 @@ import java.util.Optional; import java.util.SortedMap; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.InjectableValues; +import com.fasterxml.jackson.databind.JsonMappingException; + import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.DiagramState; -import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common.JsonMapping; import edu.kit.kastel.mcse.ardoco.core.api.diagramrecognition.Diagram; +import edu.kit.kastel.mcse.ardoco.core.common.JsonHandling; import edu.kit.kastel.mcse.ardoco.core.data.DataRepository; import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.DiagramStateImpl; import edu.kit.kastel.mcse.ardoco.core.pipeline.agent.Informant; @@ -51,14 +56,28 @@ public static Diagram load(File file) throws IOException { try (InputStream stream = new FileInputStream(file)) { String text = new String(stream.readAllBytes(), StandardCharsets.UTF_8); - diagram = JsonMapping.OBJECT_MAPPER.readValue(text, DiagramImpl.class); + var oom = JsonHandling.createObjectMapper(); + oom.setInjectableValues(new InjectableValues() { + @Override + public Object findInjectableValue(Object o, DeserializationContext deserializationContext, BeanProperty beanProperty, Object o1) + throws JsonMappingException { + if (beanProperty.getType().getRawClass() != Diagram.class) + throw new JsonMappingException(deserializationContext.getParser(), "Could not inject value into " + beanProperty.getName()); + Object parent = deserializationContext.getParser().getParsingContext().getParent().getCurrentValue(); + if (!(parent instanceof DiagramImpl parentDiagram)) + throw new JsonMappingException(deserializationContext.getParser(), "Could not inject value into " + beanProperty.getName()); + return parentDiagram; + } + }); + + diagram = oom.readValue(text, DiagramImpl.class); } return diagram; } @Override - public void run() { + public void process() { Diagram diagram = null; try { diff --git a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/InconsistencyGroupingInformant.java b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/InconsistencyGroupingInformant.java index 157509a4b..12838f4b0 100644 --- a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/InconsistencyGroupingInformant.java +++ b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/InconsistencyGroupingInformant.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.informants; import java.util.ArrayList; @@ -30,7 +30,7 @@ public InconsistencyGroupingInformant(DataRepository data) { } @Override - public void run() { + public void process() { DataRepository data = this.getDataRepository(); DiagramMatchingModelSelectionState selection = data.getData(DiagramMatchingModelSelectionState.ID, DiagramMatchingModelSelectionStateImpl.class) diff --git a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/InconsistencyRefinementInformant.java b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/InconsistencyRefinementInformant.java index 454134377..3307ac6d2 100644 --- a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/InconsistencyRefinementInformant.java +++ b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/InconsistencyRefinementInformant.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.informants; import java.util.ArrayList; @@ -63,7 +63,7 @@ private static Map getEntityNames(ModelStates models, ModelType } @Override - public void run() { + public void process() { DataRepository data = this.getDataRepository(); ModelStates models = data.getData(ModelStates.ID, ModelStates.class).orElse(null); diff --git a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/OccurrenceToDecisionInformant.java b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/OccurrenceToDecisionInformant.java index 76d3e4364..272c170d8 100644 --- a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/OccurrenceToDecisionInformant.java +++ b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/OccurrenceToDecisionInformant.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.informants; import java.util.LinkedHashMap; @@ -49,7 +49,7 @@ public OccurrenceToDecisionInformant(DataRepository dataRepository) { } @Override - public void run() { + public void process() { if (this.skip) { return; } diff --git a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/WeightedSimilarityInformant.java b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/WeightedSimilarityInformant.java index 5f86e08d1..ba3630345 100644 --- a/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/WeightedSimilarityInformant.java +++ b/stages/diagram-consistency/src/main/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/WeightedSimilarityInformant.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.informants; import java.util.Map; @@ -39,7 +39,7 @@ public WeightedSimilarityInformant(DataRepository dataRepository) { } @Override - public void run() { + public void process() { if (this.skip) { return; } diff --git a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/DiagramLoadingTest.java b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/DiagramLoadingTest.java index 9c2611b0f..035b1b312 100644 --- a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/DiagramLoadingTest.java +++ b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/DiagramLoadingTest.java @@ -1,10 +1,17 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation; -import static org.junit.jupiter.api.Assertions.*; +import static edu.kit.kastel.mcse.ardoco.core.common.JsonHandling.createObjectMapper; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Queue; +import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; @@ -13,7 +20,6 @@ import org.junit.jupiter.params.provider.MethodSource; import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common.Extractions; -import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common.JsonMapping; import edu.kit.kastel.mcse.ardoco.core.api.models.Entity; import edu.kit.kastel.mcse.ardoco.core.api.models.arcotl.architecture.ArchitectureComponent; import edu.kit.kastel.mcse.ardoco.core.api.models.arcotl.architecture.ArchitectureItem; @@ -54,7 +60,7 @@ void loadDiagram(DiagramProject project) throws IOException { String text = project.getDiagram(); assertDoesNotThrow(() -> { - var diagram = JsonMapping.OBJECT_MAPPER.readValue(text, DiagramImpl.class); + var diagram = createObjectMapper().readValue(text, DiagramImpl.class); assertNotNull(diagram); }); } @@ -68,7 +74,7 @@ void loadStageOne(DiagramProject project) throws IOException { AtomicReference identification = new AtomicReference<>(); assertDoesNotThrow(() -> { - identification.set(JsonMapping.OBJECT_MAPPER.readValue(text, ElementIdentification.class)); + identification.set(createObjectMapper().readValue(text, ElementIdentification.class)); assertNotNull(identification.get()); }); @@ -106,7 +112,7 @@ void loadStageTwo(DiagramProject project) throws IOException { String text = project.getLinkingStage(); assertDoesNotThrow(() -> { - var object = JsonMapping.OBJECT_MAPPER.readValue(text, ElementLinks.class); + var object = createObjectMapper().readValue(text, ElementLinks.class); assertNotNull(object); }); } @@ -118,7 +124,7 @@ void loadStageThree(DiagramProject project) throws IOException { String text = project.getValidationStage(); assertDoesNotThrow(() -> { - var object = JsonMapping.OBJECT_MAPPER.readValue(text, DiagramInconsistencies.class); + var object = createObjectMapper().readValue(text, DiagramInconsistencies.class); assertNotNull(object); }); } diff --git a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/EvaluationTestBase.java b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/EvaluationTestBase.java index e65de21f6..a75bd19c0 100644 --- a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/EvaluationTestBase.java +++ b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/EvaluationTestBase.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation; import static org.junit.jupiter.api.Assertions.*; @@ -93,7 +93,7 @@ protected static List getDistinctDiagrams() { } protected static ArchitectureModel getArchitectureModel(DiagramProject project) { - File model = project.getSourceProject().getProject().getModelFile(ArchitectureModelType.UML); + File model = project.getSourceProject().getModelFile(ArchitectureModelType.UML); UmlExtractor extractor = new UmlExtractor(model.getAbsolutePath()); ArchitectureModel architectureModel = extractor.extractModel(); diff --git a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/data/AnnotatedDiagram.java b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/data/AnnotatedDiagram.java index 98e69d446..d71ba154d 100644 --- a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/data/AnnotatedDiagram.java +++ b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/evaluation/data/AnnotatedDiagram.java @@ -1,4 +1,4 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.data; import java.io.File; @@ -61,7 +61,7 @@ public static AnnotatedDiagram createFrom(Diagram diagram) { * @return The diagram. */ public static AnnotatedDiagram createFrom(String source, ArchitectureModel model) { - Diagram diagram = new DiagramImpl(new File(source)); + Diagram diagram = new DiagramImpl(source, new File(source)); MutableBiMap links = new HashBiMap<>(); Transformations.transform(model, (item) -> { @@ -81,7 +81,7 @@ public static AnnotatedDiagram createFrom(String source, Archi * @return The diagram. */ public static AnnotatedDiagram createFrom(String source, CodeModel model) { - Diagram diagram = new DiagramImpl(new File(source)); + Diagram diagram = new DiagramImpl(source, new File(source)); MutableBiMap links = new HashBiMap<>(); Transformations.transform(model, (item) -> { @@ -102,7 +102,7 @@ public static AnnotatedDiagram createFrom(String source, CodeModel mod * @return The diagram. */ public static AnnotatedDiagram createFrom(String source, AnnotatedGraph graph) { - Diagram diagram = new DiagramImpl(new File(source)); + Diagram diagram = new DiagramImpl(source, new File(source)); Map, Box> vertexToBox = new LinkedHashMap<>(); for (Vertex vertex : graph.graph().vertexSet()) { diff --git a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramConsistencyTest.java b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramConsistencyTest.java index f3dc02913..fe5d83bdd 100644 --- a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramConsistencyTest.java +++ b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/DiagramConsistencyTest.java @@ -1,11 +1,24 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.informants; -import static org.junit.jupiter.api.Assertions.*; +import static edu.kit.kastel.mcse.ardoco.core.common.JsonHandling.createObjectMapper; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.File; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.stream.IntStream; @@ -23,7 +36,6 @@ import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.DiagramState; import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common.DiagramUtility; import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common.Extractions; -import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common.JsonMapping; import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common.inconsistencies.Inconsistency; import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common.inconsistencies.InconsistencyType; import edu.kit.kastel.mcse.ardoco.core.api.diagramrecognition.Box; @@ -93,6 +105,7 @@ private static Decision rateStage1Decision(DiagramProject project, DiagramMatchi @Disabled("No assertions, serves as evaluation runner only") void evaluateStage1WithInitialParameters(DiagramProject project) throws IOException { SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); config.put("DiagramElementOccurrenceFinderInformant::similarityThresholdArchitecture", String.valueOf(0.5)); config.put("DiagramElementOccurrenceFinderInformant::similarityThresholdCode", String.valueOf(0.75)); config.put("DiagramElementOccurrenceFinderInformant::similarityFunction", String.valueOf( @@ -112,6 +125,7 @@ void evaluateStage1WithInitialParameters(DiagramProject project) throws IOExcept @Disabled("No assertions, serves as evaluation runner only") void evaluateStage1WithInitialParametersWithJaccard(DiagramProject project) throws IOException { SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); config.put("DiagramElementOccurrenceFinderInformant::similarityThresholdArchitecture", String.valueOf(0.5)); config.put("DiagramElementOccurrenceFinderInformant::similarityThresholdCode", String.valueOf(0.75)); config.put("DiagramElementOccurrenceFinderInformant::similarityFunction", String.valueOf( @@ -173,6 +187,7 @@ void evaluateStage1CodeThresholdParameterForJaccard() throws IOException { private void evaluateStage1Parameter(String parameter, DiagramElementOccurrenceFinderInformant.TextSimilarityFunction textSimilarityFunction) throws IOException { SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); config.put("DiagramElementOccurrenceFinderInformant::similarityThresholdArchitecture", String.valueOf(0.5)); config.put("DiagramElementOccurrenceFinderInformant::similarityThresholdCode", String.valueOf(0.75)); config.put("DiagramElementOccurrenceFinderInformant::similarityFunction", String.valueOf(textSimilarityFunction)); @@ -209,6 +224,7 @@ private void evaluateStage1Parameter(String parameter, DiagramElementOccurrenceF @MethodSource("getDiagrams") void evaluateStage1VersionFinalJaccard(DiagramProject project) throws IOException { SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); config.put("DiagramElementOccurrenceFinderInformant::similarityThresholdArchitecture", String.valueOf(0.6)); config.put("DiagramElementOccurrenceFinderInformant::similarityThresholdCode", String.valueOf(0.8)); config.put("DiagramElementOccurrenceFinderInformant::similarityFunction", String.valueOf( @@ -230,6 +246,7 @@ void evaluateStage1VersionFinalJaccard(DiagramProject project) throws IOExceptio @MethodSource("getDiagrams") void evaluateStage1VersionFinalLevenshtein(DiagramProject project) throws IOException { SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); config.put("DiagramElementOccurrenceFinderInformant::similarityThresholdArchitecture", String.valueOf(0.5)); config.put("DiagramElementOccurrenceFinderInformant::similarityThresholdCode", String.valueOf(0.8)); config.put("DiagramElementOccurrenceFinderInformant::similarityFunction", String.valueOf( @@ -260,6 +277,7 @@ private void assertStage1Result(Map allExpected, Diagr @Disabled("No assertions, serves as evaluation runner only") void evaluateStage2Initial(DiagramProject project) throws IOException { SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); config.put("DiagramModelLinkInformant::textSimilarityThreshold", String.valueOf(0.5)); config.put("DiagramModelLinkInformant::similarityThreshold", String.valueOf(Double.NEGATIVE_INFINITY)); @@ -286,6 +304,7 @@ private void writeStage2Result(DiagramProject project, Metrics metrics) throws I @Disabled("No assertions, serves as evaluation runner only") void evaluateStage2WithSimilarityThreshold(DiagramProject project) throws IOException { SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); config.put("DiagramModelLinkInformant::textSimilarityThreshold", String.valueOf(0.5)); config.put("DiagramModelLinkInformant::similarityThreshold", String.valueOf(0.1)); @@ -300,6 +319,7 @@ void evaluateStage2WithSimilarityThreshold(DiagramProject project) throws IOExce @MethodSource("getDiagrams") void evaluateStage2TunedParameters(DiagramProject project) throws IOException { SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); Metrics metrics = this.runAndEvaluateStage2(project, config); this.writeStage2Result(project, metrics); @@ -321,6 +341,7 @@ private void assertStage2And3Result(DiagramProject project, Map config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); config.put("DiagramModelLinkInformant::maxIterations", String.valueOf(0)); Metrics metrics = this.runAndEvaluateStage2(project, config); @@ -335,6 +356,7 @@ void evaluateStage2ZeroIterations(DiagramProject project) throws IOException { void evaluateStage2Epsilon() throws IOException { List epsilons = IntStream.range(1, 50).mapToDouble(i -> 0.05 * i).boxed().toList(); SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); config.put("DiagramModelLinkInformant::epsilon", String.valueOf(1.0)); config.put("DiagramModelLinkInformant::textSimilarityThreshold", String.valueOf(0.5)); config.put("DiagramModelLinkInformant::similarityThreshold", String.valueOf(0.1)); @@ -347,6 +369,7 @@ void evaluateStage2Epsilon() throws IOException { void evaluateStage2Levenshtein() throws IOException { List thresholds = IntStream.range(0, 50).mapToDouble(i -> 0.02 * i).boxed().toList(); SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); config.put("DiagramModelLinkInformant::epsilon", String.valueOf(1.0)); config.put("DiagramModelLinkInformant::textSimilarityThreshold", String.valueOf(0.5)); config.put("DiagramModelLinkInformant::similarityThreshold", String.valueOf(0.1)); @@ -359,6 +382,7 @@ void evaluateStage2Levenshtein() throws IOException { void evaluateStage2SimilarityThreshold() throws IOException { List thresholds = IntStream.range(0, 50).mapToDouble(i -> 0.02 * i).boxed().toList(); SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); config.put("DiagramModelLinkInformant::epsilon", String.valueOf(1.0)); config.put("DiagramModelLinkInformant::textSimilarityThreshold", String.valueOf(0.5)); config.put("DiagramModelLinkInformant::similarityThreshold", String.valueOf(0.1)); @@ -405,7 +429,7 @@ private void evaluateImpactOnStage(List values, int repetition, BiFuncti private DiagramConsistency setupAndRun(DiagramProject project, Refactoring refactoring, double ratio, SortedMap config, Consumer setup) throws IOException { String name = project.name().toLowerCase(Locale.ROOT); - File inputArchitectureModel = project.getSourceProject().getProject().getModelFile(ArchitectureModelType.UML); + File inputArchitectureModel = project.getSourceProject().getModelFile(ArchitectureModelType.UML); File inputCodeModel = new File(Objects.requireNonNull(project.getSourceProject().getCodeModelDirectory())).getAbsoluteFile(); File inputDiagram = this.getDiagramFile(project, refactoring, ratio); File outputDir = new File(PIPELINE_OUTPUT); @@ -456,7 +480,7 @@ private DecisionInfo runAndEvaluateStage1(DiagramProject project, SortedMap refact } File refactored = File.createTempFile("temp", ".json"); - JsonMapping.OBJECT_MAPPER.writeValue(refactored, diagram.diagram()); + createObjectMapper().writeValue(refactored, diagram.diagram()); return refactored; } @@ -517,6 +541,7 @@ void evaluateStage2StabilityToRename() throws IOException { List ratios = IntStream.range(0, 50).mapToDouble(i -> 0.02 * i).boxed().toList(); this.evaluateImpactOnStage(ratios, 10, (project, ratio) -> { SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); try { return this.runAndEvaluateStage2(project, new Rename<>(), ratio, config); } catch (IOException e) { @@ -532,6 +557,7 @@ void evaluateStage2StabilityToDisconnect() throws IOException { List ratios = IntStream.range(0, 50).mapToDouble(i -> 0.02 * i).boxed().toList(); this.evaluateImpactOnStage(ratios, 10, (project, ratio) -> { SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); try { return this.runAndEvaluateStage2(project, new Disconnect<>(), ratio, config); } catch (IOException e) { @@ -558,7 +584,7 @@ private Metrics runAndEvaluateStage2(DiagramProject project, Refactoring expectedLinks = JsonMapping.OBJECT_MAPPER.readValue(project.getLinkingStage(), ElementLinks.class).toBiMap(); + MutableBiMap expectedLinks = createObjectMapper().readValue(project.getLinkingStage(), ElementLinks.class).toBiMap(); MutableBiMap foundLinks = runner.getDataRepository() .getData(DiagramModelLinkState.ID, DiagramModelLinkState.class) .orElseThrow() @@ -589,7 +615,7 @@ void evaluateAllStages(DiagramProject project) throws IOException { private Metrics runAndEvaluateStage3(DiagramProject project, Refactoring refactoring, double ratio, SortedMap config, boolean skipPreviousStages) throws IOException { - MutableBiMap expectedLinks = JsonMapping.OBJECT_MAPPER.readValue(project.getLinkingStage(), ElementLinks.class).toBiMap(); + MutableBiMap expectedLinks = createObjectMapper().readValue(project.getLinkingStage(), ElementLinks.class).toBiMap(); if (skipPreviousStages) { config.put("WeightedSimilarityInformant::skip", String.valueOf(true)); @@ -621,7 +647,7 @@ private Metrics runAndEvaluateStage3(DiagramProject project, Refactoring> expected = JsonMapping.OBJECT_MAPPER.readValue(project.getValidationStage(), DiagramInconsistencies.class) + List> expected = createObjectMapper().readValue(project.getValidationStage(), DiagramInconsistencies.class) .toInconsistencies(diagram, model); Map boxes = DiagramUtility.getBoxes(diagram); @@ -660,6 +686,7 @@ private void writeStage3Result(DiagramProject project, Metrics result) throws IO void evaluateStage3Epsilon() throws IOException { List epsilons = IntStream.range(1, 50).mapToDouble(i -> 0.05 * i).boxed().toList(); SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); this.evaluateImpactOfStage2ParameterOnStage3("epsilon", epsilons, config); } @@ -669,6 +696,7 @@ void evaluateStage3Epsilon() throws IOException { void evaluateStage3Levenshtein() throws IOException { List thresholds = IntStream.range(0, 50).mapToDouble(i -> 0.02 * i).boxed().toList(); SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); this.evaluateImpactOfStage2ParameterOnStage3("textSimilarityThreshold", thresholds, config); } @@ -678,6 +706,7 @@ void evaluateStage3Levenshtein() throws IOException { void evaluateStage3SimilarityThreshold() throws IOException { List thresholds = IntStream.range(0, 50).mapToDouble(i -> 0.02 * i).boxed().toList(); SortedMap config = new TreeMap<>(); + config.put("DiagramRecognition::enabledAgents", "DiagramRecognitionAgent"); this.evaluateImpactOfStage2ParameterOnStage3("similarityThreshold", thresholds, config); } @@ -703,7 +732,7 @@ record DecisionInfo(Decision decision, double correctScore, double incorrectScor @Disabled("No assertions, serves as evaluation runner only") void countInconsistencies() throws IOException { for (DiagramProject project : DiagramProject.values()) { - DiagramInconsistencies inconsistencies = JsonMapping.OBJECT_MAPPER.readValue(project.getValidationStage(), DiagramInconsistencies.class); + DiagramInconsistencies inconsistencies = createObjectMapper().readValue(project.getValidationStage(), DiagramInconsistencies.class); Map counts = new LinkedHashMap<>(); for (var inconsistency : inconsistencies.inconsistencies()) { diff --git a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/Stage1SyntheticDiagramTest.java b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/Stage1SyntheticDiagramTest.java index a2f1d20ae..2cb659a42 100644 --- a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/Stage1SyntheticDiagramTest.java +++ b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/Stage1SyntheticDiagramTest.java @@ -1,6 +1,8 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.informants; +import static edu.kit.kastel.mcse.ardoco.core.common.JsonHandling.createObjectMapper; + import java.io.File; import java.io.IOException; import java.util.List; @@ -20,7 +22,6 @@ import org.junit.jupiter.params.provider.MethodSource; import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.DiagramMatchingModelSelectionState; -import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common.JsonMapping; import edu.kit.kastel.mcse.ardoco.core.api.diagramrecognition.Diagram; import edu.kit.kastel.mcse.ardoco.core.api.models.ArchitectureModelType; import edu.kit.kastel.mcse.ardoco.core.api.models.CodeModelType; @@ -108,7 +109,7 @@ void examineStage1Base(DiagramProject project) throws IOException { private Result examineStage1(DiagramProject project, GeneralModelType generalModelType) throws IOException { String name = project.name().toLowerCase(Locale.ROOT); - File inputArchitectureModel = project.getSourceProject().getProject().getModelFile(ArchitectureModelType.UML); + File inputArchitectureModel = project.getSourceProject().getModelFile(ArchitectureModelType.UML); File inputCodeModel = new File(Objects.requireNonNull(project.getSourceProject().getCodeModelDirectory())).getAbsoluteFile(); File inputDiagram = File.createTempFile("temp", ".json"); File outputDir = new File(PIPELINE_OUTPUT); @@ -123,7 +124,7 @@ private Result examineStage1(DiagramProject project, GeneralModelType generalMod Decision expected = new Decision(generalModelType, (double) expectedLinks.size() / syntheticDiagram.getBoxes().size(), 0.0); - JsonMapping.OBJECT_MAPPER.writeValue(inputDiagram, syntheticDiagram); + createObjectMapper().writeValue(inputDiagram, syntheticDiagram); DiagramConsistency runner = new DiagramConsistency(name); diff --git a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/SyntheticTestBase.java b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/SyntheticTestBase.java index 518882bdd..769052bd2 100644 --- a/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/SyntheticTestBase.java +++ b/stages/diagram-consistency/src/test/java/edu/kit/kastel/mcse/ardoco/core/diagramconsistency/informants/SyntheticTestBase.java @@ -1,8 +1,9 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.diagramconsistency.informants; +import static edu.kit.kastel.mcse.ardoco.core.common.JsonHandling.createObjectMapper; import static org.apache.commons.lang3.ClassUtils.getSimpleName; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import java.io.File; import java.io.IOException; @@ -13,7 +14,6 @@ import java.util.SortedMap; import java.util.TreeMap; -import edu.kit.kastel.mcse.ardoco.core.api.diagramconsistency.common.JsonMapping; import edu.kit.kastel.mcse.ardoco.core.api.diagramrecognition.Box; import edu.kit.kastel.mcse.ardoco.core.api.models.ArchitectureModelType; import edu.kit.kastel.mcse.ardoco.core.api.models.CodeModelType; @@ -27,7 +27,14 @@ import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.MetricsStats; import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.data.AnnotatedDiagram; import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.data.DiagramProject; -import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.refactoring.*; +import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.refactoring.Connect; +import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.refactoring.Create; +import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.refactoring.Delete; +import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.refactoring.Disconnect; +import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.refactoring.Move; +import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.refactoring.Refactoring; +import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.refactoring.RefactoringBundle; +import edu.kit.kastel.mcse.ardoco.core.diagramconsistency.evaluation.refactoring.Rename; class SyntheticTestBase extends EvaluationTestBase { protected static final int REFACTORING_TYPE_COUNT = 6; @@ -127,7 +134,7 @@ protected void doEvaluationIterations(ExaminationDescription description, int it private Metrics examineOnSyntheticDiagram(ExaminationDescription description) throws IOException { String name = description.project().name().toLowerCase(Locale.ROOT); - File inputArchitectureModel = description.project().getSourceProject().getProject().getModelFile(ArchitectureModelType.UML); + File inputArchitectureModel = description.project().getSourceProject().getModelFile(ArchitectureModelType.UML); File inputCodeModel = new File(Objects.requireNonNull(description.project().getSourceProject().getCodeModelDirectory())).getAbsoluteFile(); File inputDiagram = File.createTempFile("temp", ".json"); File outputDir = new File(PIPELINE_OUTPUT); @@ -156,7 +163,7 @@ private Metrics examineOnSyntheticDiagram(ExaminationDescription description) th default -> throw new IllegalArgumentException("Unexpected value: " + description.generalModelType()); } - JsonMapping.OBJECT_MAPPER.writeValue(inputDiagram, syntheticDiagram.diagram()); + createObjectMapper().writeValue(inputDiagram, syntheticDiagram.diagram()); DiagramConsistency runner = new DiagramConsistency(name); this.setupExamination(modelType, runner.getDataRepository()); diff --git a/stages/diagram-consistency/src/test/resources/.gitignore b/stages/diagram-consistency/src/test/resources/.gitignore index edba3d3fe..39c5339c5 100644 --- a/stages/diagram-consistency/src/test/resources/.gitignore +++ b/stages/diagram-consistency/src/test/resources/.gitignore @@ -1 +1,2 @@ test_out +pipeline_out diff --git a/stages/diagram-recognition/src/main/kotlin/edu/kit/kastel/mcse/ardoco/lissa/diagramrecognition/model/DiagramImpl.kt b/stages/diagram-recognition/src/main/kotlin/edu/kit/kastel/mcse/ardoco/lissa/diagramrecognition/model/DiagramImpl.kt index 403dc1b21..ee9295194 100644 --- a/stages/diagram-recognition/src/main/kotlin/edu/kit/kastel/mcse/ardoco/lissa/diagramrecognition/model/DiagramImpl.kt +++ b/stages/diagram-recognition/src/main/kotlin/edu/kit/kastel/mcse/ardoco/lissa/diagramrecognition/model/DiagramImpl.kt @@ -7,11 +7,22 @@ import edu.kit.kastel.mcse.ardoco.core.api.diagramrecognition.TextBox import java.io.File import java.util.Objects -class DiagramImpl(private val resourceName: String, private val location: File) : +class DiagramImpl : Diagram { - private val boxes: MutableList = mutableListOf() - private val textBoxes: MutableList = mutableListOf() - private val connectors: MutableList = mutableListOf() + private val resourceName: String + private val location: File + + constructor(resourceName: String, location: File) { + this.resourceName = resourceName + this.location = location + this.boxes = mutableListOf() + this.textBoxes = mutableListOf() + this.connectors = mutableListOf() + } + + private val boxes: MutableList + private val textBoxes: MutableList + private val connectors: MutableList private constructor() : this("", File("")) { } diff --git a/stages/inconsistency-detection/src/main/java/edu/kit/kastel/mcse/ardoco/core/inconsistency/informants/UnwantedWordsFilter.java b/stages/inconsistency-detection/src/main/java/edu/kit/kastel/mcse/ardoco/core/inconsistency/informants/UnwantedWordsFilter.java index e1c16a730..9bb2d7334 100644 --- a/stages/inconsistency-detection/src/main/java/edu/kit/kastel/mcse/ardoco/core/inconsistency/informants/UnwantedWordsFilter.java +++ b/stages/inconsistency-detection/src/main/java/edu/kit/kastel/mcse/ardoco/core/inconsistency/informants/UnwantedWordsFilter.java @@ -1,6 +1,8 @@ -/* Licensed under MIT 2022-2023. */ +/* Licensed under MIT 2022-2024. */ package edu.kit.kastel.mcse.ardoco.core.inconsistency.informants; +import static edu.kit.kastel.mcse.ardoco.core.common.JsonHandling.createObjectMapper; + import java.io.IOException; import java.util.Collections; import java.util.List; @@ -11,7 +13,6 @@ import org.eclipse.collections.api.factory.Lists; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import edu.kit.kastel.mcse.ardoco.core.api.inconsistency.InconsistencyState; import edu.kit.kastel.mcse.ardoco.core.api.recommendationgenerator.RecommendedInstance; @@ -117,7 +118,7 @@ protected void delegateApplyConfigurationToInternalObjects(SortedMap loadCommonBlacklist() { try { - return Collections.unmodifiableList(new ObjectMapper().readValue(this.getClass().getResourceAsStream("/unwanted_words_filter_common.json"), + return Collections.unmodifiableList(createObjectMapper().readValue(this.getClass().getResourceAsStream("/unwanted_words_filter_common.json"), new TypeReference>() { })); } catch (IOException e) { diff --git a/stages/model-provider/src/main/java/edu/kit/kastel/mcse/ardoco/core/models/connectors/generators/code/CodeExtractor.java b/stages/model-provider/src/main/java/edu/kit/kastel/mcse/ardoco/core/models/connectors/generators/code/CodeExtractor.java index 650adb737..279ff8175 100644 --- a/stages/model-provider/src/main/java/edu/kit/kastel/mcse/ardoco/core/models/connectors/generators/code/CodeExtractor.java +++ b/stages/model-provider/src/main/java/edu/kit/kastel/mcse/ardoco/core/models/connectors/generators/code/CodeExtractor.java @@ -1,16 +1,15 @@ -/* Licensed under MIT 2023. */ +/* Licensed under MIT 2023-2024. */ package edu.kit.kastel.mcse.ardoco.core.models.connectors.generators.code; +import static edu.kit.kastel.mcse.ardoco.core.common.JsonHandling.createObjectMapper; + import java.io.File; import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import edu.kit.kastel.mcse.ardoco.core.api.models.CodeModelType; @@ -81,17 +80,4 @@ private String getCodeModelFileString() { return path + File.separator + CODE_MODEL_FILE_NAME; } - private static ObjectMapper createObjectMapper() { - ObjectMapper oom = new ObjectMapper(); - oom.setVisibility(oom.getSerializationConfig() - .getDefaultVisibilityChecker() // - .withFieldVisibility(JsonAutoDetect.Visibility.ANY)// - .withGetterVisibility(JsonAutoDetect.Visibility.NONE)// - .withSetterVisibility(JsonAutoDetect.Visibility.NONE)// - .withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)); - oom.enable(SerializationFeature.INDENT_OUTPUT); - oom.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); - return oom; - } - } diff --git a/stages/text-extraction/src/test/java/edu/kit/kastel/mcse/ardoco/core/textextraction/agents/PDFExtractorTestCase.java b/stages/text-extraction/src/test/java/edu/kit/kastel/mcse/ardoco/core/textextraction/agents/PDFExtractorTestCase.java index a894c865c..389166092 100644 --- a/stages/text-extraction/src/test/java/edu/kit/kastel/mcse/ardoco/core/textextraction/agents/PDFExtractorTestCase.java +++ b/stages/text-extraction/src/test/java/edu/kit/kastel/mcse/ardoco/core/textextraction/agents/PDFExtractorTestCase.java @@ -1,6 +1,8 @@ -/* Licensed under MIT 2022-2023. */ +/* Licensed under MIT 2022-2024. */ package edu.kit.kastel.mcse.ardoco.core.textextraction.agents; +import static edu.kit.kastel.mcse.ardoco.core.common.JsonHandling.createObjectMapper; + import java.io.File; import java.io.IOException; import java.util.Set; @@ -14,8 +16,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; -import com.fasterxml.jackson.databind.ObjectMapper; - import edu.kit.kastel.mcse.ardoco.core.architecture.Deterministic; /** @@ -101,6 +101,6 @@ private void extract(String in, String out, BiConsumer getDiagramTraceLinks(List se @Override public Set getDiagramsGoldStandard() { try { - var objectMapper = new ObjectMapper(); + var objectMapper = createObjectMapper(); var file = getDiagramsGoldStandardFile(); objectMapper.setInjectableValues(new InjectableValues.Std().addValue(DiagramProject.class, this)); return new LinkedHashSet<>(List.of(objectMapper.readValue(file, DiagramsGS.class).diagrams));