package org.robolectric.annotation.processing.generator;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.robolectric.annotation.processing.DocumentedPackage;
import org.robolectric.annotation.processing.DocumentedType;
import org.robolectric.annotation.processing.RobolectricModel;
import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class JavadocJsonGenerator extends Generator {
private final RobolectricModel model;
private final Messager messager;
private final Gson gson;
public JavadocJsonGenerator(RobolectricModel model, ProcessingEnvironment environment) {
super();
this.model = model;
this.messager = environment.getMessager();
gson = new GsonBuilder()
.setPrettyPrinting()
.create();
}
@Override
public void generate() {
Map<String, String> shadowedTypes = new HashMap<>();
for (Map.Entry<TypeElement, TypeElement> entry : model.getShadowOfMap().entrySet()) {
String shadowType = entry.getKey().getQualifiedName().toString();
String shadowedType = entry.getValue().getQualifiedName().toString();
shadowedTypes.put(shadowType, shadowedType);
}
for (Map.Entry<String, String> entry : model.getExtraShadowTypes().entrySet()) {
String shadowType = entry.getKey();
String shadowedType = entry.getValue();
shadowedTypes.put(shadowType, shadowedType);
}
File docs = new File("build/docs/json");
for (DocumentedPackage documentedPackage : model.getDocumentedPackages()) {
for (DocumentedType documentedType : documentedPackage.getDocumentedTypes()) {
String shadowedType = shadowedTypes.get(documentedType.getName());
writeJson(documentedType, new File(docs, shadowedType + ".json"));
}
}
}
private void writeJson(Object object, File file) {
file.getParentFile().mkdirs();
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
gson.toJson(object, writer);
} catch (IOException e) {
messager.printMessage(Diagnostic.Kind.ERROR, "Failed to write javadoc JSON file: " + e);
throw new RuntimeException(e);
}
}
}