package com.robotium.solo;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JsonParser {
/**
* Json 转 ArrayList<Params>
* @param json json
* @return .
*/
public static ArrayList<ParamsEntity> fromJson(String json) {
Type jsonType = new TypeToken<ArrayList<ParamsEntity>>() {
}.getType();
Gson gson = new Gson();
return gson.fromJson(json, jsonType);
}
/**
* ArrayList<Params> 转 json
* @param params params
* @return json
*/
private static String toJson(ArrayList<ParamsEntity> params) {
Gson gson = new Gson();
return gson.toJson(params);
}
/**
* ArrayList<Params>去重
* @param params params
* @return .
*/
private static ArrayList<ParamsEntity> removeDuplicate(ArrayList<ParamsEntity> params) {
ArrayList<ParamsEntity> temp = new ArrayList<>();
for (ParamsEntity p : params) {
if (!temp.contains(p)) {
temp.add(p);
}
}
return temp;
}
/**
* 通过检查Activities.txt的最后一个activity与Params.json最后一个activity对比可知是否完成遍历。
* @return isFinish
*/
public static boolean isFinish() {
Log.d(Solo.LOG_TAG, "isFinish()");
String strings = FileUtils.readActivities();
String[] activities = strings.split(System.getProperty("line.separator"));
String json = FileUtils.readJson();
ArrayList<ParamsEntity> arrayList = fromJson(json);
if (arrayList == null || arrayList.size() == 0) return true;
ParamsEntity params = arrayList.get(arrayList.size() - 1);
String lastActivityForJson = params.getName();
String lastActivityForTxt = activities[activities.length - 1];
boolean isStop = lastActivityForTxt.contains("stopped") && lastActivityForTxt.contains(lastActivityForJson);
boolean isStart = lastActivityForTxt.contains("starting") && lastActivityForTxt.contains(lastActivityForJson);
return isStop || !isStart;
}
/**
* 当自动遍历未完成退出时(一般是发生了崩溃)更新Params
*/
public static void updateParams() {
Log.d(Solo.LOG_TAG, "updateParams()");
Log.d(Solo.LOG_TAG, "The iteration is not complete.");
if (!FileUtils.existsJson()) throw new RuntimeException("Params.json Not Found, please check the log.");
String json = FileUtils.readJson();
// 没迭代完成的也是迭代过,没迭代完成的一般是遇到了崩溃
ArrayList<String> iterated = getActivitiesForStart();
for(String s: iterated) {
Log.d(Solo.LOG_TAG, "iterated: " + s);
}
ArrayList<ParamsEntity> arrayList = fromJson(json);
arrayList = removeDuplicate(arrayList);
ArrayList<ParamsEntity> nowParams = removeIteratedActivities(iterated, arrayList);
// 迭代时产生的ActivityParams
ArrayList<ParamsEntity> params = getParams();
params = removeDuplicate(params);
params = removeIteratedActivities(iterated, params);
nowParams.addAll(params);
for (ParamsEntity p: nowParams) {
Log.d(Solo.LOG_TAG, "No iteration Params: " + p.getName());
}
String text = toJson(nowParams);
if (text != null) {
FileUtils.writeJson(text);
}
}
/**
* 为快速模式或正常(迭代)模式创建json
*/
public static void createJson() {
Log.d(Solo.LOG_TAG, "createJson()");
ArrayList<ParamsEntity> params = getParams();
for (ParamsEntity p: params) {
Log.d(Solo.LOG_TAG, "Create Params: " + p.getName());
}
String json = toJson(params);
if (json != null) {
FileUtils.writeJson(json);
}
}
/**
* 爬虫模式时更新json
*/
public static void updateJson() {
Log.d(Solo.LOG_TAG, "updateJson()");
FileUtils.deleteJson();
ArrayList<String> strings = getActivitiesForStop();
ArrayList<ParamsEntity> params = getParams();
params = removeDuplicate(params);
params = removeIteratedActivities(strings, params);
Log.d(Solo.LOG_TAG, "Update Params: >> ");
for (ParamsEntity p: params) {
Log.d(Solo.LOG_TAG, "Update Params: " + p.getName());
}
String text = toJson(params);
if (text != null && text.length() > 100) {
FileUtils.writeJson(text);
}
}
/**
* 移除已经遍历的界面
* @param params params
* @param strings strings 已经遍历的界面
* @return .
*/
private static ArrayList<ParamsEntity> removeIteratedActivities(ArrayList<String> strings, ArrayList<ParamsEntity> params) {
ArrayList<ParamsEntity> temp = new ArrayList<>();
for (ParamsEntity p : params) {
if (!strings.contains(p.getName()))temp.add(p);
}
return temp;
}
/**
* 返回所有启动过的界面
* @return 返回所有启动过的界面
*/
private static ArrayList<String> getActivitiesForStart() {
return getActivities("starting");
}
/**
* 返回所有启动并遍历完成的界面
* @return 返回所有启动并遍历完成的界面
*/
private static ArrayList<String> getActivitiesForStop() {
return getActivities("stopped");
}
/**
* 从Activities.txt文件读取已经启动过的页面
* @param key starting or stopped
* @return .
*/
private static ArrayList<String> getActivities(String key) {
ArrayList<String> list = new ArrayList<>();
String strings = FileUtils.readActivities();
Pattern p;
if (key.contains("stopped")) {
p = Pattern.compile("stopped iteration: ([\\w|.]+)");
} else p = Pattern.compile("starting iteration: ([\\w|.]+)");
Matcher m = p.matcher(strings);
while (m.find()) {
list.add(m.group(1).trim());
}
return list;
}
/**
* 从ActivityParams.txt读取数据生成Params
* @return .
*/
private static ArrayList<ParamsEntity> getParams() {
String[] strings = FileUtils.readParams().split("\\n");
ArrayList<ParamsEntity> list = new ArrayList<>();
ArrayList<ParamEntity> paramArrayList = new ArrayList<>();
String name = "";
boolean isEnd = false;
for (String s: strings) {
if (isEnd) {
isEnd = false;
paramArrayList = new ArrayList<>();
}
if (s.startsWith("Activity:")) {
String[] tmp = s.split("Activity:");
name = tmp[tmp.length - 1].trim();
}
if (s.startsWith("String")) {
String[] tmp = s.split(" ", 4);
ParamEntity param = new ParamEntity();
param.setKey(tmp[0] + "|" + tmp[1]);
if (tmp.length == 3) {
param.setValue(tmp[2] + "|" + "");
} else param.setValue(tmp[2] + "|" + tmp[3].trim());
paramArrayList.add(param);
}
if (s.startsWith("Tag")) {
if (!name.equals("")) {
ParamsEntity params = new ParamsEntity();
params.setName(name);
params.setWeb(false);
params.setParams(paramArrayList);
params.setIteration(true);
list.add(params);
isEnd = true;
}
}
}
FileUtils.deleteParams();
return list;
}
private static StringBuilder read(String path) {
File file = new File(path);
StringBuilder sb = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line;
while ((line = bufferedReader.readLine()) != null) {
sb.append(line).append(System.getProperty("line.separator"));
}
} catch (IOException e) {
e.printStackTrace();
}
return sb;
}
}