• TODO:AppiumTestDistribution--CapabilityManager 类


    该类代码详见git:https://github.com/AppiumTestDistribution/AppiumTestDistribution/tree/master/src/main/java/com/appium/capabilities

    我只知道他是用来做caps/capacities.json的json解析,但是具体怎么解析的不是很清楚,对jsonObject的类使用不清楚,看得很吃力,也没个注释。

    部分代码如下:

    /**
     * 初始化caps/capabilities.json的设备配置文件,getAllATDOverrideEnvVars方法可以从系统变量中获取atd开头的key -value键值对
     */
    public class CapabilityManager {
    
        private static CapabilityManager instance;
        private JSONObject capabilities;
    
        /**
         * 初始化配置文件:从caps/capabilities.json中读取设备信息
         */
        private CapabilityManager() {
            //设备配置路径
            String capabilitiesFilePath = getCapabilityLocation();
    //        解析json
            JsonParser jsonParser = new JsonParser(capabilitiesFilePath);
            StringBuilder varParsing = new StringBuilder(200);
            varParsing.append("atd").append("_");
            capabilities = loadAndOverrideFromEnvVars(jsonParser.getObjectFromJSON(),
                    new JSONObject(),
                    getAllATDOverrideEnvVars(),
                    varParsing);
        }
    
        /**
         * 单例模式
         * @return 返回设备配置文件信息
         */
        public static CapabilityManager getInstance() {
            if (instance == null) {
                instance = new CapabilityManager();
            }
            return instance;
        }
    
        /**
         * 返回当前系统的keyValue映射关系,找到atd开头的参数
         * @return atd开头的key的键值对
         */
        private Map<String, Object> getAllATDOverrideEnvVars() {
            Map<String, Object> atdOverrideEnv = new HashMap<>();
            System.getenv().forEach((key, value) -> {
                if (key.startsWith("atd")) {
                    atdOverrideEnv.put(key, value);
                }
            });
            return atdOverrideEnv;
        }

    ……………… }

      

    这里我不知道从哪里可以找到atd得配置,,,,在代码中找了很多地方,包括配置文件,都没有找到atd,这个来源不是很懂,要去读一下System.getenv()的API文档。

    另两个方法看的很疑惑,这里只po部分代码,这两个方法来回的调用,看得我一脸懵逼。。。。今天看了个设计模式叫代理模式,不知道这个方法的设计和代理模式有没有什么关联。还要找时间研究一下。

    /**
         * 加载并重写系统变量,遍历所有的json的最小单位,
         * @param originalObject 旧json
         * @param objectToUpdate 新json
         * @param allATDOverrideEnvVars 含有atd的键值对
         * @param currentPath 当前的String串
         * @return jsonObject
         */
        private JSONObject loadAndOverrideFromEnvVars(JSONObject originalObject,
                                                      JSONObject objectToUpdate,
                                                      Map<String, Object> allATDOverrideEnvVars,
                                                      StringBuilder currentPath) {
            Set<String> keys = originalObject.keySet();
            keys.forEach(keyStr -> {
                Object keyvalue = originalObject.get(keyStr);
                if (keyvalue instanceof JSONObject) {
                    processJSONObject(objectToUpdate,
                            allATDOverrideEnvVars,
                            currentPath,
                            //当前的json的key值
                            keyStr,
                            //当前key的value
                            (JSONObject) keyvalue);
                } else if (keyvalue instanceof JSONArray) {
                    processJSONArray(objectToUpdate,
                            allATDOverrideEnvVars,
                            currentPath,
                            keyStr,
                            (JSONArray) keyvalue);
                } else {
                    processJSONObject(objectToUpdate,
                            currentPath,
                            keyStr,
                            keyvalue);
                }
            });
            return objectToUpdate;
        }
    

      

    processJSONArray/JsonObject 的截取代码如下:

    private void processJSONObject(JSONObject objectToUpdate,
                                        StringBuilder currentPath,
                                        String keyStr,
                                        Object keyvalue) {
            currentPath.append(keyStr);
            String getFromEnv = System.getenv(currentPath.toString());
            Object updatedValue = (null == getFromEnv) ? keyvalue : getFromEnv;
            objectToUpdate.put(keyStr, updatedValue);
            currentPath.delete(currentPath.lastIndexOf("_") + 1, currentPath.length());
        }
    
        private void processJSONArray(JSONObject objectToUpdate,
                                      Map<String, Object> allATDOverrideEnvVars,
                                      StringBuilder currentPath,
                                      String keyStr,
                                      JSONArray keyvalue) {
            JSONArray jsonArray = new JSONArray();
            objectToUpdate.put(keyStr, jsonArray);
            currentPath.append(keyStr).append("_");
            JSONArray arrayValues = keyvalue;
            for (int arrIndex = 0; arrIndex < arrayValues.length(); arrIndex++) {
                processJSONArrayItem(allATDOverrideEnvVars,
                        currentPath,
                        jsonArray,
                        arrayValues,
                        arrIndex);
            }
            currentPath.delete(currentPath.lastIndexOf(keyStr), currentPath.length());
        }
    
        private void processJSONArrayItem(Map<String, Object> allATDOverrideEnvVars,
                                          StringBuilder currentPath,
                                          JSONArray jsonArray,
                                          JSONArray arrayValues,
                                          int arrIndex) {
            JSONObject arrayItem = (JSONObject) arrayValues.get(arrIndex);
            JSONObject jsonObject = new JSONObject();
            jsonArray.put(jsonObject);
            currentPath.append(arrIndex).append("_");
            loadAndOverrideFromEnvVars((JSONObject) arrayItem,
                    jsonObject,
                    allATDOverrideEnvVars,
                    currentPath);
            currentPath.delete(currentPath.lastIndexOf(String.valueOf(arrIndex)), currentPath.length());
        }
    
        /**
         *
         * @param objectToUpdate 要修改的jsonObject
         * @param allATDOverrideEnvVars 含有atd的键值对
         * @param currentPath 当前的string串
         * @param keyStr key值
         * @param keyvalue value值
         */
        private void processJSONObject(JSONObject objectToUpdate,
                                       Map<String, Object> allATDOverrideEnvVars,
                                       StringBuilder currentPath,
                                       String keyStr,
                                       JSONObject keyvalue) {
            JSONObject jsonObject = new JSONObject();
            //增加一层json的嵌套,key保留,value为新增的空的value
            objectToUpdate.put(keyStr, jsonObject);
            //string 增加_
            currentPath.append(keyStr).append("_");
            loadAndOverrideFromEnvVars(keyvalue, jsonObject, allATDOverrideEnvVars, currentPath);
            currentPath.delete(currentPath.lastIndexOf(keyStr), currentPath.length());
        }
    

      

  • 相关阅读:
    C# 抽象(3)
    C# 抽象(2)
    C# 抽象
    将 varchar 值 'ACCE5057EC423F7C' 转换成数据类型 int 时失败
    处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表
    方法调用 Controller的Action 参数
    A problem has been detected and windows has been shut down to prevent damage to your computer.他么啥意思?看这里!【蓝屏】
    自己搭建了一个简单实用的Web版记事本
    GRPC
    Ocelot Consul
  • 原文地址:https://www.cnblogs.com/zhizhiyin/p/11168757.html
Copyright © 2020-2023  润新知