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());
    }

  

posted @ 2019-07-11 11:07  头鹰在学习  阅读(323)  评论(0编辑  收藏  举报