Skip to content

Commit

Permalink
Merge branch 'main' into feature/directly-load-acm-files
Browse files Browse the repository at this point in the history
  • Loading branch information
dfuchss committed Aug 23, 2024
2 parents b19f96a + 46c2b42 commit 2f96e47
Show file tree
Hide file tree
Showing 10 changed files with 61 additions and 82 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
/* Licensed under MIT 2023-2024. */
package edu.kit.kastel.mcse.ardoco.core.tests.eval;

import static edu.kit.kastel.mcse.ardoco.core.tests.eval.ProjectHelper.loadFileFromResources;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
Expand Down Expand Up @@ -146,40 +145,18 @@ public String getCommitHash() {
}

/**
* {@return path of the code directory}
*/
public String getCodeLocation() {
return getTemporaryCodeLocation().getAbsolutePath();
}

/**
* {@return the directory of the code model}
*/
public String getCodeModelDirectory() {
try {
loadCodeModelFromResourcesIfNeeded();
return getTemporaryCodeLocation().getAbsolutePath();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}

/**
* Loads the code from resources or from the code directoy cache
* Get Code Location (ACM File or Temporary Directory)
*
* @param acmFile If true, the ACM file is loaded from resources
*
* @throws IOException Can occur during file operations
*/
public void loadCodeModelFromResourcesIfNeeded() throws IOException {
if (ProjectHelper.ANALYZE_CODE_DIRECTLY.get())
return;

File temporaryCodeLocation = getTemporaryCodeLocation();
File codeModelFile = new File(temporaryCodeLocation + "/codeModel.acm");
try (InputStream is = getClass().getResourceAsStream(this.codeModelLocationInResources)) {
try (FileOutputStream fos = new FileOutputStream(codeModelFile)) {
is.transferTo(fos);
}
public File getCodeLocation(boolean acmFile) {
if (acmFile) {
// If ACM load file from resources
return loadFileFromResources(this.codeModelLocationInResources);
}

return getTemporaryCodeLocation();
}

/**
Expand All @@ -202,7 +179,7 @@ public ExpectedResults getExpectedResultsForSadSamCode() {
* @see TraceLinkUtilities#createTraceLinkString(String, String)
*/
public ImmutableList<String> getSamCodeGoldStandard() {
File samCodeGoldStandardFile = ProjectHelper.loadFileFromResources(samCodeGoldStandardLocation);
File samCodeGoldStandardFile = loadFileFromResources(samCodeGoldStandardLocation);
List<String> lines = getLinesFromGoldStandardFile(samCodeGoldStandardFile);

MutableList<String> goldStandard = Lists.mutable.empty();
Expand All @@ -222,7 +199,7 @@ public ImmutableList<String> getSamCodeGoldStandard() {
* {@return all lines from the gold standard in csv format}
*/
public ImmutableList<String> getSadCodeGoldStandard() {
File sadCodeGoldStandardFile = ProjectHelper.loadFileFromResources(sadCodeGoldStandardLocation);
File sadCodeGoldStandardFile = loadFileFromResources(sadCodeGoldStandardLocation);
List<String> lines = getLinesFromGoldStandardFile(sadCodeGoldStandardFile);
return Lists.immutable.ofAll(lines);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,11 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.util.concurrent.atomic.AtomicBoolean;

/**
* Helper class for {@link GoldStandardProject} implementations.
*/
public class ProjectHelper {
/**
* If set to false. The CodeProject will place the codeModel.acm file from the benchmark to the project directory.
*/
public static final AtomicBoolean ANALYZE_CODE_DIRECTLY = new AtomicBoolean(false);

private ProjectHelper() {
throw new IllegalAccessError();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ void testFiles(CodeProject project) {
Assertions.assertNotNull(project);
Assertions.assertNotNull(project.getCodeRepository());
Assertions.assertNotNull(project.getCommitHash());
Assertions.assertNotNull(project.getCodeLocation());
Assertions.assertNotNull(project.getCodeModelDirectory());
Assertions.assertNotNull(project.getCodeLocation(true));
Assertions.assertNotNull(project.getExpectedResultsForSamCode());
Assertions.assertNotNull(project.getExpectedResultsForSadSamCode());
Assertions.assertNotNull(project.getSamCodeGoldStandard());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@
import edu.kit.kastel.mcse.ardoco.core.api.models.arcotl.Model;
import edu.kit.kastel.mcse.ardoco.core.api.models.arcotl.architecture.ArchitectureComponent;
import edu.kit.kastel.mcse.ardoco.core.data.DataRepository;
import edu.kit.kastel.mcse.ardoco.core.pipeline.agent.PipelineAgent;
import edu.kit.kastel.mcse.ardoco.tlr.models.agents.ArCoTLModelProviderAgent;
import edu.kit.kastel.mcse.ardoco.tlr.models.connectors.generators.Extractor;
import edu.kit.kastel.mcse.ardoco.tlr.models.connectors.generators.architecture.pcm.PcmExtractor;
import edu.kit.kastel.mcse.ardoco.tlr.models.informants.ArCoTLModelProviderInformant;

public class HoldBackArCoTLModelProvider {

Expand Down Expand Up @@ -72,8 +74,8 @@ public ModelElement getCurrentHoldBack() {
return components.get(currentHoldBackIndex);
}

public ArCoTLModelProviderAgent get(SortedMap<String, String> additionalConfigs, DataRepository dataRepository) {
ArCoTLModelProviderAgent agent = new ArCoTLModelProviderAgent(dataRepository, List.of(new Extractor("") {
public PipelineAgent get(SortedMap<String, String> additionalConfigs, DataRepository dataRepository) {
PipelineAgent agent = new PipelineAgent(List.of(new ArCoTLModelProviderInformant(dataRepository, new Extractor("") {
@Override
public Model extractModel() {
var elements = new ArrayList<>(initialModel.getContent());
Expand All @@ -86,7 +88,12 @@ public Model extractModel() {
public ModelType getModelType() {
return ArchitectureModelType.PCM;
}
}));
})), ArCoTLModelProviderAgent.class.getSimpleName(), dataRepository) {
@Override
protected void delegateApplyConfigurationToInternalObjects(SortedMap<String, String> additionalConfiguration) {
// empty
}
};
agent.applyConfiguration(additionalConfigs);
return agent;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@

class SadCodeTraceabilityLinkRecoveryEvaluation extends TraceabilityLinkRecoveryEvaluation<CodeProject> {

private final boolean acmFile;

public SadCodeTraceabilityLinkRecoveryEvaluation(boolean acmFile) {
super();
this.acmFile = acmFile;
}

@Override
protected boolean resultHasRequiredData(ArDoCoResult arDoCoResult) {
var traceLinks = arDoCoResult.getSadCodeTraceLinks();
Expand All @@ -36,7 +43,7 @@ protected boolean resultHasRequiredData(ArDoCoResult arDoCoResult) {
protected ArDoCoRunner getAndSetupRunner(CodeProject codeProject) {
String name = codeProject.name().toLowerCase();
File textInput = codeProject.getTextFile();
File inputCode = getInputCode(codeProject);
File inputCode = getInputCode(codeProject, acmFile);
SortedMap<String, String> additionalConfigsMap = new TreeMap<>();
File outputDir = new File(OUTPUT);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@
import edu.kit.kastel.mcse.ardoco.tlr.execution.ArDoCoForSadSamCodeTraceabilityLinkRecovery;

class SadSamCodeTraceabilityLinkRecoveryEvaluation extends TraceabilityLinkRecoveryEvaluation<CodeProject> {
private final boolean acmFile;

public SadSamCodeTraceabilityLinkRecoveryEvaluation(boolean acmFile) {
super();
this.acmFile = acmFile;
}

@Override
protected boolean resultHasRequiredData(ArDoCoResult arDoCoResult) {
Expand All @@ -37,7 +43,7 @@ protected ArDoCoRunner getAndSetupRunner(CodeProject codeProject) {
String name = codeProject.name().toLowerCase();
File textInput = codeProject.getTextFile();
File inputArchitectureModel = codeProject.getModelFile();
File inputCode = getInputCode(codeProject);
File inputCode = getInputCode(codeProject, acmFile);
SortedMap<String, String> additionalConfigsMap = new TreeMap<>();
File outputDir = new File(OUTPUT);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@

class SamCodeTraceabilityLinkRecoveryEvaluation extends TraceabilityLinkRecoveryEvaluation<CodeProject> {

private final boolean acmFile;

public SamCodeTraceabilityLinkRecoveryEvaluation(boolean acmFile) {
super();
this.acmFile = acmFile;
}

@Override
protected boolean resultHasRequiredData(ArDoCoResult arDoCoResult) {
var traceLinks = arDoCoResult.getSamCodeTraceLinks();
Expand All @@ -32,7 +39,7 @@ protected boolean resultHasRequiredData(ArDoCoResult arDoCoResult) {
@Override
protected ArDoCoForSamCodeTraceabilityLinkRecovery getAndSetupRunner(CodeProject codeProject) {
String name = codeProject.name().toLowerCase();
File inputCode = getInputCode(codeProject);
File inputCode = getInputCode(codeProject, acmFile);
File inputArchitectureModel = codeProject.getModelFile();
SortedMap<String, String> additionalConfigsMap = new TreeMap<>();
File outputDir = new File(OUTPUT);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
/* Licensed under MIT 2023-2024. */
package edu.kit.kastel.mcse.ardoco.tlr.tests.integration;

import static edu.kit.kastel.mcse.ardoco.core.tests.eval.ProjectHelper.ANALYZE_CODE_DIRECTLY;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

import org.junit.jupiter.api.*;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
Expand All @@ -25,7 +22,6 @@ class TraceLinkEvaluationIT<T extends GoldStandardProject> {
protected static final String OUTPUT = "target/testout-tlr-it";

protected static final String LOGGING_ARDOCO_CORE = "org.slf4j.simpleLogger.log.edu.kit.kastel.mcse.ardoco.core";
protected static AtomicBoolean analyzeCodeDirectly = ANALYZE_CODE_DIRECTLY;

@BeforeAll
static void beforeAll() {
Expand All @@ -38,7 +34,7 @@ static void afterAll() {
}

private static void cleanUpCodeRepository(CodeProject codeProject) {
RepositoryHandler.removeRepository(codeProject.getCodeLocation());
RepositoryHandler.removeRepository(codeProject.getCodeLocation(false).getAbsolutePath());
}

@EnabledIfEnvironmentVariable(named = "testCodeFull", matches = ".*")
Expand All @@ -47,11 +43,9 @@ private static void cleanUpCodeRepository(CodeProject codeProject) {
@EnumSource(CodeProject.class)
@Order(1)
void evaluateSadSamCodeTlrFullIT(CodeProject project) {
analyzeCodeDirectly.set(true);
if (analyzeCodeDirectly.get())
cleanUpCodeRepository(project);
cleanUpCodeRepository(project);

var evaluation = new SadSamCodeTraceabilityLinkRecoveryEvaluation();
var evaluation = new SadSamCodeTraceabilityLinkRecoveryEvaluation(false);
ArDoCoResult results = evaluation.runTraceLinkEvaluation(project);
Assertions.assertNotNull(results);
}
Expand All @@ -62,11 +56,9 @@ void evaluateSadSamCodeTlrFullIT(CodeProject project) {
@EnumSource(value = CodeProject.class)
@Order(2)
void evaluateSamCodeTlrFullIT(CodeProject project) {
analyzeCodeDirectly.set(true);
if (analyzeCodeDirectly.get())
cleanUpCodeRepository(project);
cleanUpCodeRepository(project);

var evaluation = new SamCodeTraceabilityLinkRecoveryEvaluation();
var evaluation = new SamCodeTraceabilityLinkRecoveryEvaluation(false);
var results = evaluation.runTraceLinkEvaluation(project);
Assertions.assertNotNull(results);
}
Expand All @@ -76,11 +68,7 @@ void evaluateSamCodeTlrFullIT(CodeProject project) {
@EnumSource(CodeProject.class)
@Order(9)
void evaluateSadSamCodeTlrIT(CodeProject codeProject) {
analyzeCodeDirectly.set(false);
if (analyzeCodeDirectly.get())
cleanUpCodeRepository(codeProject);

var evaluation = new SadSamCodeTraceabilityLinkRecoveryEvaluation();
var evaluation = new SadSamCodeTraceabilityLinkRecoveryEvaluation(true);
var results = evaluation.runTraceLinkEvaluation(codeProject);
Assertions.assertNotNull(results);

Expand All @@ -92,11 +80,7 @@ void evaluateSadSamCodeTlrIT(CodeProject codeProject) {
@EnumSource(CodeProject.class)
@Order(10)
void evaluateSamCodeTlrIT(CodeProject project) {
analyzeCodeDirectly.set(false);
if (analyzeCodeDirectly.get())
cleanUpCodeRepository(project);

var evaluation = new SamCodeTraceabilityLinkRecoveryEvaluation();
var evaluation = new SamCodeTraceabilityLinkRecoveryEvaluation(true);
ArDoCoResult results = evaluation.runTraceLinkEvaluation(project);
Assertions.assertNotNull(results);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
/* Licensed under MIT 2023-2024. */
package edu.kit.kastel.mcse.ardoco.tlr.tests.integration;

import static edu.kit.kastel.mcse.ardoco.core.tests.eval.ProjectHelper.ANALYZE_CODE_DIRECTLY;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
Expand Down Expand Up @@ -42,8 +40,7 @@ static void afterAll() {
@ParameterizedTest(name = "{0}")
@EnumSource(CodeProject.class)
void evaluateSadCodeTlrIT(CodeProject project) {
ANALYZE_CODE_DIRECTLY.set(false);
var evaluation = new SadCodeTraceabilityLinkRecoveryEvaluation();
var evaluation = new SadCodeTraceabilityLinkRecoveryEvaluation(true);
ArDoCoResult results = evaluation.runTraceLinkEvaluation(project);
Assertions.assertNotNull(results);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,24 +63,24 @@ protected final ArDoCoResult runTraceLinkEvaluation(T project) {

protected abstract boolean resultHasRequiredData(ArDoCoResult potentialResults);

protected File getInputCode(CodeProject codeProject) {
protected File getInputCode(CodeProject codeProject, boolean acmFile) {
File inputCode;
if (TraceLinkEvaluationIT.analyzeCodeDirectly.get()) {
if (!acmFile) {
prepareCode(codeProject);
inputCode = new File(codeProject.getCodeLocation());
inputCode = codeProject.getCodeLocation(false);
} else {
inputCode = new File(codeProject.getCodeModelDirectory());
inputCode = codeProject.getCodeLocation(true);
}
return inputCode;
}

protected abstract ArDoCoRunner getAndSetupRunner(T project);

private void prepareCode(CodeProject codeProject) {
File codeLocation = new File(codeProject.getCodeLocation());
File codeLocation = codeProject.getCodeLocation(false);

if (!codeLocation.exists() || Objects.requireNonNull(codeLocation.listFiles()).length == 0) {
RepositoryHandler.shallowCloneRepository(codeProject.getCodeRepository(), codeProject.getCodeLocation(), codeProject.getCommitHash());
RepositoryHandler.shallowCloneRepository(codeProject.getCodeRepository(), codeLocation.getAbsolutePath(), codeProject.getCommitHash());
}
}

Expand Down

0 comments on commit 2f96e47

Please sign in to comment.