该类代码详见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()); }