Search in sources :

Example 1 with AuxiliaryRepository

use of de.tum.in.www1.artemis.domain.AuxiliaryRepository in project ArTEMiS by ls1intum.

the class ProgrammingExerciseImportService method updateAuxiliaryRepositoriesForNewExercise.

private void updateAuxiliaryRepositoriesForNewExercise(List<AuxiliaryRepository> newRepositories, List<AuxiliaryRepository> oldRepositories, AbstractBaseProgrammingExerciseParticipation participation, String targetExerciseProjectKey, ProgrammingExercise newExercise) {
    for (int i = 0; i < newRepositories.size(); i++) {
        AuxiliaryRepository newAuxiliaryRepository = newRepositories.get(i);
        AuxiliaryRepository oldAuxiliaryRepository = oldRepositories.get(i);
        String auxiliaryBranch = versionControlService.get().getOrRetrieveBranchOfExercise(newExercise);
        continuousIntegrationService.get().updatePlanRepository(targetExerciseProjectKey, participation.getBuildPlanId(), newAuxiliaryRepository.getName(), targetExerciseProjectKey, newAuxiliaryRepository.getRepositoryUrl(), oldAuxiliaryRepository.getRepositoryUrl(), auxiliaryBranch, Optional.empty());
    }
}
Also used : CodeHint(de.tum.in.www1.artemis.domain.hestia.CodeHint)

Example 2 with AuxiliaryRepository

use of de.tum.in.www1.artemis.domain.AuxiliaryRepository in project ArTEMiS by ls1intum.

the class AuxiliaryRepositoryService method validateAndAddAuxiliaryRepositoriesOfProgrammingExercise.

/**
 * Validates and adds all new Auxiliary Repositories that are added to the given exercise
 * @param programmingExercise The programming exercise where the auxiliary repositories are added
 * @param newAuxiliaryRepositories The newly added auxiliary repositories
 */
public void validateAndAddAuxiliaryRepositoriesOfProgrammingExercise(ProgrammingExercise programmingExercise, List<AuxiliaryRepository> newAuxiliaryRepositories) {
    List<AuxiliaryRepository> auxiliaryRepositories = new ArrayList<>(Objects.requireNonNullElse(programmingExercise.getAuxiliaryRepositories(), new ArrayList<AuxiliaryRepository>()).stream().filter(repo -> repo.getId() != null).toList());
    for (AuxiliaryRepository repo : newAuxiliaryRepositories) {
        validateAuxiliaryRepository(repo, auxiliaryRepositories, true);
        auxiliaryRepositories.add(repo);
    }
    programmingExercise.setAuxiliaryRepositories(new ArrayList<>());
    auxiliaryRepositories.forEach(programmingExercise::addAuxiliaryRepository);
}
Also used : ArrayList(java.util.ArrayList) AuxiliaryRepository(de.tum.in.www1.artemis.domain.AuxiliaryRepository)

Example 3 with AuxiliaryRepository

use of de.tum.in.www1.artemis.domain.AuxiliaryRepository in project ArTEMiS by ls1intum.

the class AuxiliaryRepositoryService method validateAndUpdateExistingAuxiliaryRepositoriesOfProgrammingExercise.

private void validateAndUpdateExistingAuxiliaryRepositoriesOfProgrammingExercise(ProgrammingExercise programmingExercise, List<AuxiliaryRepository> updatedAuxiliaryRepositories, ProgrammingExercise updatedExercise) {
    // Get all repositories that are unchanged and are still present in the updated exercise
    List<AuxiliaryRepository> auxiliaryRepositories = new ArrayList<>(Objects.requireNonNullElse(programmingExercise.getAuxiliaryRepositories(), new ArrayList<AuxiliaryRepository>()).stream().filter(existingRepo -> updatedAuxiliaryRepositories.stream().noneMatch((updatedRepo -> existingRepo.getId().equals(updatedRepo.getId()))) && updatedExercise.getAuxiliaryRepositories().stream().anyMatch(updatedRepo -> existingRepo.getId().equals(updatedRepo.getId()))).toList());
    for (AuxiliaryRepository repo : updatedAuxiliaryRepositories) {
        validateAuxiliaryRepository(repo, auxiliaryRepositories, programmingExercise.getAuxiliaryRepositories().stream().noneMatch(existingRepo -> existingRepo.getId().equals(repo.getId())));
        auxiliaryRepositories.add(repo);
    }
    updatedExercise.setAuxiliaryRepositories(new ArrayList<>());
    auxiliaryRepositories.forEach(updatedExercise::addAuxiliaryRepository);
}
Also used : AuxiliaryRepositoryRepository(de.tum.in.www1.artemis.repository.AuxiliaryRepositoryRepository) ProgrammingExercise(de.tum.in.www1.artemis.domain.ProgrammingExercise) BadRequestAlertException(de.tum.in.www1.artemis.web.rest.errors.BadRequestAlertException) AuxiliaryRepository(de.tum.in.www1.artemis.domain.AuxiliaryRepository) ArrayList(java.util.ArrayList) ProgrammingExerciseResourceErrorKeys(de.tum.in.www1.artemis.web.rest.ProgrammingExerciseResourceErrorKeys) ASSIGNMENT_CHECKOUT_PATH(de.tum.in.www1.artemis.config.Constants.ASSIGNMENT_CHECKOUT_PATH) Objects(java.util.Objects) List(java.util.List) Matcher(java.util.regex.Matcher) Service(org.springframework.stereotype.Service) RepositoryType(de.tum.in.www1.artemis.domain.enumeration.RepositoryType) Pattern(java.util.regex.Pattern) ArrayList(java.util.ArrayList) AuxiliaryRepository(de.tum.in.www1.artemis.domain.AuxiliaryRepository)

Example 4 with AuxiliaryRepository

use of de.tum.in.www1.artemis.domain.AuxiliaryRepository in project Artemis by ls1intum.

the class AuxiliaryRepositoryService method validateAndUpdateExistingAuxiliaryRepositoriesOfProgrammingExercise.

private void validateAndUpdateExistingAuxiliaryRepositoriesOfProgrammingExercise(ProgrammingExercise programmingExercise, List<AuxiliaryRepository> updatedAuxiliaryRepositories, ProgrammingExercise updatedExercise) {
    // Get all repositories that are unchanged and are still present in the updated exercise
    List<AuxiliaryRepository> auxiliaryRepositories = new ArrayList<>(Objects.requireNonNullElse(programmingExercise.getAuxiliaryRepositories(), new ArrayList<AuxiliaryRepository>()).stream().filter(existingRepo -> updatedAuxiliaryRepositories.stream().noneMatch((updatedRepo -> existingRepo.getId().equals(updatedRepo.getId()))) && updatedExercise.getAuxiliaryRepositories().stream().anyMatch(updatedRepo -> existingRepo.getId().equals(updatedRepo.getId()))).toList());
    for (AuxiliaryRepository repo : updatedAuxiliaryRepositories) {
        validateAuxiliaryRepository(repo, auxiliaryRepositories, programmingExercise.getAuxiliaryRepositories().stream().noneMatch(existingRepo -> existingRepo.getId().equals(repo.getId())));
        auxiliaryRepositories.add(repo);
    }
    updatedExercise.setAuxiliaryRepositories(new ArrayList<>());
    auxiliaryRepositories.forEach(updatedExercise::addAuxiliaryRepository);
}
Also used : AuxiliaryRepositoryRepository(de.tum.in.www1.artemis.repository.AuxiliaryRepositoryRepository) ProgrammingExercise(de.tum.in.www1.artemis.domain.ProgrammingExercise) BadRequestAlertException(de.tum.in.www1.artemis.web.rest.errors.BadRequestAlertException) AuxiliaryRepository(de.tum.in.www1.artemis.domain.AuxiliaryRepository) ArrayList(java.util.ArrayList) ProgrammingExerciseResourceErrorKeys(de.tum.in.www1.artemis.web.rest.ProgrammingExerciseResourceErrorKeys) ASSIGNMENT_CHECKOUT_PATH(de.tum.in.www1.artemis.config.Constants.ASSIGNMENT_CHECKOUT_PATH) Objects(java.util.Objects) List(java.util.List) Matcher(java.util.regex.Matcher) Service(org.springframework.stereotype.Service) RepositoryType(de.tum.in.www1.artemis.domain.enumeration.RepositoryType) Pattern(java.util.regex.Pattern) ArrayList(java.util.ArrayList) AuxiliaryRepository(de.tum.in.www1.artemis.domain.AuxiliaryRepository)

Example 5 with AuxiliaryRepository

use of de.tum.in.www1.artemis.domain.AuxiliaryRepository in project Artemis by ls1intum.

the class ProgrammingExerciseExportService method exportProgrammingExerciseRepositories.

/**
 * Export instructor repositories and optionally students' repositories in a zip file.
 *
 * The outputDir is used to store the zip file and temporary files used for zipping so make
 * sure to delete it if it's no longer used.
 *
 * @param exercise              the programming exercise
 * @param includingStudentRepos flag for including the students repos as well
 * @param outputDir             the path to a directory that will be used to store the zipped programming exercise.
 * @param exportErrors          List of failures that occurred during the export
 * @param reportData            List of all exercises and their statistics
 * @return the path to the zip file
 */
public Path exportProgrammingExerciseRepositories(ProgrammingExercise exercise, Boolean includingStudentRepos, Path outputDir, List<String> exportErrors, List<ArchivalReportEntry> reportData) {
    log.info("Exporting programming exercise {} with title {}", exercise.getId(), exercise.getTitle());
    // List to add paths of files that should be contained in the zip folder of exported programming exercise repositories:
    // i.e., student repositories (if `includingStudentRepos` is true), instructor repositories template, solution and tests
    var pathsToBeZipped = new ArrayList<Path>();
    if (includingStudentRepos) {
        // Lazy load student participation, sort by id, and set the export options
        var studentParticipations = studentParticipationRepository.findByExerciseId(exercise.getId()).stream().map(studentParticipation -> (ProgrammingExerciseStudentParticipation) studentParticipation).sorted(Comparator.comparing(DomainObject::getId)).collect(Collectors.toList());
        var exportOptions = new RepositoryExportOptionsDTO();
        exportOptions.setHideStudentNameInZippedFolder(false);
        // Export student repositories and add them to list
        var exportedStudentRepositoryFiles = exportStudentRepositories(exercise, studentParticipations, exportOptions, outputDir, exportErrors).stream().filter(Objects::nonNull).toList();
        pathsToBeZipped.addAll(exportedStudentRepositoryFiles);
    }
    // Export the template, solution, and tests repositories and add them to list
    pathsToBeZipped.add(exportInstructorRepositoryForExercise(exercise.getId(), RepositoryType.TEMPLATE, outputDir, exportErrors).map(File::toPath).orElse(null));
    pathsToBeZipped.add(exportInstructorRepositoryForExercise(exercise.getId(), RepositoryType.SOLUTION, outputDir, exportErrors).map(File::toPath).orElse(null));
    pathsToBeZipped.add(exportInstructorRepositoryForExercise(exercise.getId(), RepositoryType.TESTS, outputDir, exportErrors).map(File::toPath).orElse(null));
    List<AuxiliaryRepository> auxiliaryRepositories = auxiliaryRepositoryRepository.findByExerciseId(exercise.getId());
    // Export the auxiliary repositories and add them to list
    auxiliaryRepositories.forEach(auxiliaryRepository -> {
        pathsToBeZipped.add(exportInstructorAuxiliaryRepositoryForExercise(exercise.getId(), auxiliaryRepository, outputDir, exportErrors).map(File::toPath).orElse(null));
    });
    // Setup path to store the zip file for the exported repositories
    var timestamp = ZonedDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd-Hmss"));
    String filename = exercise.getCourseViaExerciseGroupOrCourseMember().getShortName() + "-" + exercise.getTitle() + "-" + exercise.getId() + "-" + timestamp + ".zip";
    String cleanFilename = fileService.removeIllegalCharacters(filename);
    Path pathToZippedExercise = Path.of(outputDir.toString(), cleanFilename);
    // Remove null elements and get the file path of each file to be included, i.e. each entry in the pathsToBeZipped list
    List<Path> includedFilePathsNotNull = pathsToBeZipped.stream().filter(Objects::nonNull).collect(Collectors.toList());
    String cleanProjectName = fileService.removeIllegalCharacters(exercise.getProjectName());
    // Add report entry, programming repositories cannot be skipped
    reportData.add(new ArchivalReportEntry(exercise, cleanProjectName, pathsToBeZipped.size(), includedFilePathsNotNull.size(), 0));
    try {
        // Only create zip file if there's files to zip
        if (includedFilePathsNotNull.isEmpty()) {
            String info = "Will not export programming exercise " + exercise.getId() + " with title " + exercise.getTitle() + " because it's empty";
            log.info(info);
            exportErrors.add(info);
            return null;
        }
        // Create the zip folder of the exported programming exercise and return the path to the created folder
        zipFileService.createZipFile(pathToZippedExercise, includedFilePathsNotNull, false);
        return pathToZippedExercise;
    } catch (Exception e) {
        var error = "Failed to export programming exercise because the zip file " + pathToZippedExercise + " could not be created: " + e.getMessage();
        log.info(error);
        exportErrors.add(error);
        return null;
    }
}
Also used : Path(java.nio.file.Path) XPath(javax.xml.xpath.XPath) RepositoryExportOptionsDTO(de.tum.in.www1.artemis.web.rest.dto.RepositoryExportOptionsDTO) ArchivalReportEntry(de.tum.in.www1.artemis.service.archival.ArchivalReportEntry) File(java.io.File) GitException(de.tum.in.www1.artemis.exception.GitException) GitAPIException(org.eclipse.jgit.api.errors.GitAPIException) UncheckedIOException(java.io.UncheckedIOException) SAXException(org.xml.sax.SAXException) TransformerException(javax.xml.transform.TransformerException) XPathException(javax.xml.xpath.XPathException) IOException(java.io.IOException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException)

Aggregations

AuxiliaryRepository (de.tum.in.www1.artemis.domain.AuxiliaryRepository)8 ArrayList (java.util.ArrayList)6 ASSIGNMENT_CHECKOUT_PATH (de.tum.in.www1.artemis.config.Constants.ASSIGNMENT_CHECKOUT_PATH)4 ProgrammingExercise (de.tum.in.www1.artemis.domain.ProgrammingExercise)4 RepositoryType (de.tum.in.www1.artemis.domain.enumeration.RepositoryType)4 CodeHint (de.tum.in.www1.artemis.domain.hestia.CodeHint)4 AuxiliaryRepositoryRepository (de.tum.in.www1.artemis.repository.AuxiliaryRepositoryRepository)4 ProgrammingExerciseResourceErrorKeys (de.tum.in.www1.artemis.web.rest.ProgrammingExerciseResourceErrorKeys)4 BadRequestAlertException (de.tum.in.www1.artemis.web.rest.errors.BadRequestAlertException)4 File (java.io.File)4 IOException (java.io.IOException)4 List (java.util.List)4 Objects (java.util.Objects)4 Matcher (java.util.regex.Matcher)4 Pattern (java.util.regex.Pattern)4 GitAPIException (org.eclipse.jgit.api.errors.GitAPIException)4 Service (org.springframework.stereotype.Service)4 GitException (de.tum.in.www1.artemis.exception.GitException)2 ArchivalReportEntry (de.tum.in.www1.artemis.service.archival.ArchivalReportEntry)2 FeatureToggle (de.tum.in.www1.artemis.service.feature.FeatureToggle)2