Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 071ef71a by Tony Chemit at 2022-07-29T13:27:40+02:00 Moteur de scripting non trouvé en ouvrant ObServe 7.6.13 avec Java 17 - Closes #2413 - - - - - 8 changed files: - client-core/src/main/java/fr/ird/observe/client/ObserveRunner.java - common-dto/pom.xml - common-dto/src/main/java/fr/ird/observe/dto/ObserveUtil.java - common-dto/src/main/java/fr/ird/observe/dto/referential/FormulaHelper.java - common-dto/src/test/java/fr/ird/observe/dto/ScriptTest.java - dto/src/main/java/fr/ird/observe/dto/referential/seine/ObjectMaterialDto.java - pom.xml - services-local/src/test/java/fr/ird/observe/services/local/service/actions/validate/ValidateServiceLocalTest.java Changes: ===================================== client-core/src/main/java/fr/ird/observe/client/ObserveRunner.java ===================================== @@ -48,7 +48,6 @@ import org.nuiton.jaxx.runtime.swing.application.ApplicationRunner; import org.nuiton.util.StringUtil; import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.swing.UIManager; import java.io.File; @@ -88,7 +87,9 @@ public abstract class ObserveRunner extends ApplicationRunner { java.util.logging.LogManager.getLogManager().getLogger("").setLevel(Level.SEVERE); } - /** Logger */ + /** + * Logger + */ private static Logger log = LogManager.getLogger(ObserveRunner.class); private static ObserveResourceManager resourceManager; @@ -136,7 +137,7 @@ public abstract class ObserveRunner extends ApplicationRunner { .map(Path::toFile) .forEach(File::delete); } catch (IOException e) { - throw new IllegalStateException("Can't delete i18n directory: "+i18nDirectory, e); + throw new IllegalStateException("Can't delete i18n directory: " + i18nDirectory, e); } } @@ -147,8 +148,8 @@ public abstract class ObserveRunner extends ApplicationRunner { I18n.init(i18nInitializer, locale); - log.debug("i18n language : " + locale); - log.debug("i18n loading time : " + StringUtil.convertTime(t00, System.nanoTime())); + log.debug("i18n language : " + locale); + log.debug("i18n loading time : " + StringUtil.convertTime(t00, System.nanoTime())); } public abstract String getRunnerName(); @@ -559,9 +560,7 @@ public abstract class ObserveRunner extends ApplicationRunner { */ private void checkScriptEngineFound() { - ScriptEngineManager factory = new ScriptEngineManager(); - - ScriptEngine scriptEngine = factory.getEngineByExtension("js"); + ScriptEngine scriptEngine = ObserveUtil.getScriptEngine(); if (scriptEngine == null) { ===================================== common-dto/pom.xml ===================================== @@ -80,6 +80,11 @@ <groupId>com.google.auto.service</groupId> <artifactId>auto-service-annotations</artifactId> </dependency> + <dependency> + <groupId>org.mozilla</groupId> + <artifactId>rhino-engine</artifactId> + <scope>runtime</scope> + </dependency> <!-- test --> <dependency> ===================================== common-dto/src/main/java/fr/ird/observe/dto/ObserveUtil.java ===================================== @@ -25,6 +25,8 @@ package fr.ird.observe.dto; import io.ultreia.java4all.config.ApplicationConfig; import org.apache.logging.log4j.core.config.Configurator; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -54,6 +56,8 @@ import java.util.function.Supplier; */ public class ObserveUtil { + public static final String JS_ENGINE_NAME = "rhino"; + public static <C extends Class<?>> List<C> sortTypes(Collection<C> types, Function<Class, String> function, Locale locale) { List<C> list = new ArrayList<>(types); @@ -109,4 +113,10 @@ public class ObserveUtil { } } + + public static ScriptEngine getScriptEngine() { + ScriptEngineManager factory = new ScriptEngineManager(); + return factory.getEngineByName(JS_ENGINE_NAME); + } + } ===================================== common-dto/src/main/java/fr/ird/observe/dto/referential/FormulaHelper.java ===================================== @@ -22,19 +22,20 @@ package fr.ird.observe.dto.referential; * #L% */ -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import fr.ird.observe.dto.ObserveUtil; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.nuiton.util.NumberUtil; + import javax.script.Bindings; import javax.script.ScriptContext; import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; import javax.script.ScriptException; -import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; -import org.nuiton.util.NumberUtil; +import java.util.Map; +import java.util.TreeMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Created on 05/11/16. @@ -44,15 +45,18 @@ import org.nuiton.util.NumberUtil; */ public class FormulaHelper { - /** Logger */ private static final Logger log = LogManager.getLogger(FormulaHelper.class); private static final Pattern COEFFICIENTS_PATTERN = Pattern.compile("(.+)=(.+)"); - /** variable weight à utiliser dans la relation taille */ + /** + * weight variable to use ina length relation. + */ public static final String VARIABLE_WEIGHT = "P"; - /** variable taille à utiliser dans la relation weight */ + /** + * length variable to use in a weight relation. + */ public static final String VARIABLE_LENGTH = "L"; private static final String VARIABLE_X = "x"; @@ -64,43 +68,34 @@ public class FormulaHelper { public static final String COEFFICIENT_B = "b"; - /** moteur d'évaluation d'expression */ private static ScriptEngine scriptEngine; - private static ScriptEngine getScriptEngine() { if (scriptEngine == null) { - ScriptEngineManager factory = new ScriptEngineManager(); - - scriptEngine = factory.getEngineByExtension("js"); + scriptEngine = ObserveUtil.getScriptEngine(); } return scriptEngine; } - public static Map<String, Double> getCoefficientValues(WithFormula parametrage) { + public static Map<String, Double> getCoefficientValues(WithFormula formula) { Map<String, Double> result = new TreeMap<>(); - String coefficients = parametrage.getCoefficients(); + String coefficients = formula.getCoefficients(); if (coefficients != null) { for (String coefficientDef : coefficients.split(":")) { Matcher matcher = COEFFICIENTS_PATTERN.matcher(coefficientDef.trim()); - if (log.isDebugEnabled()) { - log.debug("constant to test = " + coefficientDef); - } + log.debug("constant to test = " + coefficientDef); if (matcher.matches()) { - String key = matcher.group(1); String val = matcher.group(2); try { Double d = Double.valueOf(val); result.put(key, d); - if (log.isDebugEnabled()) { - log.debug("detects coefficient " + key + '=' + val); - } + log.debug("detects coefficient " + key + '=' + val); } catch (NumberFormatException e) { - // pas pu recupere le count... + // could not get count + log.warn("could not parse double " + val + " for coefficient " + key); if (log.isWarnEnabled()) { - log.warn("could not parse double " + val + " for coefficient " + key); } } } @@ -109,66 +104,51 @@ public class FormulaHelper { return result; } - public static boolean validateRelation(WithFormula parametrage, String relation, String variable) { - boolean result = false; + public static boolean validateRelation(WithFormula formula, String relation, String variable) { if (!StringUtils.isEmpty(relation)) { - - Map<String, Double> coeffs = parametrage.getCoefficientValues(); - + Map<String, Double> coefficientValues = formula.getCoefficientValues(); ScriptEngine engine = getScriptEngine(); Bindings bindings = engine.createBindings(); - addBindings(coeffs, bindings, variable, 1); - + addBindings(coefficientValues, bindings, variable, 1); try { engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); - Double o = (Double) engine.eval("parseFloat(" + relation + ")"); - if (log.isDebugEnabled()) { - log.debug("evaluation ok : " + relation + " (" + variable + "=1) = " + o); - } - result = true; + Number o = (Number) engine.eval("parseFloat(" + relation + ")"); + log.debug("evaluation ok : " + relation + " (" + variable + "=1) = " + o); + return true; } catch (Exception e) { - if (log.isDebugEnabled()) { - log.debug("evaluation ko : " + relation + ", reason : " + e.getMessage()); - } + log.debug("evaluation ko : " + relation + ", reason : " + e.getMessage()); } } - return result; + return false; } public static boolean validateObjectMaterialValidation(String relation, Object value) { boolean result = false; if (!StringUtils.isEmpty(relation)) { - ScriptEngine engine = getScriptEngine(); Bindings bindings = engine.createBindings(); bindings.put(FormulaHelper.VARIABLE_X, value); - try { engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); Boolean o = (Boolean) engine.eval(relation); - if (log.isDebugEnabled()) { - log.debug(String.format("evaluation ok : %s (%s=%s) = %s", relation, FormulaHelper.VARIABLE_X, value, o)); - } + log.debug(String.format("evaluation ok : %s (%s=%s) = %s", relation, FormulaHelper.VARIABLE_X, value, o)); result = o != null && o; } catch (Exception e) { - if (log.isDebugEnabled()) { - log.debug("evaluation ko : " + relation + ", reason : " + e.getMessage()); - } + log.debug("evaluation ko : " + relation + ", reason : " + e.getMessage()); } } return result; } - public static Float computeValue(WithFormula parametrage, String formula, String coefficientName, String variableName, float data) { + public static Float computeValue(WithFormula formula, String relation, String coefficientName, String variableName, float data) { if (coefficientName != null) { - Double b = parametrage.getCoefficientValue(coefficientName); + Double b = formula.getCoefficientValue(coefficientName); if (b == 0) { - - // ce cas limite ne permet pas de calculer la taille a partir du weight + // limit case, can't compute length from weight return null; } } - Float o = computeValue(parametrage, formula, variableName, data); + Float o = computeValue(formula, relation, variableName, data); if (o != null) { o = NumberUtil.roundOneDigit(o); @@ -176,35 +156,30 @@ public class FormulaHelper { return o; } - private static Float computeValue(WithFormula parametrage, String relation, String variable, float taille) { - Map<String, Double> coeffs = parametrage.getCoefficientValues(); + private static Float computeValue(WithFormula formula, String relation, String variable, float data) { + Map<String, Double> coefficientValues = formula.getCoefficientValues(); ScriptEngine engine = getScriptEngine(); Bindings bindings = engine.createBindings(); - addBindings(coeffs, bindings, variable, taille); - + addBindings(coefficientValues, bindings, variable, data); engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); - Double o = null; + Number result; try { - o = (Double) engine.eval("parseFloat(" + relation + ")"); + result = ((Number) engine.eval("parseFloat(" + relation + ")")); } catch (ScriptException e) { - if (log.isErrorEnabled()) { - log.error("Could not compute value from " + relation); - } + log.error("Could not compute value from " + relation); + result = null; } - return o == null ? null : o.floatValue(); + return result == null ? null : result.floatValue(); } - private static void addBindings(Map<String, Double> coeffs, Bindings bindings, String variable, float taille) { - for (Map.Entry<String, Double> entry : coeffs.entrySet()) { + private static void addBindings(Map<String, Double> coefficientValues, Bindings bindings, String variable, float data) { + for (Map.Entry<String, Double> entry : coefficientValues.entrySet()) { String key = entry.getKey(); Double value = entry.getValue(); bindings.put(key, value); - - if (log.isDebugEnabled()) { - log.debug("add constant " + key + '=' + value); - } + log.debug("add constant " + key + '=' + value); } - bindings.put(variable, taille); + bindings.put(variable, data); } ===================================== common-dto/src/test/java/fr/ird/observe/dto/ScriptTest.java ===================================== @@ -21,19 +21,20 @@ */ package fr.ird.observe.dto; -import java.util.List; -import javax.script.ScriptContext; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineFactory; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.nuiton.util.StringUtil; +import javax.script.ScriptContext; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineFactory; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import java.util.List; + /** * @author Tony Chemit - dev@tchemit.fr * @since 1.2 @@ -49,7 +50,7 @@ public class ScriptTest { final double x = 10f; - protected static final String EXPRESSION = "a*(x^b)"; + protected static final String EXPRESSION = "parseFloat(a*(Math.pow(x, b)))"; protected static final String EXPRESSION_RESULT = "[%1$-10s] '%2$s' nb eval %3$-5s in %4$-10s (~ %5$s)"; @@ -60,34 +61,32 @@ public class ScriptTest { factory = new ScriptEngineManager(); List<ScriptEngineFactory> scriptEngineFactoryList = factory.getEngineFactories(); for (ScriptEngineFactory factory : scriptEngineFactoryList) { - if (log.isInfoEnabled()) { - log.info("available factory [engine: " + - factory.getEngineName() + " v." + - factory.getEngineVersion() + "] [language: " + - factory.getLanguageName() + ", version:" + - factory.getLanguageVersion() + "], mime-types : " + - "?" + factory.getMimeTypes() + - "?" + factory.getExtensions()); - } + log.info("available factory [engine: " + + factory.getEngineName() + " v." + + factory.getEngineVersion() + "] [language: " + + factory.getLanguageName() + ", version:" + + factory.getLanguageVersion() + "], mime-types : " + + "?" + factory.getMimeTypes() + + "?" + factory.getExtensions()); } } @Test public void testScripts() throws Exception { - doEvaluate(EXPRESSION, 1); - doEvaluate(EXPRESSION, 10); - doEvaluate(EXPRESSION, 100); - doEvaluate(EXPRESSION, 1000); + doEvaluate(1); + doEvaluate(10); + doEvaluate(100); + doEvaluate(1000); - doEvaluate(EXPRESSION, 1000); - doEvaluate(EXPRESSION, 100); - doEvaluate(EXPRESSION, 10); - doEvaluate(EXPRESSION, 1); + doEvaluate(1000); + doEvaluate(100); + doEvaluate(10); + doEvaluate(1); } - protected void doEvaluate(String expression, int nb) throws ScriptException { - ScriptEngine engine = factory.getEngineByExtension("js"); + protected void doEvaluate(int nb) throws ScriptException { + ScriptEngine engine = ObserveUtil.getScriptEngine(); long t0 = System.nanoTime(); for (int i = 0; i < nb; i++) { @@ -96,13 +95,13 @@ public class ScriptTest { c.setAttribute("a", a, ScriptContext.GLOBAL_SCOPE); c.setAttribute("x", x, ScriptContext.GLOBAL_SCOPE); c.setAttribute("b", b, ScriptContext.GLOBAL_SCOPE); - Double o = (Double) engine.eval("parseFloat(a*x^b)"); + Double o = (Double) engine.eval(EXPRESSION); Assert.assertEquals(a * Math.pow(x, b), o, 5); } long t1 = System.nanoTime(); String result = String.format(EXPRESSION_RESULT, "js", - expression, + ScriptTest.EXPRESSION, nb, StringUtil.convertTime(t1 - t0), StringUtil.convertTime((t1 - t0) / nb)); ===================================== dto/src/main/java/fr/ird/observe/dto/referential/seine/ObjectMaterialDto.java ===================================== @@ -22,12 +22,12 @@ package fr.ird.observe.dto.referential.seine; * #L% */ -import org.apache.commons.lang3.StringUtils; +import fr.ird.observe.dto.ObserveUtil; +import org.apache.logging.log4j.util.Strings; import javax.script.Bindings; import javax.script.ScriptContext; import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; public class ObjectMaterialDto extends GeneratedObjectMaterialDto { @@ -57,7 +57,7 @@ public class ObjectMaterialDto extends GeneratedObjectMaterialDto { value = Boolean.TRUE; } else if (isInteger()) { value = 10; - }else if (isFloat()) { + } else if (isFloat()) { value = 10f; } boolean result = validateObjectMaterialValidation(validation, value); @@ -65,7 +65,7 @@ public class ObjectMaterialDto extends GeneratedObjectMaterialDto { } public boolean withValidation() { - return StringUtils.isNoneEmpty(validation); + return Strings.isNotEmpty(validation); } /** @@ -79,18 +79,15 @@ public class ObjectMaterialDto extends GeneratedObjectMaterialDto { /** moteur d'évaluation d'expression */ private static ScriptEngine scriptEngine; - private static ScriptEngine getScriptEngine() { if (scriptEngine == null) { - ScriptEngineManager factory = new ScriptEngineManager(); - - scriptEngine = factory.getEngineByExtension("js"); + scriptEngine = ObserveUtil.getScriptEngine(); } return scriptEngine; } public static boolean validateObjectMaterialValidation(String relation, Object value) { - if (!StringUtils.isEmpty(relation)) { + if (Strings.isNotEmpty(relation)) { ScriptEngine engine = getScriptEngine(); Bindings bindings = engine.createBindings(); @@ -98,7 +95,9 @@ public class ObjectMaterialDto extends GeneratedObjectMaterialDto { try { engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); - Boolean o = (Boolean) engine.eval(relation); + // See https://gitlab.com/ultreiaio/ird-observe/-/issues/2413#note_1044640610 + String fixedRelation = relation.replaceAll("length\\(\\)", "length"); + Boolean o = (Boolean) engine.eval(fixedRelation); return true; } catch (Exception e) { return false; ===================================== pom.xml ===================================== @@ -174,6 +174,7 @@ <lib.version.hikariCP>4.0.3</lib.version.hikariCP> <!-- <lib.version.hikariCP>5.0.0</lib.version.hikariCP>--> <lib.version.bytebuddy>1.12.9</lib.version.bytebuddy> + <lib.version.rhino>1.7.14</lib.version.rhino> <lib.version.nuiton.topia>3.8.1</lib.version.nuiton.topia> <lib.version.nuiton.version>1.0</lib.version.nuiton.version> <lib.version.log4j2>2.17.2</lib.version.log4j2> @@ -290,7 +291,16 @@ <artifactId>jaxx-widgets-combobox</artifactId> <version>${lib.version.java4all.jaxx}</version> </dependency> - + <dependency> + <groupId>org.mozilla</groupId> + <artifactId>rhino</artifactId> + <version>${lib.version.rhino}</version> + </dependency> + <dependency> + <groupId>org.mozilla</groupId> + <artifactId>rhino-engine</artifactId> + <version>${lib.version.rhino}</version> + </dependency> <dependency> <groupId>org.apache.struts.xwork</groupId> <artifactId>xwork-core</artifactId> ===================================== services-local/src/test/java/fr/ird/observe/services/local/service/actions/validate/ValidateServiceLocalTest.java ===================================== @@ -144,13 +144,13 @@ public class ValidateServiceLocalTest extends ServiceLocalTestSupport { ValidationResult<ReferentialValidationRequest> result = service.validateReferential(request); Assert.assertNotNull(result); - ImmutableSet<Class> types = result.getTypes(); + @SuppressWarnings("rawtypes") ImmutableSet<Class> types = result.getTypes(); - for (Class type : types) { + for (Class<?> type : types) { ImmutableSet<ValidationResultDtoMessage> messages = result.getMessagesForType(type); System.out.println("assertValidateResult(result, " + type.getSimpleName() + ".class, " + messages.size() + ");"); } - // no data of LengthLegnthParameter + // no data of LengthLengthParameter Assert.assertEquals(DtoModelClasses.REFERENTIAL_TYPES.size() - 1, types.size()); assertValidateResult(result, SpeciesGroupReleaseModeDto.class, 1); View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/071ef71a1c28f6a8b8123f2c72... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/071ef71a1c28f6a8b8123f2c72... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)