uoa-validator-engine2/src/main/java/eu/dnetlib/validator2/engine/builtins/XMLRule.java

50 lines
1.5 KiB
Java

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<C extends XMLContext> implements Rule<Document> {
private static final Logger logger = LogManager.getLogger();
private final C context;
public final Predicate<NodeList> predicate;
public XMLRule(C context, Predicate<NodeList> 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();
}
}