Search in sources :

Example 1 with RowValidationSummary

use of uk.ac.ebi.spot.goci.model.RowValidationSummary in project goci by EBISPOT.

the class AssociationFileUploadService method createRowValidationSummary.

/**
 * Return a list of syntax errors. These error checks will look for things that would prevent creation of an
 * association which could then be carried forward to full validation
 *
 * @param row Row to validate
 */
private RowValidationSummary createRowValidationSummary(AssociationUploadRow row, String eRelease) {
    getLog().info("Creating row summary for row " + row.getRowNumber());
    Collection<ValidationError> errors = validationService.runRowValidation(row, eRelease);
    RowValidationSummary rowValidationSummary = new RowValidationSummary();
    rowValidationSummary.setRow(row);
    rowValidationSummary.setErrors(errors);
    return rowValidationSummary;
}
Also used : RowValidationSummary(uk.ac.ebi.spot.goci.model.RowValidationSummary) ValidationError(uk.ac.ebi.spot.goci.model.ValidationError)

Example 2 with RowValidationSummary

use of uk.ac.ebi.spot.goci.model.RowValidationSummary in project goci by EBISPOT.

the class AssociationUploadService method upload.

@Transactional(readOnly = false)
public List<AssociationUploadErrorView> upload(MultipartFile file, Study study, SecureUser user) throws IOException, EnsemblMappingException {
    int s = study.getEvents().size();
    if (s > 0) {
        getLog().trace("Study " + study.getId().toString() + " has " + s + " events");
    }
    // File errors will contain any validation errors and be returned to controller if any are found
    List<AssociationUploadErrorView> fileErrors = new ArrayList<>();
    String originalFilename = file.getOriginalFilename();
    getLog().info("Uploading file: ".concat(originalFilename));
    // Upload file
    try {
        uploadFile(file, study.getId());
        // Send file, including path, to SNP batch loader process
        File uploadedFile = studyFileService.getFileFromFileName(study.getId(), originalFilename);
        ValidationSummary validationSummary = associationFileUploadService.processAndValidateAssociationFile(uploadedFile, "full");
        if (validationSummary != null) {
            // Check if we have any row errors
            long rowErrorCount = validationSummary.getRowValidationSummaries().parallelStream().filter(rowValidationSummary -> !rowValidationSummary.getErrors().isEmpty()).count();
            // Errors found
            if (rowErrorCount > 0) {
                studyFileService.deleteFile(study.getId(), originalFilename);
                getLog().error("Row errors found in file: " + originalFilename);
                validationSummary.getRowValidationSummaries().forEach(rowValidationSummary -> fileErrors.addAll(processRowError(rowValidationSummary)));
            } else {
                // Determine if we have any errors rather than warnings
                // Errors prevent saving association
                List<ValidationError> allAssociationsErrors = new ArrayList<>();
                validationSummary.getAssociationSummaries().forEach(associationSummary -> allAssociationsErrors.addAll(associationSummary.getErrors()));
                long associationErrorCount = allAssociationsErrors.parallelStream().filter(validationError -> !validationError.getWarning()).count();
                if (associationErrorCount > 0) {
                    studyFileService.deleteFile(study.getId(), originalFilename);
                    getLog().error("Association errors found in file: " + originalFilename);
                    validationSummary.getAssociationSummaries().forEach(associationSummary -> fileErrors.addAll(processAssociationError(associationSummary)));
                } else {
                    Integer numberOfAssociations = validationSummary.getAssociationSummaries().size();
                    String description = numberOfAssociations.toString().concat(" associations created from upload of '").concat(originalFilename).concat("'");
                    createBatchUploadEvent(study, description, user);
                    saveAssociations(validationSummary.getAssociationSummaries(), study, user);
                }
            }
        }
        return fileErrors;
    } catch (IOException e) {
        throw new IOException(e);
    }
}
Also used : LoggerFactory(org.slf4j.LoggerFactory) Autowired(org.springframework.beans.factory.annotation.Autowired) ValidationSummary(uk.ac.ebi.spot.goci.model.ValidationSummary) ArrayList(java.util.ArrayList) Service(org.springframework.stereotype.Service) Qualifier(org.springframework.beans.factory.annotation.Qualifier) StudyRepository(uk.ac.ebi.spot.goci.repository.StudyRepository) AssociationFileUploadService(uk.ac.ebi.spot.goci.service.AssociationFileUploadService) SecureUser(uk.ac.ebi.spot.goci.model.SecureUser) RowValidationSummary(uk.ac.ebi.spot.goci.model.RowValidationSummary) Logger(org.slf4j.Logger) Iterator(java.util.Iterator) Collection(java.util.Collection) EnsemblMappingException(uk.ac.ebi.spot.goci.exception.EnsemblMappingException) ValidationError(uk.ac.ebi.spot.goci.model.ValidationError) IOException(java.io.IOException) AssociationUploadErrorView(uk.ac.ebi.spot.goci.curation.model.AssociationUploadErrorView) File(java.io.File) TrackingOperationService(uk.ac.ebi.spot.goci.service.TrackingOperationService) List(java.util.List) Association(uk.ac.ebi.spot.goci.model.Association) MultipartFile(org.springframework.web.multipart.MultipartFile) Study(uk.ac.ebi.spot.goci.model.Study) AssociationSummary(uk.ac.ebi.spot.goci.model.AssociationSummary) Transactional(org.springframework.transaction.annotation.Transactional) ValidationSummary(uk.ac.ebi.spot.goci.model.ValidationSummary) RowValidationSummary(uk.ac.ebi.spot.goci.model.RowValidationSummary) ArrayList(java.util.ArrayList) IOException(java.io.IOException) AssociationUploadErrorView(uk.ac.ebi.spot.goci.curation.model.AssociationUploadErrorView) ValidationError(uk.ac.ebi.spot.goci.model.ValidationError) File(java.io.File) MultipartFile(org.springframework.web.multipart.MultipartFile) Transactional(org.springframework.transaction.annotation.Transactional)

Example 3 with RowValidationSummary

use of uk.ac.ebi.spot.goci.model.RowValidationSummary in project goci by EBISPOT.

the class ValidationLogService method processErrors.

public void processErrors(File checkedFile, ValidationSummary validationSummary) {
    Collection<AssociationSummary> associationSummaries = validationSummary.getAssociationSummaries();
    Collection<RowValidationSummary> rowValidationSummaries = validationSummary.getRowValidationSummaries();
    // / Create the log file
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'-T'HH-mm-ss");
    String now = dateFormat.format(new Date());
    String filePath = checkedFile.getParent();
    // If there is no file path just use current working dir
    if (filePath == null) {
        filePath = Paths.get(".").toAbsolutePath().normalize().toString();
    }
    String input_name = "";
    if (checkedFile.getName().contains(".xlsx")) {
        input_name = checkedFile.getName().replace(".xlsx", "");
    }
    String logName = filePath.concat(File.separator).concat(("Validation_results_").concat(input_name).concat("_").concat(now).concat(".txt"));
    System.out.println("Validation log written to " + logName);
    getLog().info("Validation log written to " + logName);
    // Write errors to file
    boolean fileCreationSuccess = false;
    File file = new File(logName);
    try {
        if (!file.exists()) {
            fileCreationSuccess = file.createNewFile();
        }
    } catch (IOException e) {
        getLog().error("Creating validation log failed");
        e.printStackTrace();
    }
    if (fileCreationSuccess) {
        FileWriter fw = null;
        try {
            fw = new FileWriter(file.getAbsoluteFile());
        } catch (IOException e) {
            getLog().error("Accessing validation log failed");
            e.printStackTrace();
        }
        BufferedWriter bw = new BufferedWriter(fw);
        try {
            writeErrorToFile(bw, associationSummaries, rowValidationSummaries);
        } catch (IOException e) {
            getLog().error("Writing to validation log failed");
            e.printStackTrace();
        }
    } else {
        getLog().error("Creating validation log failed");
    }
}
Also used : RowValidationSummary(uk.ac.ebi.spot.goci.model.RowValidationSummary) AssociationSummary(uk.ac.ebi.spot.goci.model.AssociationSummary) FileWriter(java.io.FileWriter) IOException(java.io.IOException) Date(java.util.Date) BufferedWriter(java.io.BufferedWriter) SimpleDateFormat(java.text.SimpleDateFormat) DateFormat(java.text.DateFormat) SimpleDateFormat(java.text.SimpleDateFormat) File(java.io.File)

Example 4 with RowValidationSummary

use of uk.ac.ebi.spot.goci.model.RowValidationSummary in project goci by EBISPOT.

the class AssociationFileUploadService method processAndValidateAssociationFile.

/**
 * Process uploaded file and return a list of errors
 *
 * @param file XLSX file supplied by user
 */
public ValidationSummary processAndValidateAssociationFile(File file, String validationLevel) throws FileNotFoundException, SheetProcessingException {
    ValidationSummary validationSummary = new ValidationSummary();
    Collection<RowValidationSummary> rowValidationSummaries = new ArrayList<>();
    Collection<AssociationSummary> associationSummaries = new ArrayList<>();
    Collection<AssociationUploadRow> fileRows = new ArrayList<>();
    if (file.exists()) {
        // Create sheet
        XSSFSheet sheet = null;
        try {
            // Create a sheet for reading
            sheet = sheetCreationService.createSheet(file.getAbsolutePath());
            // Process file, depending on validation level, into a generic row object
            UploadSheetProcessor uploadSheetProcessor = uploadSheetProcessorBuilder.buildProcessor(validationLevel);
            fileRows = uploadSheetProcessor.readSheetRows(sheet);
        } catch (InvalidFormatException | InvalidOperationException | IOException | NullPointerException e) {
            getLog().error("File: " + file.getName() + " cannot be processed", e);
            file.delete();
            throw new SheetProcessingException("File: " + file.getName() + " cannot be processed", e);
        }
    } else {
        getLog().error("File: " + file.getName() + " cannot be found");
        throw new FileNotFoundException("File does not exist");
    }
    String eRelease = ensemblRestTemplateService.getRelease();
    // Error check each row
    if (!fileRows.isEmpty()) {
        // Check for missing values and syntax errors that would prevent code creating an association
        for (AssociationUploadRow row : fileRows) {
            getLog().info("Syntax checking row: " + row.getRowNumber() + " of file, " + file.getAbsolutePath());
            RowValidationSummary rowValidationSummary = createRowValidationSummary(row, eRelease);
            // Only store summary if there is an error
            if (!rowValidationSummary.getErrors().isEmpty()) {
                rowValidationSummaries.add(rowValidationSummary);
            }
        }
        if (rowValidationSummaries.isEmpty()) {
            // Proceed to carry out full checks of values
            fileRows.forEach(row -> {
                associationSummaries.add(createAssociationSummary(row, validationLevel, eRelease));
            });
        }
    }
    validationSummary.setAssociationSummaries(associationSummaries);
    validationSummary.setRowValidationSummaries(rowValidationSummaries);
    return validationSummary;
}
Also used : SheetProcessingException(uk.ac.ebi.spot.goci.exception.SheetProcessingException) RowValidationSummary(uk.ac.ebi.spot.goci.model.RowValidationSummary) RowValidationSummary(uk.ac.ebi.spot.goci.model.RowValidationSummary) ValidationSummary(uk.ac.ebi.spot.goci.model.ValidationSummary) AssociationSummary(uk.ac.ebi.spot.goci.model.AssociationSummary) ArrayList(java.util.ArrayList) FileNotFoundException(java.io.FileNotFoundException) IOException(java.io.IOException) InvalidFormatException(org.apache.poi.openxml4j.exceptions.InvalidFormatException) XSSFSheet(org.apache.poi.xssf.usermodel.XSSFSheet) InvalidOperationException(org.apache.poi.openxml4j.exceptions.InvalidOperationException) AssociationUploadRow(uk.ac.ebi.spot.goci.model.AssociationUploadRow)

Aggregations

RowValidationSummary (uk.ac.ebi.spot.goci.model.RowValidationSummary)4 IOException (java.io.IOException)3 AssociationSummary (uk.ac.ebi.spot.goci.model.AssociationSummary)3 File (java.io.File)2 ArrayList (java.util.ArrayList)2 ValidationError (uk.ac.ebi.spot.goci.model.ValidationError)2 ValidationSummary (uk.ac.ebi.spot.goci.model.ValidationSummary)2 BufferedWriter (java.io.BufferedWriter)1 FileNotFoundException (java.io.FileNotFoundException)1 FileWriter (java.io.FileWriter)1 DateFormat (java.text.DateFormat)1 SimpleDateFormat (java.text.SimpleDateFormat)1 Collection (java.util.Collection)1 Date (java.util.Date)1 Iterator (java.util.Iterator)1 List (java.util.List)1 InvalidFormatException (org.apache.poi.openxml4j.exceptions.InvalidFormatException)1 InvalidOperationException (org.apache.poi.openxml4j.exceptions.InvalidOperationException)1 XSSFSheet (org.apache.poi.xssf.usermodel.XSSFSheet)1 Logger (org.slf4j.Logger)1