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());
}
TODO:AppiumTestDistribution--CapabilityManager 类的更多相关文章
- 【Todo】Java类面试题分析
Java 面试中的重要话题 多线程,并发及线程基础数据类型转换的基本原则垃圾回收(GC)Java 集合框架数组字符串GOF 设计模式SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)设 ...
- 【Todo】C++类 & 通用面试题分析记录 & 最难的bug
1. the most difficult bug u fixed and how u solved this problem.. 解决过很多疑难bug.最困难的分为两类.一类是并发.多线程类的,因为 ...
- C# 使用IComparer自定义List类的排序方案
List类中不带参数的Sort函数可以用来为List类中的元素排序,但如果List类中的元素类型本身不能直接进行比较(如自定义的struct和很多class),或是希望采用更加灵活的自定义比较方式,可 ...
- 使用SQLiteOpenHelper类对数据库简单操作
实现数据库基本操作 数据库创建的问题解决了,接下来就该使用数据库实现应用程序功能的时候了.基本的操作包括创建.读取.更新.删除,即我们通常说的CRUD(Create, Read, Upda ...
- jeecg中的一个上下文工具类获取request,session
通过调用其中的方法可以获取到request和session,调用方式如下: HttpServletRequest request = ContextHolderUtils.getRequest();H ...
- C#学习笔记(14)——C# 使用IComparer自定义List类的排序方案
说明(2017-7-17 21:34:59): 原文:https://my.oschina.net/Tsybius2014/blog/298702?p=1 另一篇比较好的:https://wenku. ...
- json 工具处理类
package com.js.ai.modules.pointwall.util; import java.lang.reflect.Type; import java.net.URLDecoder; ...
- Scala类和对象(二)
1. 类和属性 1.1 如何控制构造函数字段的可见性 在Scala中: 如果一个字段被声明为var, Scala会为该字段生成getter和setter方法. 如果字段是val, Scala只生成ge ...
- Collections集合工具类常用的方法
java.utils.Collections //是集合工具类,用来对集合进行操作.部分方法如下: public static <T> boolean addAll(Collection& ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
随机推荐
- 论文阅读 | Transformer-XL: Attentive Language Models beyond a Fixed-Length Context
0 简述 Transformer最大的问题:在语言建模时的设置受到固定长度上下文的限制. 本文提出的Transformer-XL,使学习不再仅仅依赖于定长,且不破坏时间的相关性. Transforme ...
- selenium + python 环境配置 (一)
超级无敌菜鸟 终于有空学习一下python 和 selenium 啦 第一步: 环境配置 (Windows版) 1. 下载安装python 根据你的电脑,下载一个python吧 这儿装的是pyt ...
- [官网]Postgresql 的客户端应用 pg_config
pg_config Name pg_config -- 检索已安装版本的 PostgreSQL 的信息 Synopsis pg_config {--bindir | --includedir | -- ...
- SrpingBoot入门到入坟02-HelloWorld的细节和初始自动配置
关于SpringBoot的第一个HelloWorld的一些细节: 1.父项目 首先查看项目中的pom.xml文件 文件中有个父项目,点进去则: 它里面也有一个父项目,再点进去: 可以发现有很多的依赖版 ...
- (十二)Sun公司的Jstl标签库详细介绍
JSP 本身提供的标签很少,不能满足我们日常开发需要,好在 Sun 公司自己提供了一套标签库: JSTL标签库快速入门(可点击) 目录 < c : out > 标签 < c : se ...
- phpstrom
在phpstrom 中启用composer 步骤: 1.打开编辑器,选择 文件(file)->设置(setting),找到 Command Line Tool Support ,点击 + 号进行 ...
- Hibernate之关联关系(一对多)
今日分享hibernate框架的简单关联关系 一:关联关系简介 1.1 什么是关联关系 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性. 例如: class B{ ...
- Ubuntu 搭建 配置 nfs服务器
什么是NFS? NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NF ...
- css之实现下拉框自上而下展开动画效果&&自下而上收起动画效果
HTML代码: <div className={CX('font-size-selector-sub-list', { show: shouldSubListShow === true, hid ...
- 2019牛客多校三 A. Graph Games (图分块)
大意: 给定无向图, 定义$S(x)$为$x$的邻接点集合. 每次操作翻转$[L,R]$范围的边, 询问$S(x)$与$S(y)$是否相等. 快速判断集合相等可以用$CF 799F$的技巧. 采用$h ...