package org.skywalking.apm.collector.worker.segment.entity;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author pengys5
*/
public class Span extends DeserializeObject {
private int spanId;
private int parentSpanId;
private long startTime;
private long endTime;
private String operationName;
private Map<String, String> tagsWithStr;
private Map<String, Boolean> tagsWithBool;
private Map<String, Integer> tagsWithInt;
private List<LogData> logs;
public int getSpanId() {
return spanId;
}
public int getParentSpanId() {
return parentSpanId;
}
public long getStartTime() {
return startTime;
}
public long getEndTime() {
return endTime;
}
public String getOperationName() {
return operationName;
}
public String getStrTag(String key) {
return tagsWithStr.get(key);
}
public Boolean getBoolTag(String key) {
return tagsWithBool.get(key);
}
public Integer getIntTag(String key) {
return tagsWithInt.get(key);
}
public List<LogData> getLogs() {
return logs;
}
public Span deserialize(JsonReader reader) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("{");
boolean first = true;
reader.beginObject();
while (reader.hasNext()) {
switch (reader.nextName()) {
case "si":
Integer si = reader.nextInt();
this.spanId = si;
JsonBuilder.INSTANCE.append(stringBuilder, "si", si, first);
break;
case "ps":
Integer ps = reader.nextInt();
this.parentSpanId = ps;
JsonBuilder.INSTANCE.append(stringBuilder, "ps", ps, first);
break;
case "st":
Long st = reader.nextLong();
this.startTime = st;
JsonBuilder.INSTANCE.append(stringBuilder, "st", st, first);
break;
case "et":
Long et = reader.nextLong();
this.endTime = et;
JsonBuilder.INSTANCE.append(stringBuilder, "et", et, first);
break;
case "on":
String on = reader.nextString();
this.operationName = on;
JsonBuilder.INSTANCE.append(stringBuilder, "on", on, first);
break;
case "ts":
tagsWithStr = new HashMap<>();
reader.beginObject();
while (reader.hasNext()) {
String key = reader.nextName();
String value = reader.nextString();
tagsWithStr.put(key, value);
}
reader.endObject();
JsonBuilder.INSTANCE.append(stringBuilder, "ts", tagsWithStr, first);
break;
case "tb":
tagsWithBool = new HashMap<>();
reader.beginObject();
while (reader.hasNext()) {
String key = reader.nextName();
boolean value = reader.nextBoolean();
tagsWithBool.put(key, value);
}
reader.endObject();
JsonBuilder.INSTANCE.append(stringBuilder, "tb", tagsWithBool, first);
break;
case "ti":
tagsWithInt = new HashMap<>();
reader.beginObject();
while (reader.hasNext()) {
String key = reader.nextName();
Integer value = reader.nextInt();
tagsWithInt.put(key, value);
}
reader.endObject();
JsonBuilder.INSTANCE.append(stringBuilder, "ti", tagsWithInt, first);
break;
case "lo":
logs = new ArrayList<>();
reader.beginArray();
while (reader.hasNext()) {
LogData logData = new LogData();
logData.deserialize(reader);
logs.add(logData);
}
reader.endArray();
JsonBuilder.INSTANCE.append(stringBuilder, "lo", logs, first);
break;
default:
reader.skipValue();
}
first = false;
}
reader.endObject();
stringBuilder.append("}");
this.setJsonStr(stringBuilder.toString());
return this;
}
}