CvDefinitionValidationHandler.java

  1. /*
  2.  * Copyright 2018 Leibniz-Institut für Analytische Wissenschaften – ISAS – e.V..
  3.  *
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  *
  8.  *      http://www.apache.org/licenses/LICENSE-2.0
  9.  *
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. package de.isas.mztab2.validation;

  17. import de.isas.lipidomics.mztab2.validation.Validator;
  18. import de.isas.mztab2.cvmapping.JxPathElement;
  19. import de.isas.mztab2.cvmapping.SetOperations;
  20. import de.isas.mztab2.io.serialization.ParameterConverter;
  21. import de.isas.mztab2.model.CV;
  22. import de.isas.mztab2.model.MzTab;
  23. import de.isas.mztab2.model.Parameter;
  24. import de.isas.mztab2.model.ValidationMessage;
  25. import java.util.ArrayList;
  26. import java.util.HashSet;
  27. import java.util.List;
  28. import java.util.Map;
  29. import java.util.Set;
  30. import java.util.stream.Collectors;
  31. import lombok.extern.slf4j.Slf4j;
  32. import org.apache.commons.jxpath.JXPathContext;
  33. import org.apache.commons.jxpath.Pointer;
  34. import org.apache.commons.lang3.tuple.Pair;
  35. import uk.ac.ebi.pride.jmztab2.utils.errors.CrossCheckErrorType;
  36. import uk.ac.ebi.pride.jmztab2.utils.errors.MZTabError;

  37. /**
  38.  * Validates that controlled vocabularies used by parameters are defined in the
  39.  * metadata CV section.
  40.  *
  41.  * @author nilshoffmann
  42.  */
  43. @Slf4j
  44. @lombok.Builder()
  45. public class CvDefinitionValidationHandler implements Validator<MzTab> {

  46.     @Override
  47.     public List<ValidationMessage> validate(MzTab mzTab) {
  48.         JXPathContext context = JXPathContext.newContext(mzTab);
  49.         return checkCvDefinitions(mzTab, context);
  50.     }

  51.     private List<ValidationMessage> checkCvDefinitions(MzTab mzTabFile,
  52.         JXPathContext context) {
  53.         Map<String, CV> cvTerms = mzTabFile.getMetadata().
  54.             getCv().
  55.             stream().
  56.             collect(Collectors.toMap((key) ->
  57.             {
  58.                 return key.getLabel();
  59.             }, (value) ->
  60.             {
  61.                 return value;
  62.             }));
  63.         List<ValidationMessage> messages = new ArrayList<>();
  64.         List<Pair<Pointer, Parameter>> parameters = JxPathElement.
  65.             toList(context, "//*[cvLabel!='']",
  66.                 Parameter.class);
  67.         log.debug("Selected {} cv parameters!", parameters.size());
  68.         Set<String> definedCvLabels = new HashSet<>(cvTerms.keySet());
  69.         Set<String> usedCvLabels = new HashSet<>();
  70.         parameters.stream().
  71.             forEach((t) ->
  72.             {
  73.                 Parameter param = t.getValue();
  74.                 log.debug("Checking parameter {}", new ParameterConverter().
  75.                     convert(param));
  76.                 if (param.getCvLabel() != null && !param.getCvLabel().
  77.                     isEmpty()) {
  78.                     usedCvLabels.add(param.getCvLabel());
  79.                     if (!cvTerms.containsKey(param.getCvLabel())) {
  80.                         log.debug(
  81.                             "Parameter {} uses undefined controlled vocabulary: {}",
  82.                             new ParameterConverter().
  83.                                 convert(param), param.getCvLabel());
  84.                         MZTabError error = new MZTabError(
  85.                             CrossCheckErrorType.CvUndefinedInMetadata, -1,
  86.                             param.getCvLabel(),
  87.                             new ParameterConverter().convert(param));
  88.                         messages.add(error.toValidationMessage());
  89.                     }
  90.                 }
  91.             });
  92.         Set<String> unusedCvLabels = SetOperations.complement(definedCvLabels,
  93.             usedCvLabels);
  94.         unusedCvLabels.stream().
  95.             forEach((cvLabel) ->
  96.             {
  97.                 log.debug(
  98.                     "Cv with label {} is not being used by any parameters!",
  99.                     cvLabel);
  100.                 MZTabError error = new MZTabError(
  101.                     CrossCheckErrorType.CvUnused, -1,
  102.                     cvLabel);
  103.                 messages.add(error.toValidationMessage());
  104.             });
  105.         return messages;
  106.     }
  107. }