Refactoring
This commit is contained in:
		
							parent
							
								
									03d94c77d7
								
							
						
					
					
						commit
						8f55fdd94b
					
				@ -1,12 +1,12 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright © 2016-2023 The Thingsboard Authors
 | 
			
		||||
 *
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * <p>
 | 
			
		||||
 * http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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<Byte> 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<String, Object> map) {
 | 
			
		||||
        toFlatMap(json, map, new ArrayList<>(), true);
 | 
			
		||||
    public static ExecutionHashMap<String, Object> toFlatMap(ExecutionContext ctx, Map<String, Object> json) {
 | 
			
		||||
        return toFlatMap(ctx, json, new ArrayList<>(), true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void toFlatMap(Object json, HashMap<String, Object> map, boolean pathInKey) {
 | 
			
		||||
        toFlatMap(json, map, new ArrayList<>(), pathInKey);
 | 
			
		||||
    public static ExecutionHashMap<String, Object> toFlatMap(ExecutionContext ctx, Map<String, Object> json, boolean pathInKey) {
 | 
			
		||||
        return toFlatMap(ctx, json, new ArrayList<>(), pathInKey);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void toFlatMap(Object json, HashMap<String, Object> map, List<String> excludeList) {
 | 
			
		||||
        toFlatMap(json, map, excludeList, true);
 | 
			
		||||
    public static ExecutionHashMap<String, Object> toFlatMap(ExecutionContext ctx, Map<String, Object> json, List<String> excludeList) {
 | 
			
		||||
        return toFlatMap(ctx, json, excludeList, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void toFlatMap(Object json, HashMap<String, Object> map, List<String> excludeList, boolean pathInKey) {
 | 
			
		||||
    public static ExecutionHashMap<String, Object> toFlatMap(ExecutionContext ctx, Map<String, Object> json, List<String> excludeList, boolean pathInKey) {
 | 
			
		||||
        ExecutionHashMap<String, Object> map = new ExecutionHashMap<>(16, ctx);
 | 
			
		||||
        parseRecursive(json, map, excludeList, "", pathInKey);
 | 
			
		||||
        return map;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void parseRecursive(Object json, HashMap<String, Object> map, List<String> excludeList, String path, boolean pathInKey) {
 | 
			
		||||
    private static void parseRecursive(Object json, Map<String, Object> map, List<String> excludeList, String path, boolean pathInKey) {
 | 
			
		||||
        if (json instanceof Map.Entry) {
 | 
			
		||||
            Map.Entry<?, ?> entry = (Map.Entry<?, ?>) json;
 | 
			
		||||
            if (StringUtils.isNotBlank(path)) {
 | 
			
		||||
 | 
			
		||||
@ -1,12 +1,12 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright © 2016-2023 The Thingsboard Authors
 | 
			
		||||
 *
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * <p>
 | 
			
		||||
 * http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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<String, Object> inputMap = new HashMap<>();
 | 
			
		||||
        ExecutionHashMap<String, Object> inputMap = new ExecutionHashMap<>(16, ctx);
 | 
			
		||||
        inputMap.put("name", "Alice");
 | 
			
		||||
        inputMap.put("age", 30);
 | 
			
		||||
        inputMap.put("devices", List.of(
 | 
			
		||||
                new HashMap<String, Object>() {{
 | 
			
		||||
        inputMap.put("devices", new ExecutionArrayList<>(List.of(
 | 
			
		||||
                new ExecutionHashMap<>(16, ctx) {{
 | 
			
		||||
                    put("id", "dev001");
 | 
			
		||||
                    put("type", "sensor");
 | 
			
		||||
                }},
 | 
			
		||||
                new HashMap<String, Object>() {{
 | 
			
		||||
                new ExecutionHashMap<>(16, ctx) {{
 | 
			
		||||
                    put("id", "dev002");
 | 
			
		||||
                    put("type", "actuator");
 | 
			
		||||
                }}
 | 
			
		||||
        ));
 | 
			
		||||
        inputMap.put("settings", new HashMap<String, Object>() {{
 | 
			
		||||
        ), ctx));
 | 
			
		||||
        inputMap.put("settings", new ExecutionHashMap<>(16, ctx) {{
 | 
			
		||||
            put("notifications", true);
 | 
			
		||||
            put("timezone", "UTC-5");
 | 
			
		||||
            put("params", new HashMap<String, Object>() {{
 | 
			
		||||
            put("params", new ExecutionHashMap<>(16, ctx) {{
 | 
			
		||||
                put("param1", "value1");
 | 
			
		||||
                put("param2", "value2");
 | 
			
		||||
                put("param3", new HashMap<String, Object>() {{
 | 
			
		||||
                put("param3", new ExecutionHashMap<>(16, ctx) {{
 | 
			
		||||
                    put("subParam1", "value1");
 | 
			
		||||
                    put("subParam2", "value2");
 | 
			
		||||
                }});
 | 
			
		||||
            }});
 | 
			
		||||
        }});
 | 
			
		||||
        ExecutionArrayList<String> excludeList = new ExecutionArrayList<>(ctx);
 | 
			
		||||
        excludeList.addAll(List.of("age", "id", "param1", "subParam2"));
 | 
			
		||||
 | 
			
		||||
        List<String> excludeList = List.of("age", "id", "param1", "subParam2");
 | 
			
		||||
 | 
			
		||||
        HashMap<String, Object> expectedMapWithPath = new HashMap<>();
 | 
			
		||||
        ExecutionHashMap<String, Object> 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<String, Object> actualMapWithPaths = new HashMap<>();
 | 
			
		||||
        TbUtils.toFlatMap(inputMap, actualMapWithPaths, excludeList, true);
 | 
			
		||||
        ExecutionHashMap<String, Object> actualMapWithPaths = TbUtils.toFlatMap(ctx, inputMap, excludeList, true);
 | 
			
		||||
 | 
			
		||||
        Assert.assertEquals(expectedMapWithPath, actualMapWithPaths);
 | 
			
		||||
 | 
			
		||||
        HashMap<String, Object> expectedMapWithoutPaths = new HashMap<>();
 | 
			
		||||
        ExecutionHashMap<String, Object> 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<String, Object> actualMapWithoutPaths = new HashMap<>();
 | 
			
		||||
        TbUtils.toFlatMap(inputMap, actualMapWithoutPaths, new ArrayList<>(), false);
 | 
			
		||||
        ExecutionHashMap<String, Object> actualMapWithoutPaths = TbUtils.toFlatMap(ctx, inputMap, false);
 | 
			
		||||
 | 
			
		||||
        Assert.assertEquals(expectedMapWithoutPaths, actualMapWithoutPaths);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private static String keyToValue(String key, String extraSymbol) {
 | 
			
		||||
        return key + "Value" + (extraSymbol == null ? "" : extraSymbol);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user