All Downloads are FREE. Search and download functionalities are using the official Maven repository.

crypto.analysis.errors.AlternativeReqPredicateError Maven / Gradle / Ivy

package crypto.analysis.errors;

import crypto.analysis.AlternativeReqPredicate;
import crypto.analysis.AnalysisSeedWithSpecification;
import crypto.analysis.RequiredCrySLPredicate;
import crypto.analysis.UnEnsuredPredicate;
import crysl.rule.CrySLPredicate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

/**
 * Error that models a violation of required predicates with alternatives. Predicates from the
 * REQUIRES section may have the form
 *
 * 
{@code
 * REQUIRES
 *    generatedKey[...] || generatedPubKey[...] || generatedPrivKey[...];
 * }
* * If the base predicate "generatedKey" and any (relevant) alternative is not ensured, an error of * this class is reported. */ public class AlternativeReqPredicateError extends AbstractRequiredPredicateError { private final Collection contradictedPredicate; private final Collection relevantPredicates; public AlternativeReqPredicateError( AnalysisSeedWithSpecification seed, AlternativeReqPredicate violatedPred, Collection unEnsuredPredicates) { super(seed, violatedPred.getLocation(), seed.getSpecification(), unEnsuredPredicates); this.contradictedPredicate = List.copyOf(violatedPred.getAllAlternatives()); this.relevantPredicates = Set.copyOf(violatedPred.getRelAlternatives()); } public Collection getContradictedPredicate() { return contradictedPredicate; } public Collection getRelevantPredicates() { return relevantPredicates; } @Override public String toErrorMarkerString() { Collection added = new HashSet<>(); List msg = new ArrayList<>(); for (RequiredCrySLPredicate pred : relevantPredicates) { StringBuilder temp = new StringBuilder(); temp.append(getParamIndexAsText(pred.getParamIndex())); if (pred.getPred().isNegated()) { temp.append(" is generated as "); } else { temp.append(" was not properly generated as "); } temp.append(pred.getPred().getPredName()); msg.add(temp.toString()); added.add(pred.getPred()); } for (CrySLPredicate pred : contradictedPredicate) { if (added.contains(pred)) { continue; } msg.add(pred.getPredName() + " was not ensured (not relevant)"); } return String.join(" AND ", msg); } @Override public int hashCode() { return Objects.hash(super.hashCode(), contradictedPredicate, relevantPredicates); } @Override public boolean equals(Object obj) { return super.equals(obj) && obj instanceof AlternativeReqPredicateError other && Objects.equals(contradictedPredicate, other.getContradictedPredicate()) && Objects.equals(relevantPredicates, other.getRelevantPredicates()); } @Override public String toString() { return "AlternativeReqPredicateError: " + toErrorMarkerString(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy