package org.molgenis.data.validation; import org.molgenis.data.Entity; import org.molgenis.data.MolgenisDataException; import org.molgenis.js.magma.JsMagmaScriptEvaluator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Collections; import java.util.List; import static java.util.Collections.singletonList; import static java.util.Objects.requireNonNull; /** * Validates entities using JavaScript expressions. Expressions can use the Magma API. */ @Component public class ExpressionValidator { @SuppressWarnings("unused") private static final Logger LOG = LoggerFactory.getLogger(ExpressionValidator.class); private final JsMagmaScriptEvaluator jsMagmaScriptEvaluator; @Autowired public ExpressionValidator(JsMagmaScriptEvaluator jsMagmaScriptEvaluator) { this.jsMagmaScriptEvaluator = requireNonNull(jsMagmaScriptEvaluator); } /** * Resolves a boolean expression (validation or visible expression) * * @param expression JavaScript expression * @param entity entity used during expression evaluation * @return <code>true</code> or <code>false</code> * @throws MolgenisDataException if the script resolves to null or to a non boolean */ boolean resolveBooleanExpression(String expression, Entity entity) { return resolveBooleanExpressions(singletonList(expression), entity).get(0); } /** * Resolved boolean expressions * * @param expressions JavaScript expressions * @param entity entity used during expression evaluations * @return for each expression: <code>true</code> or <code>false</code> */ List<Boolean> resolveBooleanExpressions(List<String> expressions, Entity entity) { if (expressions.isEmpty()) { return Collections.emptyList(); } List<Boolean> validationResults = new ArrayList<>(expressions.size()); for (String expression : expressions) { Object value = jsMagmaScriptEvaluator.eval(expression, entity); validationResults.add(value != null ? Boolean.valueOf(value.toString()) : null); } return validationResults; } }