package eu.dnetlib.validator2.engine.builtins; import eu.dnetlib.validator2.engine.Rule; import eu.dnetlib.validator2.engine.RuleEvaluationException; import eu.dnetlib.validator2.engine.contexts.XMLContext; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import java.util.function.Predicate; /** * An XML rule that evaluates an xpath in an XMLContext and then injects a custom nodelist predicate to * carry out the actual rule application. */ public class XMLRule implements Rule { private static final Logger logger = LogManager.getLogger(); private final C context; public final Predicate predicate; public XMLRule(C context, Predicate predicate) { this.context = context; this.predicate = predicate; } @Override public C getContext() { return context; } @Override public boolean test(Document doc) throws RuleEvaluationException { try { logger.debug("Applying {}", context.getIdProperty().getValue()); NodeList nodes = context.getXPathExpressionProperty().evaluate(doc); return predicate.test(nodes); } catch (Throwable t) { // Catch all exceptions here to simplify predicate code throw new RuleEvaluationException(t.getMessage(), t); } } @Override public String toString() { return getContext().getIdProperty().getValue(); } }