Skip to content

Commit

Permalink
Initial Impl with Legacy SAM
Browse files Browse the repository at this point in the history
  • Loading branch information
dfuchss committed Nov 27, 2023
1 parent bbc1636 commit 54a1df3
Show file tree
Hide file tree
Showing 19 changed files with 154 additions and 223 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ private static ImmutableList<ModelInstance> initArchitectureInstances(Architectu
MutableList<ModelInstance> instances = Lists.mutable.empty();
for (ArchitectureItem architectureItem : architectureModel.getEndpoints()) {
switch (architectureItem) {
// TODO Use MetaModel
case ArchitectureComponent component -> instances.add(new ModelInstanceImpl(component.getName(), component.getSubcomponents().isEmpty() ?
"Component" :
"CompositeComponent", component.getId()));
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
public class ModelStates implements PipelineStepData {
public static final String ID = "ModelStatesData";

private transient SortedMap<String, LegacyModelExtractionState> modelExtractionStates = new TreeMap<>();
private transient SortedMap<String, Model> models = new TreeMap<>();
private transient SortedMap<String, LegacyModelExtractionState> legacyModels = new TreeMap<>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,8 @@ public ImmutableList<SadSamTraceLink> getAllTraceLinks() {
MutableSet<SadSamTraceLink> traceLinks = Sets.mutable.empty();

for (var modelId : getModelIds()) {
traceLinks.addAll(getTraceLinksForModel(modelId).castToCollection());
if (getModelState(modelId).getMetamodel() == Metamodel.ARCHITECTURE)
traceLinks.addAll(getTraceLinksForModel(modelId).castToCollection());
}
return traceLinks.toImmutableList();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import edu.kit.kastel.mcse.ardoco.core.api.models.ArchitectureModelType;
import edu.kit.kastel.mcse.ardoco.core.execution.ArDoCoForSadCodeTraceabilityLinkRecovery;
import edu.kit.kastel.mcse.ardoco.core.execution.CodeRunnerBaseTest;
import edu.kit.kastel.mcse.ardoco.core.execution.ConfigurationHelper;
Expand All @@ -19,8 +18,7 @@ class ArDoCoForSadCodeTraceabilityLinkRecoveryTest extends CodeRunnerBaseTest {
void testSadCodeTlr() {
var runner = new ArDoCoForSadCodeTraceabilityLinkRecovery(PROJECT_NAME);
var additionalConfigsMap = ConfigurationHelper.loadAdditionalConfigs(new File(ADDITIONAL_CONFIGS));
runner.setUp(new File(INPUT_TEXT), new File(INPUT_MODEL_ARCHITECTURE), ArchitectureModelType.PCM, new File(CodeRunnerBaseTest.inputCode),
additionalConfigsMap, new File(OUTPUT_DIR));
runner.setUp(new File(INPUT_TEXT), new File(CodeRunnerBaseTest.inputCode), additionalConfigsMap, new File(OUTPUT_DIR));

testRunnerAssertions(runner);
Assertions.assertNotNull(runner.run());
Expand Down
2 changes: 1 addition & 1 deletion stages/diagram-recognition/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<dependency>
<groupId>io.github.ardoco</groupId>
<artifactId>docker</artifactId>
<version>0.18.0</version>
<version>0.19.0</version>
</dependency>
<dependency>
<groupId>io.github.ardoco.core</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import java.util.Optional;
import java.util.SortedMap;

import edu.kit.kastel.mcse.ardoco.core.api.models.ModelConnector;
import edu.kit.kastel.mcse.ardoco.core.api.models.ModelStates;
import edu.kit.kastel.mcse.ardoco.core.api.models.arcotl.CodeModel;
import edu.kit.kastel.mcse.ardoco.core.api.models.arcotl.Model;
Expand All @@ -14,7 +13,7 @@
import edu.kit.kastel.mcse.ardoco.core.pipeline.agent.Informant;

/**
* The model extractor extracts the instances and relations via an connector. The extracted items are stored in a model
* The model extractor extracts the instances and relations via a connector. The extracted items are stored in a model
* extraction state.
*/
public final class ArCoTLModelProviderInformant extends Informant {
Expand All @@ -29,7 +28,7 @@ private ArCoTLModelProviderInformant() {
}

/**
* Instantiates a new model provider that uses the provided {@link ModelConnector} to extract information into the {@link DataRepository}.
* Instantiates a new model provider to extract information into the {@link DataRepository}.
*
* @param dataRepository the data repository
* @param extractor the model connector
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.eclipse.collections.api.list.MutableList;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

Expand All @@ -24,6 +25,7 @@
import edu.kit.kastel.mcse.ardoco.core.textextraction.PhraseConcerningTextStateStrategy;
import edu.kit.kastel.mcse.ardoco.core.textextraction.TextStateImpl;

@Disabled("Java 21 vs. Mockito")
class MappingCombinerTest implements Claimant {

// Has to be aligned to MappingCombinerInformant
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,18 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import edu.kit.kastel.mcse.ardoco.core.api.models.ModelConnector;
import edu.kit.kastel.mcse.ardoco.core.api.models.ModelInstance;
import edu.kit.kastel.mcse.ardoco.core.api.models.ModelElement;
import edu.kit.kastel.mcse.ardoco.core.api.models.arcotl.ArchitectureModel;

public class GoldStandard {
private Logger logger = LoggerFactory.getLogger(GoldStandard.class);

private File goldStandard;
private ModelConnector model;
private ArchitectureModel model;

private MutableList<MutableList<ModelInstance>> sentence2instance = Lists.mutable.empty();
private MutableList<MutableList<ModelElement>> sentence2instance = Lists.mutable.empty();

public GoldStandard(File goldStandard, ModelConnector model) {
public GoldStandard(File goldStandard, ArchitectureModel model) {
this.goldStandard = goldStandard;
this.model = model;
load();
Expand All @@ -39,7 +39,7 @@ private void load() {
}

String[] idXline = line.strip().split(",", -1);
ModelInstance instance = model.getInstances().select(i -> i.getUid().equals(idXline[0])).getFirst();
ModelElement instance = Lists.immutable.withAll(model.getContent()).select(i -> i.getId().equals(idXline[0])).getFirst();
if (instance == null) {
System.err.println("No instance found for id \"" + idXline[0] + "\"");
continue;
Expand All @@ -55,16 +55,16 @@ private void load() {
}
}

public ImmutableList<ModelInstance> getModelInstances(int sentenceNo) {
public ImmutableList<ModelElement> getModelInstances(int sentenceNo) {
// Index starts at 1
return sentence2instance.get(sentenceNo).toImmutable();
}

public ImmutableList<Integer> getSentencesWithElement(ModelInstance elem) {
public ImmutableList<Integer> getSentencesWithElement(ModelElement elem) {
MutableList<Integer> sentences = Lists.mutable.empty();
for (int i = 0; i < sentence2instance.size(); i++) {
var instances = sentence2instance.get(i);
if (instances.anySatisfy(e -> e.getUid().equals(elem.getUid()))) {
if (instances.anySatisfy(e -> e.getId().equals(elem.getId()))) {
sentences.add(i);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import org.slf4j.LoggerFactory;

import edu.kit.kastel.mcse.ardoco.core.api.models.ArchitectureModelType;
import edu.kit.kastel.mcse.ardoco.core.api.models.ModelConnector;
import edu.kit.kastel.mcse.ardoco.core.api.models.arcotl.ArchitectureModel;
import edu.kit.kastel.mcse.ardoco.core.execution.ConfigurationHelper;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.results.ExpectedResults;

Expand Down Expand Up @@ -221,11 +221,11 @@ public ImmutableList<String> getTlrGoldStandard() {
/**
* Returns the {@link GoldStandard} for this project for the given model connector.
*
* @param pcmModel the model connector (pcm)
* @param architectureModel the model
* @return the {@link GoldStandard} for this project
*/
public GoldStandard getTlrGoldStandard(ModelConnector pcmModel) {
return new GoldStandard(getTlrGoldStandardFile(), pcmModel);
public GoldStandard getTlrGoldStandard(ArchitectureModel architectureModel) {
return new GoldStandard(getTlrGoldStandardFile(), architectureModel);
}

public MutableList<String> getMissingTextForModelElementGoldStandard() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void run() {
var connectionStates = DataRepositoryHelper.getConnectionStates(dataRepository);

var sentences = Sets.mutable.fromStream(text.getSentences().stream().map(Sentence::getSentenceNumber));
for (var model : modelStates.extractionModelIds()) {
for (var model : modelStates.modelIds()) {
var modelState = modelStates.getModelExtractionState(model);
Metamodel metamodel = modelState.getMetamodel();
var traceLinks = connectionStates.getConnectionState(metamodel).getTraceLinks();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,13 @@

import edu.kit.kastel.mcse.ardoco.core.api.inconsistency.InconsistentSentence;
import edu.kit.kastel.mcse.ardoco.core.api.inconsistency.ModelInconsistency;
import edu.kit.kastel.mcse.ardoco.core.api.models.ModelInstance;
import edu.kit.kastel.mcse.ardoco.core.api.models.ModelElement;
import edu.kit.kastel.mcse.ardoco.core.api.models.arcotl.ArchitectureModel;
import edu.kit.kastel.mcse.ardoco.core.api.models.arcotl.architecture.ArchitectureItem;
import edu.kit.kastel.mcse.ardoco.core.api.output.ArDoCoResult;
import edu.kit.kastel.mcse.ardoco.core.common.util.FilePrinter;
import edu.kit.kastel.mcse.ardoco.core.inconsistency.types.MissingModelInstanceInconsistency;
import edu.kit.kastel.mcse.ardoco.core.models.connectors.PcmXmlModelConnector;
import edu.kit.kastel.mcse.ardoco.core.models.connectors.generators.architecture.pcm.PcmExtractor;
import edu.kit.kastel.mcse.ardoco.core.tests.TestUtil;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.Project;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.results.EvaluationResults;
Expand Down Expand Up @@ -103,7 +105,7 @@ void missingModelElementInconsistencyHistoricIT(Project project) {

private void runMissingModelElementInconsistencyEval(Project project) {
logger.info("Start evaluation of MME-inconsistency for {}", project.name());
Map<ModelInstance, ArDoCoResult> runs = produceRuns(project);
Map<ModelElement, ArDoCoResult> runs = produceRuns(project);

var results = calculateEvaluationResults(project, runs);

Expand Down Expand Up @@ -147,7 +149,7 @@ private void runMissingModelElementInconsistencyBaselineEval(Project project) {
ranBaseline = true;

HoldBackRunResultsProducer holdBackRunResultsProducer = new HoldBackRunResultsProducer();
Map<ModelInstance, ArDoCoResult> runs = holdBackRunResultsProducer.produceHoldBackRunResults(project, true);
Map<ModelElement, ArDoCoResult> runs = holdBackRunResultsProducer.produceHoldBackRunResults(project, true);

Assertions.assertTrue(runs != null && runs.size() > 0);

Expand Down Expand Up @@ -202,10 +204,10 @@ private void runMissingTextInconsistencyEval(Project project) {
writeOutResults(project, results);
}

private static Map<ModelInstance, ArDoCoResult> produceRuns(Project project) {
private static Map<ModelElement, ArDoCoResult> produceRuns(Project project) {
HoldBackRunResultsProducer holdBackRunResultsProducer = new HoldBackRunResultsProducer();

Map<ModelInstance, ArDoCoResult> runs = holdBackRunResultsProducer.produceHoldBackRunResults(project, false);
Map<ModelElement, ArDoCoResult> runs = holdBackRunResultsProducer.produceHoldBackRunResults(project, false);

ArDoCoResult baseArDoCoResult = runs.get(null);
saveOutput(project, baseArDoCoResult);
Expand Down Expand Up @@ -260,12 +262,12 @@ void overAllResultsIT() {
}
}

private MutableList<EvaluationResults<String>> calculateEvaluationResults(Project project, Map<ModelInstance, ArDoCoResult> runs) {
private MutableList<EvaluationResults<String>> calculateEvaluationResults(Project project, Map<ModelElement, ArDoCoResult> runs) {

MutableList<EvaluationResults<String>> results = Lists.mutable.empty();

for (var run : runs.entrySet()) {
ModelInstance modelInstance = run.getKey();
ModelElement modelInstance = run.getKey();
ArDoCoResult arDoCoResult = run.getValue();
var runEvalResults = evaluateRun(project, modelInstance, arDoCoResult);
if (runEvalResults != null) {
Expand All @@ -279,7 +281,7 @@ private MutableList<EvaluationResults<String>> calculateEvaluationResults(Projec
return results;
}

private EvaluationResults<String> evaluateRun(Project project, ModelInstance removedElement, ArDoCoResult arDoCoResult) {
private EvaluationResults<String> evaluateRun(Project project, ModelElement removedElement, ArDoCoResult arDoCoResult) {
var modelId = arDoCoResult.getModelIds().get(0);

ImmutableList<MissingModelInstanceInconsistency> inconsistencies = arDoCoResult.getInconsistenciesOfTypeForModel(modelId,
Expand All @@ -301,10 +303,10 @@ private static EvaluationResults<String> calculateEvaluationResults(ArDoCoResult
return TestUtil.compareInconsistencies(arDoCoResult, actualSentences, expectedLines);
}

private static PcmXmlModelConnector getPcmModel(Project project) {
private static ArchitectureModel getPcmModel(Project project) {
try {
return new PcmXmlModelConnector(project.getModelFile());
} catch (IOException e) {
return new PcmExtractor(project.getModelFile().getAbsolutePath()).extractModel();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Expand All @@ -330,7 +332,7 @@ private void checkResults(EvaluationResults<String> results, ExpectedResults exp
.phiCoefficient() + " is below the expected minimum value " + expectedResults.phiCoefficient()));
}

private void writeOutResults(Project project, List<EvaluationResults<String>> results, Map<ModelInstance, ArDoCoResult> runs) {
private void writeOutResults(Project project, List<EvaluationResults<String>> results, Map<ModelElement, ArDoCoResult> runs) {
var outputs = createOutput(project, results, runs);
var outputBuilder = outputs.getOne();
var detailedOutputBuilder = outputs.getTwo();
Expand Down Expand Up @@ -392,7 +394,7 @@ private static void saveOutput(Project project, ArDoCoResult arDoCoResult) {
}

private static Pair<StringBuilder, StringBuilder> createOutput(Project project, List<EvaluationResults<String>> results,
Map<ModelInstance, ArDoCoResult> runs) {
Map<ModelElement, ArDoCoResult> runs) {
StringBuilder outputBuilder = createStringBuilderWithHeader(project);
var resultCalculatorStringBuilderPair = inspectResults(results, runs, outputBuilder);
var resultCalculator = resultCalculatorStringBuilderPair.getOne();
Expand Down Expand Up @@ -461,20 +463,20 @@ private static StringBuilder createStringBuilderWithHeader(Project project) {
}

private static Pair<MutableList<EvaluationResults<String>>, StringBuilder> inspectResults(List<EvaluationResults<String>> results,
Map<ModelInstance, ArDoCoResult> runs, StringBuilder outputBuilder) {
Map<ModelElement, ArDoCoResult> runs, StringBuilder outputBuilder) {
var detailedOutputBuilder = new StringBuilder();
MutableList<EvaluationResults<String>> resultsWithWeight = Lists.mutable.empty();
int counter = 0;
for (var run : runs.entrySet()) {
ArDoCoResult arDoCoResult = run.getValue();
ModelInstance instance = run.getKey();
ArchitectureItem instance = (ArchitectureItem) run.getKey();
if (instance == null) {
inspectBaseCase(outputBuilder, arDoCoResult);
} else {
outputBuilder.append("###").append(LINE_SEPARATOR);
detailedOutputBuilder.append("###").append(LINE_SEPARATOR);
outputBuilder.append("Removed Instance: ").append(instance.getFullName());
detailedOutputBuilder.append("Removed Instance: ").append(instance.getFullName());
outputBuilder.append("Removed Instance: ").append(instance.getName());
detailedOutputBuilder.append("Removed Instance: ").append(instance.getName());
outputBuilder.append(LINE_SEPARATOR);
detailedOutputBuilder.append(LINE_SEPARATOR);
var result = results.get(counter++);
Expand Down
Loading

0 comments on commit 54a1df3

Please sign in to comment.