From 8f55fdd94b192d7849e381a38636f394be80ec8c Mon Sep 17 00:00:00 2001 From: imbeacon Date: Thu, 20 Apr 2023 17:41:27 +0300 Subject: [PATCH] Refactoring --- .../thingsboard/script/api/tbel/TbUtils.java | 37 ++++----- .../script/api/tbel/TbUtilsTest.java | 76 +++++++++++++------ 2 files changed, 72 insertions(+), 41 deletions(-) diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java index c4f86f80a3..f13ff8cad6 100644 --- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java +++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2023 The Thingsboard Authors - * + *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -32,7 +32,6 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -97,13 +96,13 @@ public class TbUtils { parserConfig.addImport("bytesToHex", new MethodStub(TbUtils.class.getMethod("bytesToHex", ExecutionArrayList.class))); parserConfig.addImport("toFlatMap", new MethodStub(TbUtils.class.getMethod("toFlatMap", - Object.class, HashMap.class))); + ExecutionContext.class, Map.class))); parserConfig.addImport("toFlatMap", new MethodStub(TbUtils.class.getMethod("toFlatMap", - Object.class, HashMap.class, boolean.class))); + ExecutionContext.class, Map.class, boolean.class))); parserConfig.addImport("toFlatMap", new MethodStub(TbUtils.class.getMethod("toFlatMap", - Object.class, HashMap.class, List.class))); + ExecutionContext.class, Map.class, List.class))); parserConfig.addImport("toFlatMap", new MethodStub(TbUtils.class.getMethod("toFlatMap", - Object.class, HashMap.class, List.class, boolean.class))); + ExecutionContext.class, Map.class, List.class, boolean.class))); } public static String btoa(String input) { @@ -240,7 +239,7 @@ public class TbUtils { } ExecutionArrayList data = new ExecutionArrayList<>(ctx); for (int i = 0; i < len; i += 2) { - data.add((byte)((Character.digit(hex.charAt(i), 16) << 4) + data.add((byte) ((Character.digit(hex.charAt(i), 16) << 4) + Character.digit(hex.charAt(i + 1), 16))); } return data; @@ -332,23 +331,25 @@ public class TbUtils { return value; } - public static void toFlatMap(Object json, HashMap map) { - toFlatMap(json, map, new ArrayList<>(), true); + public static ExecutionHashMap toFlatMap(ExecutionContext ctx, Map json) { + return toFlatMap(ctx, json, new ArrayList<>(), true); } - public static void toFlatMap(Object json, HashMap map, boolean pathInKey) { - toFlatMap(json, map, new ArrayList<>(), pathInKey); + public static ExecutionHashMap toFlatMap(ExecutionContext ctx, Map json, boolean pathInKey) { + return toFlatMap(ctx, json, new ArrayList<>(), pathInKey); } - public static void toFlatMap(Object json, HashMap map, List excludeList) { - toFlatMap(json, map, excludeList, true); + public static ExecutionHashMap toFlatMap(ExecutionContext ctx, Map json, List excludeList) { + return toFlatMap(ctx, json, excludeList, true); } - public static void toFlatMap(Object json, HashMap map, List excludeList, boolean pathInKey) { + public static ExecutionHashMap toFlatMap(ExecutionContext ctx, Map json, List excludeList, boolean pathInKey) { + ExecutionHashMap map = new ExecutionHashMap<>(16, ctx); parseRecursive(json, map, excludeList, "", pathInKey); + return map; } - private static void parseRecursive(Object json, HashMap map, List excludeList, String path, boolean pathInKey) { + private static void parseRecursive(Object json, Map map, List excludeList, String path, boolean pathInKey) { if (json instanceof Map.Entry) { Map.Entry entry = (Map.Entry) json; if (StringUtils.isNotBlank(path)) { diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java index af10b7b49b..cafef85384 100644 --- a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java +++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2023 The Thingsboard Authors - * + *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,17 +15,50 @@ */ package org.thingsboard.script.api.tbel; +import lombok.extern.slf4j.Slf4j; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; +import org.mvel2.ExecutionContext; +import org.mvel2.ParserContext; +import org.mvel2.SandboxedParserConfiguration; +import org.mvel2.execution.ExecutionArrayList; +import org.mvel2.execution.ExecutionHashMap; import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Calendar; import java.util.List; -import java.util.Map; +import java.util.Random; + +@Slf4j public class TbUtilsTest { + private ExecutionContext ctx; + + @Before + public void before() { + SandboxedParserConfiguration parserConfig = ParserContext.enableSandboxedMode(); + parserConfig.addImport("JSON", TbJson.class); + parserConfig.registerDataType("Date", TbDate.class, date -> 8L); + parserConfig.registerDataType("Random", Random.class, date -> 8L); + parserConfig.registerDataType("Calendar", Calendar.class, date -> 8L); + try { + TbUtils.register(parserConfig); + } catch (Exception e) { + log.error("Cannot register functions", e); + } + ctx = new ExecutionContext(parserConfig); + Assert.assertNotNull(ctx); + } + + @After + public void after() { + ctx.stop(); + } + @Test public void parseHexToInt() { Assert.assertEquals(0xAB, TbUtils.parseHexToInt("AB")); @@ -91,35 +124,35 @@ public class TbUtilsTest { @Test public void toFlatMap() { - HashMap inputMap = new HashMap<>(); + ExecutionHashMap inputMap = new ExecutionHashMap<>(16, ctx); inputMap.put("name", "Alice"); inputMap.put("age", 30); - inputMap.put("devices", List.of( - new HashMap() {{ + inputMap.put("devices", new ExecutionArrayList<>(List.of( + new ExecutionHashMap<>(16, ctx) {{ put("id", "dev001"); put("type", "sensor"); }}, - new HashMap() {{ + new ExecutionHashMap<>(16, ctx) {{ put("id", "dev002"); put("type", "actuator"); }} - )); - inputMap.put("settings", new HashMap() {{ + ), ctx)); + inputMap.put("settings", new ExecutionHashMap<>(16, ctx) {{ put("notifications", true); put("timezone", "UTC-5"); - put("params", new HashMap() {{ + put("params", new ExecutionHashMap<>(16, ctx) {{ put("param1", "value1"); put("param2", "value2"); - put("param3", new HashMap() {{ + put("param3", new ExecutionHashMap<>(16, ctx) {{ put("subParam1", "value1"); put("subParam2", "value2"); }}); }}); }}); + ExecutionArrayList excludeList = new ExecutionArrayList<>(ctx); + excludeList.addAll(List.of("age", "id", "param1", "subParam2")); - List excludeList = List.of("age", "id", "param1", "subParam2"); - - HashMap expectedMapWithPath = new HashMap<>(); + ExecutionHashMap expectedMapWithPath = new ExecutionHashMap<>(16, ctx); expectedMapWithPath.put("name", "Alice"); expectedMapWithPath.put("devices.0.type", "sensor"); expectedMapWithPath.put("devices.1.type", "actuator"); @@ -128,12 +161,11 @@ public class TbUtilsTest { expectedMapWithPath.put("settings.params.param2", "value2"); expectedMapWithPath.put("settings.params.param3.subParam1", "value1"); - HashMap actualMapWithPaths = new HashMap<>(); - TbUtils.toFlatMap(inputMap, actualMapWithPaths, excludeList, true); + ExecutionHashMap actualMapWithPaths = TbUtils.toFlatMap(ctx, inputMap, excludeList, true); Assert.assertEquals(expectedMapWithPath, actualMapWithPaths); - HashMap expectedMapWithoutPaths = new HashMap<>(); + ExecutionHashMap expectedMapWithoutPaths = new ExecutionHashMap<>(16, ctx); expectedMapWithoutPaths.put("timezone", "UTC-5"); expectedMapWithoutPaths.put("name", "Alice"); expectedMapWithoutPaths.put("id", "dev002"); @@ -145,14 +177,12 @@ public class TbUtilsTest { expectedMapWithoutPaths.put("age", 30); expectedMapWithoutPaths.put("param2", "value2"); - HashMap actualMapWithoutPaths = new HashMap<>(); - TbUtils.toFlatMap(inputMap, actualMapWithoutPaths, new ArrayList<>(), false); + ExecutionHashMap actualMapWithoutPaths = TbUtils.toFlatMap(ctx, inputMap, false); Assert.assertEquals(expectedMapWithoutPaths, actualMapWithoutPaths); } - private static String keyToValue(String key, String extraSymbol) { return key + "Value" + (extraSymbol == null ? "" : extraSymbol); }