package net.thucydides.core.reports.json;
import com.google.common.base.Optional;
import com.google.gson.*;
import net.thucydides.core.annotations.TestAnnotations;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
class ClassTypeAdapter implements JsonSerializer<Class<?>>, JsonDeserializer<Class<?>> {
private static final Logger LOGGER = LoggerFactory.getLogger(ClassTypeAdapter.class);
private static final String ISSUES = "issues";
private static final String CLASSNAME = "classname";
@Override
public JsonElement serialize(Class<?> src,
java.lang.reflect.Type typeOfSrc,
JsonSerializationContext context) {
JsonObject jsonObject = new JsonObject();
jsonObject.add(CLASSNAME, new JsonPrimitive(src.getName()));
JsonArray issuesJsonArray = new JsonArray();
TestAnnotations testAnnotationsForClass = TestAnnotations.forClass(src);
String[] annotatedIssuesForTestCase = testAnnotationsForClass.getAnnotatedIssuesForTestCase(src);
addIssuesToCollectingJsonArray(issuesJsonArray, annotatedIssuesForTestCase);
String annotatedIssueForTestCase = testAnnotationsForClass.getAnnotatedIssueForTestCase(src);
if (annotatedIssueForTestCase != null) {
issuesJsonArray.add(new JsonPrimitive(annotatedIssueForTestCase));
}
for (Method currentMethod : src.getMethods()) {
String[] annotatedIssuesForMethod = testAnnotationsForClass
.getAnnotatedIssuesForMethod(currentMethod.getName());
addIssuesToCollectingJsonArray(issuesJsonArray,
annotatedIssuesForMethod);
Optional<String> annotatedIssueForMethod = testAnnotationsForClass
.getAnnotatedIssueForMethod(currentMethod.getName());
if (annotatedIssueForMethod.isPresent()) {
issuesJsonArray.add(new JsonPrimitive(
annotatedIssueForMethod.get()));
}
}
if (issuesJsonArray.size() > 0) {
jsonObject.add(ISSUES, issuesJsonArray);
}
return jsonObject;
}
private void addIssuesToCollectingJsonArray(JsonArray issuesJsonArray,
String[] issues) {
if (issues != null) {
for (String issue : issues) {
issuesJsonArray.add(new JsonPrimitive(issue));
}
}
}
@Override
public Class<?> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
try {
return Class.forName(jsonObject.get(CLASSNAME).getAsString());
} catch (ClassNotFoundException e) {
return null;
}
}
}